pyparsing-2.0.3/0000775000175000017500000000000012416136733012560 5ustar barrybarrypyparsing-2.0.3/PKG-INFO0000664000175000017500000000174212416136733013661 0ustar barrybarryMetadata-Version: 1.0 Name: pyparsing Version: 2.0.3 Summary: Python parsing module Home-page: http://pyparsing.wikispaces.com/ Author: Paul McGuire Author-email: ptmcg@users.sourceforge.net License: MIT License Download-URL: http://sourceforge.net/project/showfiles.php?group_id=97203 Description: UNKNOWN Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Information Technology Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.0 Classifier: Programming Language :: Python :: 3.1 Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 pyparsing-2.0.3/README0000664000175000017500000000363310311447564013444 0ustar barrybarry==================================== PyParsing -- A Python Parsing Module ==================================== Introduction ============ The pyparsing module is an alternative approach to creating and executing simple grammars, vs. the traditional lex/yacc approach, or the use of regular expressions. The pyparsing module provides a library of classes that client code uses to construct the grammar directly in Python code. Here is a program to parse "Hello, World!" (or any greeting of the form ", !"): from pyparsing import Word, alphas greet = Word( alphas ) + "," + Word( alphas ) + "!" hello = "Hello, World!" print hello, "->", greet.parseString( hello ) The program outputs the following: Hello, World! -> ['Hello', ',', 'World', '!'] The Python representation of the grammar is quite readable, owing to the self-explanatory class names, and the use of '+', '|' and '^' operator definitions. The parsed results returned from parseString() can be accessed as a nested list, a dictionary, or an object with named attributes. The pyparsing module handles some of the problems that are typically vexing when writing text parsers: - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) - quoted strings - embedded comments The .zip file includes examples of a simple SQL parser, simple CORBA IDL parser, a config file parser, a chemical formula parser, and a four- function algebraic notation parser. It also includes a simple how-to document, and a UML class diagram of the library's classes. Installation ============ Do the usual: python setup.py install (pyparsing requires Python 2.3.2 or later.) Documentation ============= See: HowToUsePyparsing.html License ======= MIT License. See header of pyparsing.py History ======= See CHANGES file. pyparsing-2.0.3/CHANGES0000664000175000017500000022711112373564675013573 0ustar barrybarry========== Change Log ========== Version 2.0.3 - --------------------------- - Fixed escaping behavior in QuotedString. Formerly, only quotation marks (or characters designated as quotation marks in the QuotedString constructor) would be escaped. Now all escaped characters will be escaped, and the escaping backslashes will be removed. - Fixed regression in ParseResults.pop() - pop() was pretty much broken after I added *improvements* in 2.0.2. Reported by Iain Shelvington, thanks Iain! - Fixed bug in And class when initializing using a generator. - Enhanced ParseResults.dump() method to list out nested ParseResults that are unnamed arrays of sub-structures. - Fixed UnboundLocalError under Python 3.4 in oneOf method, reported on Sourceforge by aldanor, thanks! - Fixed bug in ParseResults __init__ method, when returning non-ParseResults types from parse actions that implement __eq__. Raised during discussion on the pyparsing wiki with cyrfer. Version 2.0.2 - April, 2014 --------------------------- - Extended "expr(name)" shortcut (same as "expr.setResultsName(name)") to accept "expr()" as a shortcut for "expr.copy()". - Added "locatedExpr(expr)" helper, to decorate any returned tokens with their location within the input string. Adds the results names locn_start and locn_end to the output parse results. - Added "pprint()" method to ParseResults, to simplify troubleshooting and prettified output. Now instead of importing the pprint module and then writing "pprint.pprint(result)", you can just write "result.pprint()". This method also accepts addtional positional and keyword arguments (such as indent, width, etc.), which get passed through directly to the pprint method (see http://docs.python.org/2/library/pprint.html#pprint.pprint). - Removed deprecation warnings when using '<<' for Forward expression assignment. '<<=' is still preferred, but '<<' will be retained for cases whre '<<=' operator is not suitable (such as in defining lambda expressions). - Expanded argument compatibility for classes and functions that take list arguments, to now accept generators as well. - Extended list-like behavior of ParseResults, adding support for append and extend. NOTE: if you have existing applications using these names as results names, you will have to access them using dict-style syntax: res["append"] and res["extend"] - ParseResults emulates the change in list vs. iterator semantics for methods like keys(), values(), and items(). Under Python 2.x, these methods will return lists, under Python 3.x, these methods will return iterators. - ParseResults now has a method haskeys() which returns True or False depending on whether any results names have been defined. This simplifies testing for the existence of results names under Python 3.x, which returns keys() as an iterator, not a list. - ParseResults now supports both list and dict semantics for pop(). If passed no argument or an integer argument, it will use list semantics and pop tokens from the list of parsed tokens. If passed a non-integer argument (most likely a string), it will use dict semantics and pop the corresponding value from any defined results names. A second default return value argument is supported, just as in dict.pop(). - Fixed bug in markInputline, thanks for reporting this, Matt Grant! - Cleaned up my unit test environment, now runs with Python 2.6 and 3.3. Version 2.0.1 - July, 2013 -------------------------- - Removed use of "nonlocal" that prevented using this version of pyparsing with Python 2.6 and 2.7. This will make it easier to install for packages that depend on pyparsing, under Python versions 2.6 and later. Those using older versions of Python will have to manually install pyparsing 1.5.7. - Fixed implementation of <<= operator to return self; reported by Luc J. Bourhis, with patch fix by Mathias Mamsch - thanks, Luc and Mathias! Version 2.0.0 - November, 2012 ------------------------------ - Rather than release another combined Python 2.x/3.x release I've decided to start a new major version that is only compatible with Python 3.x (and consequently Python 2.7 as well due to backporting of key features). This version will be the main development path from now on, with little follow-on development on the 1.5.x path. - Operator '<<' is now deprecated, in favor of operator '<<=' for attaching parsing expressions to Forward() expressions. This is being done to address precedence of operations problems with '<<'. Operator '<<' will be removed in a future version of pyparsing. Version 1.5.7 - November, 2012 ----------------------------- - NOTE: This is the last release of pyparsing that will try to maintain compatibility with Python versions < 2.6. The next release of pyparsing will be version 2.0.0, using new Python syntax that will not be compatible for Python version 2.5 or older. - An awesome new example is included in this release, submitted by Luca DellOlio, for parsing ANTLR grammar definitions, nice work Luca! - Fixed implementation of ParseResults.__str__ to use Pythonic ''.join() instead of repeated string concatenation. This purportedly has been a performance issue under PyPy. - Fixed bug in ParseResults.__dir__ under Python 3, reported by Thomas Kluyver, thank you Thomas! - Added ParserElement.inlineLiteralsUsing static method, to override pyparsing's default behavior of converting string literals to Literal instances, to use other classes (such as Suppress or CaselessLiteral). - Added new operator '<<=', which will eventually replace '<<' for storing the contents of a Forward(). '<<=' does not have the same operator precedence problems that '<<' does. - 'operatorPrecedence' is being renamed 'infixNotation' as a better description of what this helper function creates. 'operatorPrecedence' is deprecated, and will be dropped entirely in a future release. - Added optional arguments lpar and rpar to operatorPrecedence, so that expressions that use it can override the default suppression of the grouping characters. - Added support for using single argument builtin functions as parse actions. Now you can write 'expr.setParseAction(len)' and get back the length of the list of matched tokens. Supported builtins are: sum, len, sorted, reversed, list, tuple, set, any, all, min, and max. A script demonstrating this feature is included in the examples directory. - Improved linking in generated docs, proposed on the pyparsing wiki by techtonik, thanks! - Fixed a bug in the definition of 'alphas', which was based on the string.uppercase and string.lowercase "constants", which in fact *aren't* constant, but vary with locale settings. This could make parsers locale-sensitive in a subtle way. Thanks to Kef Schecter for his diligence in following through on reporting and monitoring this bugfix! - Fixed a bug in the Py3 version of pyparsing, during exception handling with packrat parsing enabled, reported by Catherine Devlin - thanks Catherine! - Fixed typo in ParseBaseException.__dir__, reported anonymously on the SourceForge bug tracker, thank you Pyparsing User With No Name. - Fixed bug in srange when using '\x###' hex character codes. - Addeed optional 'intExpr' argument to countedArray, so that you can define your own expression that will evaluate to an integer, to be used as the count for the following elements. Allows you to define a countedArray with the count given in hex, for example, by defining intExpr as "Word(hexnums).setParseAction(int(t[0],16))". Version 1.5.6 - June, 2011 ---------------------------- - Cleanup of parse action normalizing code, to be more version-tolerant, and robust in the face of future Python versions - much thanks to Raymond Hettinger for this rewrite! - Removal of exception cacheing, addressing a memory leak condition in Python 3. Thanks to Michael Droettboom and the Cape Town PUG for their analysis and work on this problem! - Fixed bug when using packrat parsing, where a previously parsed expression would duplicate subsequent tokens - reported by Frankie Ribery on stackoverflow, thanks! - Added 'ungroup' helper method, to address token grouping done implicitly by And expressions, even if only one expression in the And actually returns any text - also inspired by stackoverflow discussion with Frankie Ribery! - Fixed bug in srange, which accepted escaped hex characters of the form '\0x##', but should be '\x##'. Both forms will be supported for backwards compatibility. - Enhancement to countedArray, accepting an optional expression to be used for matching the leading integer count - proposed by Mathias on the pyparsing mailing list, good idea! - Added the Verilog parser to the provided set of examples, under the MIT license. While this frees up this parser for any use, if you find yourself using it in a commercial purpose, please consider making a charitable donation as described in the parser's header. - Added the excludeChars argument to the Word class, to simplify defining a word composed of all characters in a large range except for one or two. Suggested by JesterEE on the pyparsing wiki. - Added optional overlap parameter to scanString, to return overlapping matches found in the source text. - Updated oneOf internal regular expression generation, with improved parse time performance. - Slight performance improvement in transformString, removing empty strings from the list of string fragments built while scanning the source text, before calling ''.join. Especially useful when using transformString to strip out selected text. - Enhanced form of using the "expr('name')" style of results naming, in lieu of calling setResultsName. If name ends with an '*', then this is equivalent to expr.setResultsName('name',listAllMatches=True). - Fixed up internal list flattener to use iteration instead of recursion, to avoid stack overflow when transforming large files. - Added other new examples: . protobuf parser - parses Google's protobuf language . btpyparse - a BibTex parser contributed by Matthew Brett, with test suite test_bibparse.py (thanks, Matthew!) . groupUsingListAllMatches.py - demo using trailing '*' for results names Version 1.5.5 - August, 2010 ---------------------------- - Typo in Python3 version of pyparsing, "builtin" should be "builtins". (sigh) Version 1.5.4 - August, 2010 ---------------------------- - Fixed __builtins__ and file references in Python 3 code, thanks to Greg Watson, saulspatz, sminos, and Mark Summerfield for reporting their Python 3 experiences. - Added new example, apicheck.py, as a sample of scanning a Tcl-like language for functions with incorrect number of arguments (difficult to track down in Tcl languages). This example uses some interesting methods for capturing exceptions while scanning through source code. - Added new example deltaTime.py, that takes everyday time references like "an hour from now", "2 days ago", "next Sunday at 2pm". Version 1.5.3 - June, 2010 -------------------------- - ======= NOTE: API CHANGE!!!!!!! =============== With this release, and henceforward, the pyparsing module is imported as "pyparsing" on both Python 2.x and Python 3.x versions. - Fixed up setup.py to auto-detect Python version and install the correct version of pyparsing - suggested by Alex Martelli, thanks, Alex! (and my apologies to all those who struggled with those spurious installation errors caused by my earlier fumblings!) - Fixed bug on Python3 when using parseFile, getting bytes instead of a str from the input file. - Fixed subtle bug in originalTextFor, if followed by significant whitespace (like a newline) - discovered by Francis Vidal, thanks! - Fixed very sneaky bug in Each, in which Optional elements were not completely recognized as optional - found by Tal Weiss, thanks for your patience. - Fixed off-by-1 bug in line() method when the first line of the input text was an empty line. Thanks to John Krukoff for submitting a patch! - Fixed bug in transformString if grammar contains Group expressions, thanks to patch submitted by barnabas79, nice work! - Fixed bug in originalTextFor in which trailing comments or otherwised ignored text got slurped in with the matched expression. Thanks to michael_ramirez44 on the pyparsing wiki for reporting this just in time to get into this release! - Added better support for summing ParseResults, see the new example, parseResultsSumExample.py. - Added support for composing a Regex using a compiled RE object; thanks to my new colleague, Mike Thornton! - In version 1.5.2, I changed the way exceptions are raised in order to simplify the stacktraces reported during parsing. An anonymous user posted a bug report on SF that this behavior makes it difficult to debug some complex parsers, or parsers nested within parsers. In this release I've added a class attribute ParserElement.verbose_stacktrace, with a default value of False. If you set this to True, pyparsing will report stacktraces using the pre-1.5.2 behavior. - New examples: . pymicko.py, a MicroC compiler submitted by Zarko Zivanov. (Note: this example is separately licensed under the GPLv3, and requires Python 2.6 or higher.) Thank you, Zarko! . oc.py, a subset C parser, using the BNF from the 1996 Obfuscated C Contest. . stateMachine2.py, a modified version of stateMachine.py submitted by Matt Anderson, that is compatible with Python versions 2.7 and above - thanks so much, Matt! . select_parser.py, a parser for reading SQLite SELECT statements, as specified at http://www.sqlite.org/lang_select.html; this goes into much more detail than the simple SQL parser included in pyparsing's source code . excelExpr.py, a *simplistic* first-cut at a parser for Excel expressions, which I originally posted on comp.lang.python in January, 2010; beware, this parser omits many common Excel cases (addition of numbers represented as strings, references to named ranges) . cpp_enum_parser.py, a nice little parser posted my Mark Tolonen on comp.lang.python in August, 2009 (redistributed here with Mark's permission). Thanks a bunch, Mark! . partial_gene_match.py, a sample I posted to Stackoverflow.com, implementing a special variation on Literal that does "close" matching, up to a given number of allowed mismatches. The application was to find matching gene sequences, with allowance for one or two mismatches. . tagCapture.py, a sample showing how to use a Forward placeholder to enforce matching of text parsed in a previous expression. . matchPreviousDemo.py, simple demo showing how the matchPreviousLiteral helper method is used to match a previously parsed token. Version 1.5.2 - April, 2009 ------------------------------ - Added pyparsing_py3.py module, so that Python 3 users can use pyparsing by changing their pyparsing import statement to: import pyparsing_py3 Thanks for help from Patrick Laban and his friend Geremy Condra on the pyparsing wiki. - Removed __slots__ declaration on ParseBaseException, for compatibility with IronPython 2.0.1. Raised by David Lawler on the pyparsing wiki, thanks David! - Fixed bug in SkipTo/failOn handling - caught by eagle eye cpennington on the pyparsing wiki! - Fixed second bug in SkipTo when using the ignore constructor argument, reported by Catherine Devlin, thanks! - Fixed obscure bug reported by Eike Welk when using a class as a ParseAction with an errant __getitem__ method. - Simplified exception stack traces when reporting parse exceptions back to caller of parseString or parseFile - thanks to a tip from Peter Otten on comp.lang.python. - Changed behavior of scanString to avoid infinitely looping on expressions that match zero-length strings. Prompted by a question posted by ellisonbg on the wiki. - Enhanced classes that take a list of expressions (And, Or, MatchFirst, and Each) to accept generator expressions also. This can be useful when generating lists of alternative expressions, as in this case, where the user wanted to match any repetitions of '+', '*', '#', or '.', but not mixtures of them (that is, match '+++', but not '+-+'): codes = "+*#." format = MatchFirst(Word(c) for c in codes) Based on a problem posed by Denis Spir on the Python tutor list. - Added new example eval_arith.py, which extends the example simpleArith.py to actually evaluate the parsed expressions. Version 1.5.1 - October, 2008 ------------------------------- - Added new helper method originalTextFor, to replace the use of the current keepOriginalText parse action. Now instead of using the parse action, as in: fullName = Word(alphas) + Word(alphas) fullName.setParseAction(keepOriginalText) (in this example, we used keepOriginalText to restore any white space that may have been skipped between the first and last names) You can now write: fullName = originalTextFor(Word(alphas) + Word(alphas)) The implementation of originalTextFor is simpler and faster than keepOriginalText, and does not depend on using the inspect or imp modules. - Added optional parseAll argument to parseFile, to be consistent with parseAll argument to parseString. Posted by pboucher on the pyparsing wiki, thanks! - Added failOn argument to SkipTo, so that grammars can define literal strings or pyparsing expressions which, if found in the skipped text, will cause SkipTo to fail. Useful to prevent SkipTo from reading past terminating expression. Instigated by question posed by Aki Niimura on the pyparsing wiki. - Fixed bug in nestedExpr if multi-character expressions are given for nesting delimiters. Patch provided by new pyparsing user, Hans-Martin Gaudecker - thanks, H-M! - Removed dependency on xml.sax.saxutils.escape, and included internal implementation instead - proposed by Mike Droettboom on the pyparsing mailing list, thanks Mike! Also fixed erroneous mapping in replaceHTMLEntity of " to ', now correctly maps to ". (Also added support for mapping ' to '.) - Fixed typo in ParseResults.insert, found by Alejandro Dubrovsky, good catch! - Added __dir__() methods to ParseBaseException and ParseResults, to support new dir() behavior in Py2.6 and Py3.0. If dir() is called on a ParseResults object, the returned list will include the base set of attribute names, plus any results names that are defined. - Fixed bug in ParseResults.asXML(), in which the first named item within a ParseResults gets reported with an tag instead of with the correct results name. - Fixed bug in '-' error stop, when '-' operator is used inside a Combine expression. - Reverted generator expression to use list comprehension, for better compatibility with old versions of Python. Reported by jester/artixdesign on the SourceForge pyparsing discussion list. - Fixed bug in parseString(parseAll=True), when the input string ends with a comment or whitespace. - Fixed bug in LineStart and LineEnd that did not recognize any special whitespace chars defined using ParserElement.setDefault- WhitespaceChars, found while debugging an issue for Marek Kubica, thanks for the new test case, Marek! - Made Forward class more tolerant of subclassing. Version 1.5.0 - June, 2008 -------------------------- This version of pyparsing includes work on two long-standing FAQ's: support for forcing parsing of the complete input string (without having to explicitly append StringEnd() to the grammar), and a method to improve the mechanism of detecting where syntax errors occur in an input string with various optional and alternative paths. This release also includes a helper method to simplify definition of indentation-based grammars. With these changes (and the past few minor updates), I thought it was finally time to bump the minor rev number on pyparsing - so 1.5.0 is now available! Read on... - AT LAST!!! You can now call parseString and have it raise an exception if the expression does not parse the entire input string. This has been an FAQ for a LONG time. The parseString method now includes an optional parseAll argument (default=False). If parseAll is set to True, then the given parse expression must parse the entire input string. (This is equivalent to adding StringEnd() to the end of the expression.) The default value is False to retain backward compatibility. Inspired by MANY requests over the years, most recently by ecir-hana on the pyparsing wiki! - Added new operator '-' for composing grammar sequences. '-' behaves just like '+' in creating And expressions, but '-' is used to mark grammar structures that should stop parsing immediately and report a syntax error, rather than just backtracking to the last successful parse and trying another alternative. For instance, running the following code: port_definition = Keyword("port") + '=' + Word(nums) entity_definition = Keyword("entity") + "{" + Optional(port_definition) + "}" entity_definition.parseString("entity { port 100 }") pyparsing fails to detect the missing '=' in the port definition. But, since this expression is optional, pyparsing then proceeds to try to match the closing '}' of the entity_definition. Not finding it, pyparsing reports that there was no '}' after the '{' character. Instead, we would like pyparsing to parse the 'port' keyword, and if not followed by an equals sign and an integer, to signal this as a syntax error. This can now be done simply by changing the port_definition to: port_definition = Keyword("port") - '=' + Word(nums) Now after successfully parsing 'port', pyparsing must also find an equals sign and an integer, or it will raise a fatal syntax exception. By judicious insertion of '-' operators, a pyparsing developer can have their grammar report much more informative syntax error messages. Patches and suggestions proposed by several contributors on the pyparsing mailing list and wiki - special thanks to Eike Welk and Thomas/Poldy on the pyparsing wiki! - Added indentedBlock helper method, to encapsulate the parse actions and indentation stack management needed to keep track of indentation levels. Use indentedBlock to define grammars for indentation-based grouping grammars, like Python's. indentedBlock takes up to 3 parameters: - blockStatementExpr - expression defining syntax of statement that is repeated within the indented block - indentStack - list created by caller to manage indentation stack (multiple indentedBlock expressions within a single grammar should share a common indentStack) - indent - boolean indicating whether block must be indented beyond the the current level; set to False for block of left-most statements (default=True) A valid block must contain at least one indented statement. - Fixed bug in nestedExpr in which ignored expressions needed to be set off with whitespace. Reported by Stefaan Himpe, nice catch! - Expanded multiplication of an expression by a tuple, to accept tuple values of None: . expr*(n,None) or expr*(n,) is equivalent to expr*n + ZeroOrMore(expr) (read as "at least n instances of expr") . expr*(None,n) is equivalent to expr*(0,n) (read as "0 to n instances of expr") . expr*(None,None) is equivalent to ZeroOrMore(expr) . expr*(1,None) is equivalent to OneOrMore(expr) Note that expr*(None,n) does not raise an exception if more than n exprs exist in the input stream; that is, expr*(None,n) does not enforce a maximum number of expr occurrences. If this behavior is desired, then write expr*(None,n) + ~expr - Added None as a possible operator for operatorPrecedence. None signifies "no operator", as in multiplying m times x in "y=mx+b". - Fixed bug in Each, reported by Michael Ramirez, in which the order of terms in the Each affected the parsing of the results. Problem was due to premature grouping of the expressions in the overall Each during grammar construction, before the complete Each was defined. Thanks, Michael! - Also fixed bug in Each in which Optional's with default values were not getting the defaults added to the results of the overall Each expression. - Fixed a bug in Optional in which results names were not assigned if a default value was supplied. - Cleaned up Py3K compatibility statements, including exception construction statements, and better equivalence between _ustr and basestring, and __nonzero__ and __bool__. Version 1.4.11 - February, 2008 ------------------------------- - With help from Robert A. Clark, this version of pyparsing is compatible with Python 3.0a3. Thanks for the help, Robert! - Added WordStart and WordEnd positional classes, to support expressions that must occur at the start or end of a word. Proposed by piranha on the pyparsing wiki, good idea! - Added matchOnlyAtCol helper parser action, to simplify parsing log or data files that have optional fields that are column dependent. Inspired by a discussion thread with hubritic on comp.lang.python. - Added withAttribute.ANY_VALUE as a match-all value when using withAttribute. Used to ensure that an attribute is present, without having to match on the actual attribute value. - Added get() method to ParseResults, similar to dict.get(). Suggested by new pyparsing user, Alejandro Dubrovksy, thanks! - Added '==' short-cut to see if a given string matches a pyparsing expression. For instance, you can now write: integer = Word(nums) if "123" == integer: # do something print [ x for x in "123 234 asld".split() if x==integer ] # prints ['123', '234'] - Simplified the use of nestedExpr when using an expression for the opening or closing delimiters. Now the content expression will not have to explicitly negate closing delimiters. Found while working with dfinnie on GHOP Task #277, thanks! - Fixed bug when defining ignorable expressions that are later enclosed in a wrapper expression (such as ZeroOrMore, OneOrMore, etc.) - found while working with Prabhu Gurumurthy, thanks Prahbu! - Fixed bug in withAttribute in which keys were automatically converted to lowercase, making it impossible to match XML attributes with uppercase characters in them. Using with- Attribute requires that you reference attributes in all lowercase if parsing HTML, and in correct case when parsing XML. - Changed '<<' operator on Forward to return None, since this is really used as a pseudo-assignment operator, not as a left-shift operator. By returning None, it is easier to catch faulty statements such as a << b | c, where precedence of operations causes the '|' operation to be performed *after* inserting b into a, so no alternation is actually implemented. The correct form is a << (b | c). With this change, an error will be reported instead of silently clipping the alternative term. (Note: this may break some existing code, but if it does, the code had a silent bug in it anyway.) Proposed by wcbarksdale on the pyparsing wiki, thanks! - Several unit tests were added to pyparsing's regression suite, courtesy of the Google Highly-Open Participation Contest. Thanks to all who administered and took part in this event! Version 1.4.10 - December 9, 2007 --------------------------------- - Fixed bug introduced in v1.4.8, parse actions were called for intermediate operator levels, not just the deepest matching operation level. Again, big thanks to Torsten Marek for helping isolate this problem! Version 1.4.9 - December 8, 2007 -------------------------------- - Added '*' multiplication operator support when creating grammars, accepting either an integer, or a two-integer tuple multiplier, as in: ipAddress = Word(nums) + ('.'+Word(nums))*3 usPhoneNumber = Word(nums) + ('-'+Word(nums))*(1,2) If multiplying by a tuple, the two integer values represent min and max multiples. Suggested by Vincent of eToy.com, great idea, Vincent! - Fixed bug in nestedExpr, original version was overly greedy! Thanks to Michael Ramirez for raising this issue. - Fixed internal bug in ParseResults - when an item was deleted, the key indices were not updated. Thanks to Tim Mitchell for posting a bugfix patch to the SF bug tracking system! - Fixed internal bug in operatorPrecedence - when the results of a right-associative term were sent to a parse action, the wrong tokens were sent. Reported by Torsten Marek, nice job! - Added pop() method to ParseResults. If pop is called with an integer or with no arguments, it will use list semantics and update the ParseResults' list of tokens. If pop is called with a non-integer (a string, for instance), then it will use dict semantics and update the ParseResults' internal dict. Suggested by Donn Ingle, thanks Donn! - Fixed quoted string built-ins to accept '\xHH' hex characters within the string. Version 1.4.8 - October, 2007 ----------------------------- - Added new helper method nestedExpr to easily create expressions that parse lists of data in nested parentheses, braces, brackets, etc. - Added withAttribute parse action helper, to simplify creating filtering parse actions to attach to expressions returned by makeHTMLTags and makeXMLTags. Use withAttribute to qualify a starting tag with one or more required attribute values, to avoid false matches on common tags such as or
. - Added new examples nested.py and withAttribute.py to demonstrate the new features. - Added performance speedup to grammars using operatorPrecedence, instigated by Stefan Reichr - thanks for the feedback, Stefan! - Fixed bug/typo when deleting an element from a ParseResults by using the element's results name. - Fixed whitespace-skipping bug in wrapper classes (such as Group, Suppress, Combine, etc.) and when using setDebug(), reported by new pyparsing user dazzawazza on SourceForge, nice job! - Added restriction to prevent defining Word or CharsNotIn expressions with minimum length of 0 (should use Optional if this is desired), and enhanced docstrings to reflect this limitation. Issue was raised by Joey Tallieu, who submitted a patch with a slightly different solution. Thanks for taking the initiative, Joey, and please keep submitting your ideas! - Fixed bug in makeHTMLTags that did not detect HTML tag attributes with no '= value' portion (such as ""), reported by hamidh on the pyparsing wiki - thanks! - Fixed minor bug in makeHTMLTags and makeXMLTags, which did not accept whitespace in closing tags. Version 1.4.7 - July, 2007 -------------------------- - NEW NOTATION SHORTCUT: ParserElement now accepts results names using a notational shortcut, following the expression with the results name in parentheses. So this: stats = "AVE:" + realNum.setResultsName("average") + \ "MIN:" + realNum.setResultsName("min") + \ "MAX:" + realNum.setResultsName("max") can now be written as this: stats = "AVE:" + realNum("average") + \ "MIN:" + realNum("min") + \ "MAX:" + realNum("max") The intent behind this change is to make it simpler to define results names for significant fields within the expression, while keeping the grammar syntax clean and uncluttered. - Fixed bug when packrat parsing is enabled, with cached ParseResults being updated by subsequent parsing. Reported on the pyparsing wiki by Kambiz, thanks! - Fixed bug in operatorPrecedence for unary operators with left associativity, if multiple operators were given for the same term. - Fixed bug in example simpleBool.py, corrected precedence of "and" vs. "or" operations. - Fixed bug in Dict class, in which keys were converted to strings whether they needed to be or not. Have narrowed this logic to convert keys to strings only if the keys are ints (which would confuse __getitem__ behavior for list indexing vs. key lookup). - Added ParserElement method setBreak(), which will invoke the pdb module's set_trace() function when this expression is about to be parsed. - Fixed bug in StringEnd in which reading off the end of the input string raises an exception - should match. Resolved while answering a question for Shawn on the pyparsing wiki. Version 1.4.6 - April, 2007 --------------------------- - Simplified constructor for ParseFatalException, to support common exception construction idiom: raise ParseFatalException, "unexpected text: 'Spanish Inquisition'" - Added method getTokensEndLoc(), to be called from within a parse action, for those parse actions that need both the starting *and* ending location of the parsed tokens within the input text. - Enhanced behavior of keepOriginalText so that named parse fields are preserved, even though tokens are replaced with the original input text matched by the current expression. Also, cleaned up the stack traversal to be more robust. Suggested by Tim Arnold - thanks, Tim! - Fixed subtle bug in which countedArray (and similar dynamic expressions configured in parse actions) failed to match within Or, Each, FollowedBy, or NotAny. Reported by Ralf Vosseler, thanks for your patience, Ralf! - Fixed Unicode bug in upcaseTokens and downcaseTokens parse actions, scanString, and default debugging actions; reported (and patch submitted) by Nikolai Zamkovoi, spasibo! - Fixed bug when saving a tuple as a named result. The returned token list gave the proper tuple value, but accessing the result by name only gave the first element of the tuple. Reported by Poromenos, nice catch! - Fixed bug in makeHTMLTags/makeXMLTags, which failed to match tag attributes with namespaces. - Fixed bug in SkipTo when setting include=True, to have the skipped-to tokens correctly included in the returned data. Reported by gunars on the pyparsing wiki, thanks! - Fixed typobug in OnceOnly.reset method, omitted self argument. Submitted by eike welk, thanks for the lint-picking! - Added performance enhancement to Forward class, suggested by akkartik on the pyparsing Wiki discussion, nice work! - Added optional asKeyword to Word constructor, to indicate that the given word pattern should be matched only as a keyword, that is, it should only match if it is within word boundaries. - Added S-expression parser to examples directory. - Added macro substitution example to examples directory. - Added holaMundo.py example, excerpted from Marco Alfonso's blog - muchas gracias, Marco! - Modified internal cyclic references in ParseResults to use weakrefs; this should help reduce the memory footprint of large parsing programs, at some cost to performance (3-5%). Suggested by bca48150 on the pyparsing wiki, thanks! - Enhanced the documentation describing the vagaries and idiosyncracies of parsing strings with embedded tabs, and the impact on: . parse actions . scanString . col and line helper functions (Suggested by eike welk in response to some unexplained inconsistencies between parsed location and offsets in the input string.) - Cleaned up internal decorators to preserve function names, docstrings, etc. Version 1.4.5 - December, 2006 ------------------------------ - Removed debugging print statement from QuotedString class. Sorry for not stripping this out before the 1.4.4 release! - A significant performance improvement, the first one in a while! For my Verilog parser, this version of pyparsing is about double the speed - YMMV. - Added support for pickling of ParseResults objects. (Reported by Jeff Poole, thanks Jeff!) - Fixed minor bug in makeHTMLTags that did not recognize tag attributes with embedded '-' or '_' characters. Also, added support for passing expressions to makeHTMLTags and makeXMLTags, and used this feature to define the globals anyOpenTag and anyCloseTag. - Fixed error in alphas8bit, I had omitted the y-with-umlaut character. - Added punc8bit string to complement alphas8bit - it contains all the non-alphabetic, non-blank 8-bit characters. - Added commonHTMLEntity expression, to match common HTML "ampersand" codes, such as "<", ">", "&", " ", and """. This expression also defines a results name 'entity', which can be used to extract the entity field (that is, "lt", "gt", etc.). Also added built-in parse action replaceHTMLEntity, which can be attached to commonHTMLEntity to translate "<", ">", "&", " ", and """ to "<", ">", "&", " ", and "'". - Added example, htmlStripper.py, that strips HTML tags and scripts from HTML pages. It also translates common HTML entities to their respective characters. Version 1.4.4 - October, 2006 ------------------------------- - Fixed traceParseAction decorator to also trap and record exception returns from parse actions, and to handle parse actions with 0, 1, 2, or 3 arguments. - Enhanced parse action normalization to support using classes as parse actions; that is, the class constructor is called at parse time and the __init__ function is called with 0, 1, 2, or 3 arguments. If passing a class as a parse action, the __init__ method must use one of the valid parse action parameter list formats. (This technique is useful when using pyparsing to compile parsed text into a series of application objects - see the new example simpleBool.py.) - Fixed bug in ParseResults when setting an item using an integer index. (Reported by Christopher Lambacher, thanks!) - Fixed whitespace-skipping bug, patch submitted by Paolo Losi - grazie, Paolo! - Fixed bug when a Combine contained an embedded Forward expression, reported by cie on the pyparsing wiki - good catch! - Fixed listAllMatches bug, when a listAllMatches result was nested within another result. (Reported by don pasquale on comp.lang.python, well done!) - Fixed bug in ParseResults items() method, when returning an item marked as listAllMatches=True - Fixed bug in definition of cppStyleComment (and javaStyleComment) in which '//' line comments were not continued to the next line if the line ends with a '\'. (Reported by eagle-eyed Ralph Corderoy!) - Optimized re's for cppStyleComment and quotedString for better re performance - also provided by Ralph Corderoy, thanks! - Added new example, indentedGrammarExample.py, showing how to define a grammar using indentation to show grouping (as Python does for defining statement nesting). Instigated by an e-mail discussion with Andrew Dalke, thanks Andrew! - Added new helper operatorPrecedence (based on e-mail list discussion with Ralph Corderoy and Paolo Losi), to facilitate definition of grammars for expressions with unary and binary operators. For instance, this grammar defines a 6-function arithmetic expression grammar, with unary plus and minus, proper operator precedence,and right- and left-associativity: expr = operatorPrecedence( operand, [("!", 1, opAssoc.LEFT), ("^", 2, opAssoc.RIGHT), (oneOf("+ -"), 1, opAssoc.RIGHT), (oneOf("* /"), 2, opAssoc.LEFT), (oneOf("+ -"), 2, opAssoc.LEFT),] ) Also added example simpleArith.py and simpleBool.py to provide more detailed code samples using this new helper method. - Added new helpers matchPreviousLiteral and matchPreviousExpr, for creating adaptive parsing expressions that match the same content as was parsed in a previous parse expression. For instance: first = Word(nums) matchExpr = first + ":" + matchPreviousLiteral(first) will match "1:1", but not "1:2". Since this matches at the literal level, this will also match the leading "1:1" in "1:10". In contrast: first = Word(nums) matchExpr = first + ":" + matchPreviousExpr(first) will *not* match the leading "1:1" in "1:10"; the expressions are evaluated first, and then compared, so "1" is compared with "10". - Added keepOriginalText parse action. Sometimes pyparsing's whitespace-skipping leaves out too much whitespace. Adding this parse action will restore any internal whitespace for a parse expression. This is especially useful when defining expressions for scanString or transformString applications. - Added __add__ method for ParseResults class, to better support using Python sum built-in for summing ParseResults objects returned from scanString. - Added reset method for the new OnlyOnce class wrapper for parse actions (to allow a grammar to be used multiple times). - Added optional maxMatches argument to scanString and searchString, to short-circuit scanning after 'n' expression matches are found. Version 1.4.3 - July, 2006 ------------------------------ - Fixed implementation of multiple parse actions for an expression (added in 1.4.2). . setParseAction() reverts to its previous behavior, setting one (or more) actions for an expression, overwriting any action or actions previously defined . new method addParseAction() appends one or more parse actions to the list of parse actions attached to an expression Now it is harder to accidentally append parse actions to an expression, when what you wanted to do was overwrite whatever had been defined before. (Thanks, Jean-Paul Calderone!) - Simplified interface to parse actions that do not require all 3 parse action arguments. Very rarely do parse actions require more than just the parsed tokens, yet parse actions still require all 3 arguments including the string being parsed and the location within the string where the parse expression was matched. With this release, parse actions may now be defined to be called as: . fn(string,locn,tokens) (the current form) . fn(locn,tokens) . fn(tokens) . fn() The setParseAction and addParseAction methods will internally decorate the provided parse actions with compatible wrappers to conform to the full (string,locn,tokens) argument sequence. - REMOVED SUPPORT FOR RETURNING PARSE LOCATION FROM A PARSE ACTION. I announced this in March, 2004, and gave a final warning in the last release. Now you can return a tuple from a parse action, and it will be treated like any other return value (i.e., the tuple will be substituted for the incoming tokens passed to the parse action, which is useful when trying to parse strings into tuples). - Added setFailAction method, taking a callable function fn that takes the arguments fn(s,loc,expr,err) where: . s - string being parsed . loc - location where expression match was attempted and failed . expr - the parse expression that failed . err - the exception thrown The function returns no values. It may throw ParseFatalException if it is desired to stop parsing immediately. (Suggested by peter21081944 on wikispaces.com) - Added class OnlyOnce as helper wrapper for parse actions. OnlyOnce only permits a parse action to be called one time, after which all subsequent calls throw a ParseException. - Added traceParseAction decorator to help debug parse actions. Simply insert "@traceParseAction" ahead of the definition of your parse action, and each invocation will be displayed, along with incoming arguments, and returned value. - Fixed bug when copying ParserElements using copy() or setResultsName(). (Reported by Dan Thill, great catch!) - Fixed bug in asXML() where token text contains <, >, and & characters - generated XML now escapes these as <, > and &. (Reported by Jacek Sieka, thanks!) - Fixed bug in SkipTo() when searching for a StringEnd(). (Reported by Pete McEvoy, thanks Pete!) - Fixed "except Exception" statements, the most critical added as part of the packrat parsing enhancement. (Thanks, Erick Tryzelaar!) - Fixed end-of-string infinite looping on LineEnd and StringEnd expressions. (Thanks again to Erick Tryzelaar.) - Modified setWhitespaceChars to return self, to be consistent with other ParserElement modifiers. (Suggested by Erick Tryzelaar.) - Fixed bug/typo in new ParseResults.dump() method. - Fixed bug in searchString() method, in which only the first token of an expression was returned. searchString() now returns a ParseResults collection of all search matches. - Added example program removeLineBreaks.py, a string transformer that converts text files with hard line-breaks into one with line breaks only between paragraphs. - Added example program listAllMatches.py, to illustrate using the listAllMatches option when specifying results names (also shows new support for passing lists to oneOf). - Added example program linenoExample.py, to illustrate using the helper methods lineno, line, and col, and returning objects from a parse action. - Added example program parseListString.py, to which can parse the string representation of a Python list back into a true list. Taken mostly from my PyCon presentation examples, but now with support for tuple elements, too! Version 1.4.2 - April 1, 2006 (No foolin'!) ------------------------------------------- - Significant speedup from memoizing nested expressions (a technique known as "packrat parsing"), thanks to Chris Lesniewski-Laas! Your mileage may vary, but my Verilog parser almost doubled in speed to over 600 lines/sec! This speedup may break existing programs that use parse actions that have side-effects. For this reason, packrat parsing is disabled when you first import pyparsing. To activate the packrat feature, your program must call the class method ParserElement.enablePackrat(). If your program uses psyco to "compile as you go", you must call enablePackrat before calling psyco.full(). If you do not do this, Python will crash. For best results, call enablePackrat() immediately after importing pyparsing. - Added new helper method countedArray(expr), for defining patterns that start with a leading integer to indicate the number of array elements, followed by that many elements, matching the given expr parse expression. For instance, this two-liner: wordArray = countedArray(Word(alphas)) print wordArray.parseString("3 Practicality beats purity")[0] returns the parsed array of words: ['Practicality', 'beats', 'purity'] The leading token '3' is suppressed, although it is easily obtained from the length of the returned array. (Inspired by e-mail discussion with Ralf Vosseler.) - Added support for attaching multiple parse actions to a single ParserElement. (Suggested by Dan "Dang" Griffith - nice idea, Dan!) - Added support for asymmetric quoting characters in the recently-added QuotedString class. Now you can define your own quoted string syntax like "<>". To define this custom form of QuotedString, your code would define: dblAngleQuotedString = QuotedString('<<',endQuoteChar='>>') QuotedString also supports escaped quotes, escape character other than '\', and multiline. - Changed the default value returned internally by Optional, so that None can be used as a default value. (Suggested by Steven Bethard - I finally saw the light!) - Added dump() method to ParseResults, to make it easier to list out and diagnose values returned from calling parseString. - A new example, a search query string parser, submitted by Steven Mooij and Rudolph Froger - a very interesting application, thanks! - Added an example that parses the BNF in Python's Grammar file, in support of generating Python grammar documentation. (Suggested by J H Stovall.) - A new example, submitted by Tim Cera, of a flexible parser module, using a simple config variable to adjust parsing for input formats that have slight variations - thanks, Tim! - Added an example for parsing Roman numerals, showing the capability of parse actions to "compile" Roman numerals into their integer values during parsing. - Added a new docs directory, for additional documentation or help. Currently, this includes the text and examples from my recent presentation at PyCon. - Fixed another typo in CaselessKeyword, thanks Stefan Behnel. - Expanded oneOf to also accept tuples, not just lists. This really should be sufficient... - Added deprecation warnings when tuple is returned from a parse action. Looking back, I see that I originally deprecated this feature in March, 2004, so I'm guessing people really shouldn't have been using this feature - I'll drop it altogether in the next release, which will allow users to return a tuple from a parse action (which is really handy when trying to reconstuct tuples from a tuple string representation!). Version 1.4.1 - February, 2006 ------------------------------ - Converted generator expression in QuotedString class to list comprehension, to retain compatibility with Python 2.3. (Thanks, Titus Brown for the heads-up!) - Added searchString() method to ParserElement, as an alternative to using "scanString(instring).next()[0][0]" to search through a string looking for a substring matching a given parse expression. (Inspired by e-mail conversation with Dave Feustel.) - Modified oneOf to accept lists of strings as well as a single string of space-delimited literals. (Suggested by Jacek Sieka - thanks!) - Removed deprecated use of Upcase in pyparsing test code. (Also caught by Titus Brown.) - Removed lstrip() call from Literal - too aggressive in stripping whitespace which may be valid for some grammars. (Point raised by Jacek Sieka). Also, made Literal more robust in the event of passing an empty string. - Fixed bug in replaceWith when returning None. - Added cautionary documentation for Forward class when assigning a MatchFirst expression, as in: fwdExpr << a | b | c Precedence of operators causes this to be evaluated as: (fwdExpr << a) | b | c thereby leaving b and c out as parseable alternatives. Users must explicitly group the values inserted into the Forward: fwdExpr << (a | b | c) (Suggested by Scot Wilcoxon - thanks, Scot!) Version 1.4 - January 18, 2006 ------------------------------ - Added Regex class, to permit definition of complex embedded expressions using regular expressions. (Enhancement provided by John Beisley, great job!) - Converted implementations of Word, oneOf, quoted string, and comment helpers to utilize regular expression matching. Performance improvements in the 20-40% range. - Added QuotedString class, to support definition of non-standard quoted strings (Suggested by Guillaume Proulx, thanks!) - Added CaselessKeyword class, to streamline grammars with, well, caseless keywords (Proposed by Stefan Behnel, thanks!) - Fixed bug in SkipTo, when using an ignoreable expression. (Patch provided by Anonymous, thanks, whoever-you-are!) - Fixed typo in NoMatch class. (Good catch, Stefan Behnel!) - Fixed minor bug in _makeTags(), using string.printables instead of pyparsing.printables. - Cleaned up some of the expressions created by makeXXXTags helpers, to suppress extraneous <> characters. - Added some grammar definition-time checking to verify that a grammar is being built using proper ParserElements. - Added examples: . LAparser.py - linear algebra C preprocessor (submitted by Mike Ellis, thanks Mike!) . wordsToNum.py - converts word description of a number back to the original number (such as 'one hundred and twenty three' -> 123) . updated fourFn.py to support unary minus, added BNF comments Version 1.3.3 - September 12, 2005 ---------------------------------- - Improved support for Unicode strings that would be returned using srange. Added greetingInKorean.py example, for a Korean version of "Hello, World!" using Unicode. (Thanks, June Kim!) - Added 'hexnums' string constant (nums+"ABCDEFabcdef") for defining hexadecimal value expressions. - NOTE: ===THIS CHANGE MAY BREAK EXISTING CODE=== Modified tag and results definitions returned by makeHTMLTags(), to better support the looseness of HTML parsing. Tags to be parsed are now caseless, and keys generated for tag attributes are now converted to lower case. Formerly, makeXMLTags("XYZ") would return a tag with results name of "startXYZ", this has been changed to "startXyz". If this tag is matched against '', the matched keys formerly would be "Abc", "DEF", and "ghi"; keys are now converted to lower case, giving keys of "abc", "def", and "ghi". These changes were made to try to address the lax case sensitivity agreement between start and end tags in many HTML pages. No changes were made to makeXMLTags(), which assumes more rigorous parsing rules. Also, cleaned up case-sensitivity bugs in closing tags, and switched to using Keyword instead of Literal class for tags. (Thanks, Steve Young, for getting me to look at these in more detail!) - Added two helper parse actions, upcaseTokens and downcaseTokens, which will convert matched text to all uppercase or lowercase, respectively. - Deprecated Upcase class, to be replaced by upcaseTokens parse action. - Converted messages sent to stderr to use warnings module, such as when constructing a Literal with an empty string, one should use the Empty() class or the empty helper instead. - Added ' ' (space) as an escapable character within a quoted string. - Added helper expressions for common comment types, in addition to the existing cStyleComment (/*...*/) and htmlStyleComment () . dblSlashComment = // ... (to end of line) . cppStyleComment = cStyleComment or dblSlashComment . javaStyleComment = cppStyleComment . pythonStyleComment = # ... (to end of line) Version 1.3.2 - July 24, 2005 ----------------------------- - Added Each class as an enhanced version of And. 'Each' requires that all given expressions be present, but may occur in any order. Special handling is provided to group ZeroOrMore and OneOrMore elements that occur out-of-order in the input string. You can also construct 'Each' objects by joining expressions with the '&' operator. When using the Each class, results names are strongly recommended for accessing the matched tokens. (Suggested by Pradam Amini - thanks, Pradam!) - Stricter interpretation of 'max' qualifier on Word elements. If the 'max' attribute is specified, matching will fail if an input field contains more than 'max' consecutive body characters. For example, previously, Word(nums,max=3) would match the first three characters of '0123456', returning '012' and continuing parsing at '3'. Now, when constructed using the max attribute, Word will raise an exception with this string. - Cleaner handling of nested dictionaries returned by Dict. No longer necessary to dereference sub-dictionaries as element [0] of their parents. === NOTE: THIS CHANGE MAY BREAK SOME EXISTING CODE, BUT ONLY IF PARSING NESTED DICTIONARIES USING THE LITTLE-USED DICT CLASS === (Prompted by discussion thread on the Python Tutor list, with contributions from Danny Yoo, Kent Johnson, and original post by Liam Clarke - thanks all!) Version 1.3.1 - June, 2005 ---------------------------------- - Added markInputline() method to ParseException, to display the input text line location of the parsing exception. (Thanks, Stefan Behnel!) - Added setDefaultKeywordChars(), so that Keyword definitions using a custom keyword character set do not all need to add the keywordChars constructor argument (similar to setDefaultWhitespaceChars()). (suggested by rzhanka on the SourceForge pyparsing forum.) - Simplified passing debug actions to setDebugAction(). You can now pass 'None' for a debug action if you want to take the default debug behavior. To suppress a particular debug action, you can pass the pyparsing method nullDebugAction. - Refactored parse exception classes, moved all behavior to ParseBaseException, and the former ParseException is now a subclass of ParseBaseException. Added a second subclass, ParseFatalException, as a subclass of ParseBaseException. User-defined parse actions can raise ParseFatalException if a data inconsistency is detected (such as a begin-tag/end-tag mismatch), and this will stop all parsing immediately. (Inspired by e-mail thread with Michele Petrazzo - thanks, Michelle!) - Added helper methods makeXMLTags and makeHTMLTags, that simplify the definition of XML or HTML tag parse expressions for a given tagname. Both functions return a pair of parse expressions, one for the opening tag (that is, '') and one for the closing tag (''). The opening tagame also recognizes any attribute definitions that have been included in the opening tag, as well as an empty tag (one with a trailing '/', as in '' which is equivalent to ''). makeXMLTags uses stricter XML syntax for attributes, requiring that they be enclosed in double quote characters - makeHTMLTags is more lenient, and accepts single-quoted strings or any contiguous string of characters up to the next whitespace character or '>' character. Attributes can be retrieved as dictionary or attribute values of the returned results from the opening tag. - Added example minimath2.py, a refinement on fourFn.py that adds an interactive session and support for variables. (Thanks, Steven Siew!) - Added performance improvement, up to 20% reduction! (Found while working with Wolfgang Borgert on performance tuning of his TTCN3 parser.) - And another performance improvement, up to 25%, when using scanString! (Found while working with Henrik Westlund on his C header file scanner.) - Updated UML diagrams to reflect latest class/method changes. Version 1.3 - March, 2005 ---------------------------------- - Added new Keyword class, as a special form of Literal. Keywords must be followed by whitespace or other non-keyword characters, to distinguish them from variables or other identifiers that just happen to start with the same characters as a keyword. For instance, the input string containing "ifOnlyIfOnly" will match a Literal("if") at the beginning and in the middle, but will fail to match a Keyword("if"). Keyword("if") will match only strings such as "if only" or "if(only)". (Proposed by Wolfgang Borgert, and Berteun Damman separately requested this on comp.lang.python - great idea!) - Added setWhitespaceChars() method to override the characters to be skipped as whitespace before matching a particular ParseElement. Also added the class-level method setDefaultWhitespaceChars(), to allow users to override the default set of whitespace characters (space, tab, newline, and return) for all subsequently defined ParseElements. (Inspired by Klaas Hofstra's inquiry on the Sourceforge pyparsing forum.) - Added helper parse actions to support some very common parse action use cases: . replaceWith(replStr) - replaces the matching tokens with the provided replStr replacement string; especially useful with transformString() . removeQuotes - removes first and last character from string enclosed in quotes (note - NOT the same as the string strip() method, as only a single character is removed at each end) - Added copy() method to ParseElement, to make it easier to define different parse actions for the same basic parse expression. (Note, copy is implicitly called when using setResultsName().) (The following changes were posted to CVS as Version 1.2.3 - October-December, 2004) - Added support for Unicode strings in creating grammar definitions. (Big thanks to Gavin Panella!) - Added constant alphas8bit to include the following 8-bit characters: - Added srange() function to simplify definition of Word elements, using regexp-like '[A-Za-z0-9]' syntax. This also simplifies referencing common 8-bit characters. - Fixed bug in Dict when a single element Dict was embedded within another Dict. (Thanks Andy Yates for catching this one!) - Added 'formatted' argument to ParseResults.asXML(). If set to False, suppresses insertion of whitespace for pretty-print formatting. Default equals True for backward compatibility. - Added setDebugActions() function to ParserElement, to allow user-defined debugging actions. - Added support for escaped quotes (either in \', \", or doubled quote form) to the predefined expressions for quoted strings. (Thanks, Ero Carrera!) - Minor performance improvement (~5%) converting "char in string" tests to "char in dict". (Suggested by Gavin Panella, cool idea!) Version 1.2.2 - September 27, 2004 ---------------------------------- - Modified delimitedList to accept an expression as the delimiter, instead of only accepting strings. - Modified ParseResults, to convert integer field keys to strings (to avoid confusion with list access). - Modified Combine, to convert all embedded tokens to strings before combining. - Fixed bug in MatchFirst in which parse actions would be called for expressions that only partially match. (Thanks, John Hunter!) - Fixed bug in fourFn.py example that fixes right-associativity of ^ operator. (Thanks, Andrea Griffini!) - Added class FollowedBy(expression), to look ahead in the input string without consuming tokens. - Added class NoMatch that never matches any input. Can be useful in debugging, and in very specialized grammars. - Added example pgn.py, for parsing chess game files stored in Portable Game Notation. (Thanks, Alberto Santini!) Version 1.2.1 - August 19, 2004 ------------------------------- - Added SkipTo(expression) token type, simplifying grammars that only want to specify delimiting expressions, and want to match any characters between them. - Added helper method dictOf(key,value), making it easier to work with the Dict class. (Inspired by Pavel Volkovitskiy, thanks!). - Added optional argument listAllMatches (default=False) to setResultsName(). Setting listAllMatches to True overrides the default modal setting of tokens to results names; instead, the results name acts as an accumulator for all matching tokens within the local repetition group. (Suggested by Amaury Le Leyzour - thanks!) - Fixed bug in ParseResults, throwing exception when trying to extract slice, or make a copy using [:]. (Thanks, Wilson Fowlie!) - Fixed bug in transformString() when the input string contains 's (Thanks, Rick Walia!). - Fixed bug in returning tokens from un-Grouped And's, Or's and MatchFirst's, where too many tokens would be included in the results, confounding parse actions and returned results. - Fixed bug in naming ParseResults returned by And's, Or's, and Match First's. - Fixed bug in LineEnd() - matching this token now correctly consumes and returns the end of line "\n". - Added a beautiful example for parsing Mozilla calendar files (Thanks, Petri Savolainen!). - Added support for dynamically modifying Forward expressions during parsing. Version 1.2 - 20 June 2004 -------------------------- - Added definition for htmlComment to help support HTML scanning and parsing. - Fixed bug in generating XML for Dict classes, in which trailing item was duplicated in the output XML. - Fixed release bug in which scanExamples.py was omitted from release files. - Fixed bug in transformString() when parse actions are not defined on the outermost parser element. - Added example urlExtractor.py, as another example of using scanString and parse actions. Version 1.2beta3 - 4 June 2004 ------------------------------ - Added White() token type, analogous to Word, to match on whitespace characters. Use White in parsers with significant whitespace (such as configuration file parsers that use indentation to indicate grouping). Construct White with a string containing the whitespace characters to be matched. Similar to Word, White also takes optional min, max, and exact parameters. - As part of supporting whitespace-signficant parsing, added parseWithTabs() method to ParserElement, to override the default behavior in parseString of automatically expanding tabs to spaces. To retain tabs during parsing, call parseWithTabs() before calling parseString(), parseFile() or scanString(). (Thanks, Jean-Guillaume Paradis for catching this, and for your suggestions on whitespace-significant parsing.) - Added transformString() method to ParseElement, as a complement to scanString(). To use transformString, define a grammar and attach a parse action to the overall grammar that modifies the returned token list. Invoking transformString() on a target string will then scan for matches, and replace the matched text patterns according to the logic in the parse action. transformString() returns the resulting transformed string. (Note: transformString() does *not* automatically expand tabs to spaces.) Also added scanExamples.py to the examples directory to show sample uses of scanString() and transformString(). - Removed group() method that was introduced in beta2. This turns out NOT to be equivalent to nesting within a Group() object, and I'd prefer not to sow more seeds of confusion. - Fixed behavior of asXML() where tags for groups were incorrectly duplicated. (Thanks, Brad Clements!) - Changed beta version message to display to stderr instead of stdout, to make asXML() easier to use. (Thanks again, Brad.) Version 1.2beta2 - 19 May 2004 ------------------------------ - *** SIMPLIFIED API *** - Parse actions that do not modify the list of tokens no longer need to return a value. This simplifies those parse actions that use the list of tokens to update a counter or record or display some of the token content; these parse actions can simply end without having to specify 'return toks'. - *** POSSIBLE API INCOMPATIBILITY *** - Fixed CaselessLiteral bug, where the returned token text was not the original string (as stated in the docs), but the original string converted to upper case. (Thanks, Dang Griffith!) **NOTE: this may break some code that relied on this erroneous behavior. Users should scan their code for uses of CaselessLiteral.** - *** POSSIBLE CODE INCOMPATIBILITY *** - I have renamed the internal attributes on ParseResults from 'dict' and 'list' to '__tokdict' and '__toklist', to avoid collisions with user-defined data fields named 'dict' and 'list'. Any client code that accesses these attributes directly will need to be modified. Hopefully the implementation of methods such as keys(), items(), len(), etc. on ParseResults will make such direct attribute accessess unnecessary. - Added asXML() method to ParseResults. This greatly simplifies the process of parsing an input data file and generating XML-structured data. - Added getName() method to ParseResults. This method is helpful when a grammar specifies ZeroOrMore or OneOrMore of a MatchFirst or Or expression, and the parsing code needs to know which expression matched. (Thanks, Eric van der Vlist, for this idea!) - Added items() and values() methods to ParseResults, to better support using ParseResults as a Dictionary. - Added parseFile() as a convenience function to parse the contents of an entire text file. Accepts either a file name or a file object. (Thanks again, Dang!) - Added group() method to And, Or, and MatchFirst, as a short-cut alternative to enclosing a construct inside a Group object. - Extended fourFn.py to support exponentiation, and simple built-in functions. - Added EBNF parser to examples, including a demo where it parses its own EBNF! (Thanks to Seo Sanghyeon!) - Added Delphi Form parser to examples, dfmparse.py, plus a couple of sample Delphi forms as tests. (Well done, Dang!) - Another performance speedup, 5-10%, inspired by Dang! Plus about a 20% speedup, by pre-constructing and cacheing exception objects instead of constructing them on the fly. - Fixed minor bug when specifying oneOf() with 'caseless=True'. - Cleaned up and added a few more docstrings, to improve the generated docs. Version 1.1.2 - 21 Mar 2004 --------------------------- - Fixed minor bug in scanString(), so that start location is at the start of the matched tokens, not at the start of the whitespace before the matched tokens. - Inclusion of HTML documentation, generated using Epydoc. Reformatted some doc strings to better generate readable docs. (Beautiful work, Ed Loper, thanks for Epydoc!) - Minor performance speedup, 5-15% - And on a process note, I've used the unittest module to define a series of unit tests, to help avoid the embarrassment of the version 1.1 snafu. Version 1.1.1 - 6 Mar 2004 -------------------------- - Fixed critical bug introduced in 1.1, which broke MatchFirst(!) token matching. **THANK YOU, SEO SANGHYEON!!!** - Added "from future import __generators__" to permit running under pre-Python 2.3. - Added example getNTPservers.py, showing how to use pyparsing to extract a text pattern from the HTML of a web page. Version 1.1 - 3 Mar 2004 ------------------------- - ***Changed API*** - While testing out parse actions, I found that the value of loc passed in was not the starting location of the matched tokens, but the location of the next token in the list. With this version, the location passed to the parse action is now the starting location of the tokens that matched. A second part of this change is that the return value of parse actions no longer needs to return a tuple containing both the location and the parsed tokens (which may optionally be modified); parse actions only need to return the list of tokens. Parse actions that return a tuple are deprecated; they will still work properly for conversion/compatibility, but this behavior will be removed in a future version. - Added validate() method, to help diagnose infinite recursion in a grammar tree. validate() is not 100% fool-proof, but it can help track down nasty infinite looping due to recursively referencing the same grammar construct without some intervening characters. - Cleaned up default listing of some parse element types, to more closely match ordinary BNF. Instead of the form :[contents-list], some changes are: . And(token1,token2,token3) is "{ token1 token2 token3 }" . Or(token1,token2,token3) is "{ token1 ^ token2 ^ token3 }" . MatchFirst(token1,token2,token3) is "{ token1 | token2 | token3 }" . Optional(token) is "[ token ]" . OneOrMore(token) is "{ token }..." . ZeroOrMore(token) is "[ token ]..." - Fixed an infinite loop in oneOf if the input string contains a duplicated option. (Thanks Brad Clements) - Fixed a bug when specifying a results name on an Optional token. (Thanks again, Brad Clements) - Fixed a bug introduced in 1.0.6 when I converted quotedString to use CharsNotIn; I accidentally permitted quoted strings to span newlines. I have fixed this in this version to go back to the original behavior, in which quoted strings do *not* span newlines. - Fixed minor bug in HTTP server log parser. (Thanks Jim Richardson) Version 1.0.6 - 13 Feb 2004 ---------------------------- - Added CharsNotIn class (Thanks, Lee SangYeong). This is the opposite of Word, in that it is constructed with a set of characters *not* to be matched. (This enhancement also allowed me to clean up and simplify some of the definitions for quoted strings, cStyleComment, and restOfLine.) - **MINOR API CHANGE** - Added joinString argument to the __init__ method of Combine (Thanks, Thomas Kalka). joinString defaults to "", but some applications might choose some other string to use instead, such as a blank or newline. joinString was inserted as the second argument to __init__, so if you have code that specifies an adjacent value, without using 'adjacent=', this code will break. - Modified LineStart to recognize the start of an empty line. - Added optional caseless flag to oneOf(), to create a list of CaselessLiteral tokens instead of Literal tokens. - Added some enhancements to the SQL example: . Oracle-style comments (Thanks to Harald Armin Massa) . simple WHERE clause - Minor performance speedup - 5-15% Version 1.0.5 - 19 Jan 2004 ---------------------------- - Added scanString() generator method to ParseElement, to support regex-like pattern-searching - Added items() list to ParseResults, to return named results as a list of (key,value) pairs - Fixed memory overflow in asList() for deeply nested ParseResults (Thanks, Sverrir Valgeirsson) - Minor performance speedup - 10-15% Version 1.0.4 - 8 Jan 2004 --------------------------- - Added positional tokens StringStart, StringEnd, LineStart, and LineEnd - Added commaSeparatedList to pre-defined global token definitions; also added commasep.py to the examples directory, to demonstrate the differences between parsing comma-separated data and simple line-splitting at commas - Minor API change: delimitedList does not automatically enclose the list elements in a Group, but makes this the responsibility of the caller; also, if invoked using 'combine=True', the list delimiters are also included in the returned text (good for scoped variables, such as a.b.c or a::b::c, or for directory paths such as a/b/c) - Performance speed-up again, 30-40% - Added httpServerLogParser.py to examples directory, as this is a common parsing task Version 1.0.3 - 23 Dec 2003 --------------------------- - Performance speed-up again, 20-40% - Added Python distutils installation setup.py, etc. (thanks, Dave Kuhlman) Version 1.0.2 - 18 Dec 2003 --------------------------- - **NOTE: Changed API again!!!** (for the last time, I hope) + Renamed module from parsing to pyparsing, to better reflect Python linkage. - Also added dictExample.py to examples directory, to illustrate usage of the Dict class. Version 1.0.1 - 17 Dec 2003 --------------------------- - **NOTE: Changed API!** + Renamed 'len' argument on Word.__init__() to 'exact' - Performance speed-up, 10-30% Version 1.0.0 - 15 Dec 2003 --------------------------- - Initial public release Version 0.1.1 thru 0.1.17 - October-November, 2003 -------------------------------------------------- - initial development iterations: - added Dict, Group - added helper methods oneOf, delimitedList - added helpers quotedString (and double and single), restOfLine, cStyleComment - added MatchFirst as an alternative to the slower Or - added UML class diagram - fixed various logic bugs pyparsing-2.0.3/pyparsingClassDiagram.PNG0000664000175000017500000042405211170740075017420 0ustar barrybarryPNG  IHDR{ 7 IDATx]lSg/7RF}HCA4g"v.HL!RIDEQgii*pa*(&QIR&$e.M9)PBNHH_ey~T鄵dN7zADDDDDDˉ2)13 """"Z ?+цLh1#"""""ZnĈ[vm,n҆8mTjZ,iqDDDDDiČ 8^>Ըv8':hREcWOt>gq`FDDDD̴3X'9#UR=fAX,{,rJK+:,A!>4@#3%G 3/ު+몽=k3a}nKlӚݑۘ-?LLnPj8}i\$j3Oܾ2Wxw(}D91#t<\}o.6zᰫ.7.-|Չ[ũ.9͆Թ6>iQn5Q4hhdbGf$!:טb6oL_Je,3 =&b 4fov"M[eVOgֆDW4v&LÈVF&f,͉͂nB)D.Fj4jIJJ43{{{D,2Εmqc'ު|gcou]1L<0 #""""ZAZO'ݶ; so+a>d$j%]ϡjz%A05`TzZ3ٙr3h 3OWc~ qgŽj )N`i\nvqы )Uhd&FDDDDAЭl>0/drϡLS4h-oMVDDDDD+NuegJi*Ll`FDDDDz0* l*j&ƿ->HDDDDDܘ-7fbDDDDDDˍrc&FDDDDDܘ-7fbDDDDDDˍrc&FDDDDDܘ-7fbDDDDDDˍrc&FDDDDDt+ђaC W:"0#uk旿tDtz}C "31"""Z?w*+ Qf|Oh1#"""""ZnĈ31"""""Lh1#"""""ZnĈ31"""""LOCS^I_տsEf MDD31""Zsc}旿 iru3,L/jBa)&"-23WZj-kͯ^׿jݯ^\$;yEkM6[k4\ܯFDD47ĈhFWCm0+ūqSMi:gzUR \j5ǜa}%Pr9F˔ԾC_3|nÝ\ץJG/Gf~_IDDkn " خ}oKZsӀ݇t@}CkPquhRAk9EQQWT@E9?nҡ~H@ tn2a&FDDKOɈx/nfg.S>W{}&/k ć;c/kŷO<D(?S0Q ܉>!ID =Xt]̈́p8eߤj o6{9g^ѐD0~(\ik?7=/󷞆?Th7Ra旿tDtz]-+?W+V4l -}}`۹a6kbloiXfsIu&M&5m]_b5<4 ?6""""ZrZk3k׶ {,f kCn=A'X&}Ssւ7͂K\B٥<@i#]?X>YP7&YEio?-͟sY`TRǚTAFC={ מpx/|mF8'3ft#0o?62yt}oC}Gw+qE5~d9q.= s6Åp$dz襴L-(=Ƹ O|ԌMYYsTc_\pz{h!Bk5^9w(]~{mc5|ӫXOߓ[&fj =[̇;KI͇>ºG2&!f7] K|m1eHcFxhttȞX꣱<7!o'O?c`1Ӏ)^xdsP9WFDDDD dlY`|O9UϸM_ݩ=",z xG#Uji()r㛞5<.iM&'̅;"+zb3:G Rb˴p""""ZLVs[BUeOv&>2F&&e,{b@X ڷVy)ذu/i60VnF_%}IQlyӘi9Uu='4PK[:HǔgU_2=s%J0ClNDDDDKO_Xi|o,V穵WwF\%VslDDDD+ckbD>mL)9Y,`[ N$htz}C Z-hD"""""LhL7i@/Nꗘr»#ҊM,2T[5k3, ȳ&""""31տ|yսsWpcJL\b;{#_T DDD^Ksx%liL!+Wb8YN17aSz}Β0rk3"7Gd?)W|ouˤOqmQ7iyu"R7ktc'{)}=uo{Wmoem?4^97%L6<oڡ~j{s[#Tn~t}o*_V^6z~[.޾JmL"""Zc3t/BgߏOu3AtEv+ :xZ|j0q|Q&qwǣS&zpUiz7^(9.12E"?EWtEq$NPkޔA2nTҭS7i]ZXӉa%;2滶 F/B+Fv8P6= ,R|]mTKjУ<{mFk}Ap _آ2R=+a^͇>΢[_xO*L/5::; g/Ph:4IHjӡ _P͓]ƕ]MjG^62MlwGCӡY-5AcPh:d-ćwk=YKwK?N|c;G5BĘa&L7O97i}ZX [k̥Leԣ'r[~=T#ON&4c om4܊*W[/Uֽd,zq]}P΢ۢW&"Zݩa9ODDDPx|v18*[2Kq-v%3nO3ᆳy#]Vs꓏oye7ZjHk{w9 qj&`H:8έ}^SlOfդ a5vhdbW>ى'>{>ĸv;?z:Ɔ-u=ʕ`c-O,#^,ӳ:כFXjyO 4o%/mg*R)smC93 GG_"8t"ڰײ)R tq7n=pV`B!HvWpw[nFQh0n=2lfM#Qi:zuL򝒦'M?0NZۿ4󦶌ȰQ mH`p~7 ?m}yOܞVK7y7=7h:*ck$ur|Κ[6WL¦@Dْm>rޚWW|0Q]ɂޚ㓟H tH^X]kKföM+;^,gaw;79O@c_ T~CopJG /d? v56NZ(78pcy/RZfD7jĝ!pXp8ґۢ3V|E$UF_|uqr s&+}6+N,pFY!]#-9{Sm_v4皿-ԋ~|[V~0Wh,!4C>G᳀#:y:q FD׉:^L]z9U,JVC[Ntnz˰F<hzkWr_jSټW#H5#zklm5.~=̀tt@/堷&2l(S#"ߞ ݽ~ΘhUa&FD?::FO{{Fr\_SᘑgSMOjPt%T;#5`(pb}bӔ_j;kpH3RWR/~W]%)SU >m`${:]w?-jSR@x> kMvikbej`wáYJ k2Ç?wæzk=1"+Oψs|:1ehӉ@%`"0,WIи@ݰT){egT5:> uj)xs'QNAd]70r'?2`+S_5NNa`+Bd`W~ 1uVJ߲Zn`R-Uj V=Ĉ)x-`2vO,ɫ!u\wPXըfb.G^6YautHTd͌ p208g^bL 'g+_h x_?l|ǜq,DDD͚ܖo9g\ γYPxyֆ 2, W&"7)AvN`m|ٹzτM#hi6(`w+B[zl+YU%;\Z u4劣ρK!2?{OtT*ڊīʵ~-(a#rTEiCPd*L)PlЏ@\:؋ī֒S'hQaP\aͲ6kDpW?5߻~(.1[q{`Lg,9uu-h>;b=5s@z+ 4z`k2}|e</HTK.'%^,>jxv Zg';|~f+BO|o-o,?K:LF{&-o- }9pթ1%4O$RI: )=ߓ%n˞w+015@軽MWEaCq_ZkK:D*?Ӱպ4k0=!{߶o{C9~b2xw:ތgEiOpNx\=FАjK['ݏ̘fd7 bDLjsVڰ(t#PO9z}^j@(9w[w36*^jUGts]Ɓ.( :xZ|j)0oRgX{0تIJ ؜SbWB|+˅$o\6o0n9<9sj31+_EO>zA$mVqCB?ztOYb#i?>h>;F\͕ƢWt_nvEQ$""Z5Z.nCQwѷCg}z MѱuT-mu(Ҭ/Hkhy"L?l{м6*aKXf7>ʖ' :gݒcKM؈Mp GP ׾7#ٞaK95/ 9ԭHAH擦b=5$5oloeb35w}ysA/s{G+¯h7{"4{ì4/<M<Ȱք#׉h z[=ٿ( V@°tE"-酲59EbG ~5xJ38y#T(N9ꭓ7BQ9 ґG${b3ImŇnFK4=})GKp/i[֞!/ ӯY{X'?V/h~2֤4!uhS쉈}{h1EkW$R>&tƗz8~*[WT#tֲدy=rKm:^'l^? ;?:G`]#y[a@[AA-3VV5ۭeQ~f0ZqkD"KmE3.UMAN٘t@PنLjuN~"uGٿhWi<(.{DF/i(I":r2eۅJT;Q";.]>p/]8kpHJ[KND!=?,q0Ԗ1n`, IDATQ#-\ɃlVWOi @K:]˶ cMvDDS҈:sE4ĈhC(Oψs|:$*)twB`g'F M|)NE_ ʟㅩU m:(2^UO}}v]کq*L{؈Ԏq–ʼ7-4aDDD-fbDDilǟ'Ei/- ɻQDTV.8vS(}0&m)W%˫!U#q<@EaUcKe~)MK`v ""k=1ߤEx&gl"'}J柖#$o,z L4 rP ';͈rslCgh)myծ"%藺Pޒ{{)T&bN?kp(W Zv|~TOleeX2tubN0j-Ww,$`W9jQNbgL^-8""l(7߻WmOs-xv Zg'tѯ?:IYWu 7?ux0jV>Rg[[Ax&/ל VƢi\ˇ^\WVu>籲G{\|t.~Qs&sn|.rjlD~Mw|})+=#Ma˞WDDkQZ=גڕYS^S,;>J꧳i[ZxJ -_O(0otŀÖpxO86*yw:l+<ƅg<%hjx oQ[v>>`?U^}c<։g?;_6nˬ(Fܹ;4?o۰2Զ"):g_˫nsT$ml+>GwSz;mUލ]3w[+]ݓ \â>u0qy{Ro8tԀS[O `kN @xX+c $O1H:5Ӛ&ݦũ&Ji"p+n[F֞.”jήeeGk֦ڬL?6 =ScўE E;7O!aEWToKUQrpVS4v_\FG3=+P}G/?|R[':_=m/=ym76x4h ŕFm:M ѥU>v=Cւ{*jLBӡ8ztxk=4}q!%ֻ4mݑ?z~AaNe"~@JSʘ|nA5H)DO`I(%8js\IBYVdo C7g0akvԀrn涴LLaW+Z; xO `,ȣ_,Z, m1&VNERe݋' /gܧ,|e=klz^d9q۫՝jM,fJ-(}[IO G$3έ}^SlQ~w^oq@'`8:Ƥq|ߺդ|X_tQN A1q8e `(oP.F'C6em[' >!ԹgOad[ڷ J nQ9:^k. Q W>+u$``|˼6*Ös{r3ԺSߓxuPbEg*r$㛮g3p|/zΜ,Ɔ:L#-b\~sMp%iJӡcWc[; +bj&4p5HZ-e: wF%\̞al&_Lz|3:VbkʚF<{nr.s.f=sƆ7<^̟MOjw㛞𛉗^jX5 u~$É+e=:h8"~mN zk_1'zOYrh,-%IZr7_ii,Gv͏]8 8y˱Xɏ?SԿ>ڔpJ{Z$8{^:y#tfh`[Y숳2ɓZ51=s㛡@O0F:dO>z%2GUt#kJFc[H=D1]S^}tYfq"k{"̴O31Z%6)sqUο䲨rtİ'ӜvO'"Zדzs[[r%6%JW9?2x+Km56SzNGӫE2@neEELζADk3"elK(g5娃/Pm`ĈhCP3r_]'HSt9kpH3REM`\R丄 }F2ѫ0}{Fex^-TNK3)S:V }Lzڙjg)MvۖƚJ|ה v=OK4>].vWM]΅ nj=cGOh5{f_,(udͽ'FD4qnO'NNUS Єqy.CNT'-T?l.3BiS K$*),?P*ԣx,K+2+?2K߲Zn`2*Uje1""9aMHPXըfnMyKDmQ/~T~(ܔ;g`kZ p2R|>9[Dca;f .'rkÚ&FDIiÍ,T?qDM)mvR*UjWMUgJ6ծ"*l{egŠWlcG 2VwGB;.*;?9e9rԐ({<;'7%?;hXg'[?wj_>t'eĎ:e;,27CI,A2U͓ߍ[?-~]3NO*/iAo缔3/BxF_[8>Q:%_vwXbKz8~)Ɋm O_A<Ş(hqfM).[L[ckI,dH 9/t[N[jW4cf k$o:rdi֕vxz9VV<É{XU{njODkV} pZWцtbi׉sz/]pH3[^.sI3{?3R)jgv֠t3 'axMբ3Ew\b.޳PKJޢ 3RMSa#̉&f;'-Rd wHv㤵-5(]ph$nҜF]u־%o=} 5oth^&Zx=mqO'Nw)]J,Uj}ƔW&ɀAc.3PexMg~ūqʏH [>Kz0ehӉ@%5jt|2lqIUel)ysSr<omϫje1""Zgd(|89\`Ӈ4:FKKCLƺW5&5l Ay[lF..$˫!U#q<@E~)3ƙOx>ه̯shw~Nvۉ.fbD6(UDM mUiG׉*L)?qFnM v2] x-YO\ZaOďjx5FǍHKx2=5xvO0Q <sb.oSSv""5g'}viX.+m֌ {v.#[s<3Zfe\.b/} ǏKp+^w 0=_ى+g'ͮ@qdCľέ}^SlO9][oP?\n8}[{j*V*6MP#8 V#㵽;}m1ccӸaC2 0XcS۽36ѪQPk[网#  Nγ!-ГS؄CґPoE"St(؅k_!eL I-VY+CNٚ;!ʼô1#"ZzAoXS#M#-[~"M:r0^lN/Ei|LLVH4쮙Mْќ#%Ɣ-Lu:-VMT q4Ňjͤit;Fig5eR:)O>#{b}+Ѧ>G:zf/ CU_aoGS4"[-Y߫g7v-v&Ms6}f8U"[ލ{NƏ &Cсv\niǷ zkplcy,ίO7󒰥Uu6.pZS޵(/.^$1dw[q+k8O_A<Ş(awmI,΄"_jDxz9,2W[ckI(dEkng ʊg8>^7H[=*aG{GDnM︚ǑhV:"ڊ:e]'Tc:'?Y2ݾ{D)\T}ڙvbTbn&'J FUN`@ Le6hݯ#jxUyc.ʖU<ݰ dEG/;{D~Z|? ~:=#{hc&FDBxzFӉU8g'PZ2D{egT5:> uAIMx25ˏ*^S(uO(Jڥv쬯7ĸUǚE Єq`"0LR՛|0`·tuKE**MU $W>~FҒvqV;\SU06}JP]Wl⌃DMJ ZeuF҆! ySuWÎyzȆKFϾDZ2ىD>i8'+ubLcgPiYg'fVى =pJt]imى+g'fYӵ uw:^':* SSGD߻,(/\NGDL(҆-W< :g[ݢհWD 9]aQT>|nxUrjJ`੃őp5!Q<,sZ3L@a#­D/ 0#"""Zjӡ _VӨe:ֻ?yrkXk8Y woma 4;-l)WIQ1#"""ZP]p ꓏dzRݡn'\?՘y:v(Pnx^QFĈ K1kJm j zҕ GP Y2n=IND L69/ Dns$Ao(;"1"&#;.g3"ҝJ}`hS^wl=0] kq^Alo->{k^]_s8kl=ň O'IȩӍ8o=,y IDAT uCo4#-N7 =zZ?V)skU)mǭґt/ N鈁'ݯc<~{" FZziӮ妌dg}uZ5Km:^2ulӉˑ[5ʹAc.Rƒ[[Xy/;ubRӘh2Pex -~@Ad3hF!Rx5҃Q滳Dd6&vq4"ZDĈh#(iTUg: f55>;pI3z6O(ϴzO?>h81#;~{FRHOԖF<}fKdS'hYwUډ&sDYe^Ύtr@{-LJ.~8l C,vV3V~ MBӡ块hЭtDD`EtteϺfO~ER ?|p.1ZU;"ӡ-[&OnU:5'-M@00&'g};-Ըc~'ڕ,nS~LO (7"""ZNFP~[cFk4_؝UMlH5uquWY_}蘑g$ ś?O.uϔ}Q작gJ|ϔ$|ϔWG 4&R6瓈IYni|o_T8}ŏP+lꭠ9D4%:,1Ĉhcx>j`j Ŭz'U&X>q(%u Xyد,@ub^Gɀ?@<ܒBs>[JPS<bHsyiKPΥ?u"[퉷'~$3"HDىs$;=eKpV\& zkwc N$ZWV=jg'-6xv"Q:#>e92nkym aD"KDÚO њ'6W bMl&FDDDDDK$b&FDDD47|rKm:^eX(K^B-g?h"M%][ИS',D'lIQhΑy[c0"ZĈh#&X AN٘gG.x$+i:u1i>ʼ1KߩԖ ޸31" 3"0쮙|'LQ`.3BiЦKJk=^!P$0guFBi.P.udg}!Mdx-ynS^0Lw)aXzd`W~n 3[[>.7ߝ٤H-xDJ5=t{B|=N$"JٗGZߙM9G%q"O ;|(aDX#FW&b}RZ)6R)UQi);\Z g.Ru6MESGj GR )SmUMȍ# Ole qFZlIԡvwg6ōR?T O2Ƽ:؋īaG,`րDN׉k 1=qDDDX#ijbDְ&F4' Ĉ !zL("L(0"ZĈl5b6#-[VI^r9حi֚f]EYVbaGŖI1 #eL6IBdsUe?'QKʩ#;i6H3s=#uhS1R:E&""`&FDưF(eHJvF S~֦rlT.{84`"uus%xzHku^ן>Y*r++HKD E<ׯ1W&6u٦:>}&""ڐцٻF^^n^ͦ&At' 3ta.VA1!6,$- |q, .Fq.  4qZL3\E"6Ŧ= "^7)QMC//c=RBr@Vƒ˅1%)-iX@@S^ʮJL!_ZkJ|SB ְ5%o]e([!uݷܾBuRK w: 1}>kwޯe05Qmk%3,sGEEtlԘՍ}kJ\ `-ɦ]^Y"u31"lҜĵkJ|C2wc _m=$n8lzg(IҨP(^ 2kCrrGEủ\!/݊l}txKw .c&FDVr~fOMCz uŻĵ~ 뀞n/|lB>^-WΦe0k\UAN*_9fѝq[#1r:P~+ɚ]YLÈ^@DEΩc/yߝzz/L k5yc^i} kd""":31" 2A/̩ Ghg*5* rXR} ߜ\ӥ,+"<]ƽB޽"ѐ VjǩȨ\{;R] Tnȧl/ѕa2zy%tWR'E{l]kfLQjb1)q-d}i(}mRZ~ZO<Ky/N #47iFf*YȺr`:)%F uoWrN=b+d lHF60o]3"vKBtU.Dt 2A) B/Q,;=3C}0OFД) ̺f,@{yGH94ݻIfucP#hF[NrI}nX:&sHǚ.d_"c}DW0"lX#1@kJ|Z\ZwTKJxu̿SB>\;B4S͗ ɦRNY591p)ߵgkjc:*_rcbČ_~|=3iAs/aT،'Kt1 #ˆ51" ϶1 u#W{x,g:0q@{CR@X08Ýdr5xÀ6s#.s[KSܞXQ27iLfL1tLH kڹD8:- Φ;|[ ""DtL&ͫFۻO-z?wY"d[wU[t4NL_(}Y@L&ĈZl&ű^GQayw"\M,`fiQǮ?7X#51"rjb .-;v54.9fbDDDt݈*2 #K]73DD31"1 _4 0*D1R:wpS/JY1#pl:6n?x~YsePpaL29>\=odyeJ< DDDtM J~aNM.?TG;Yc>%k\bO RLh3FC~]5V|f|ߝ߬eW[ńONZVVddwɶ[LnǼ^+n)qm"^[ݒ˅1%)-)iOSJh6_u`tdF15%]%}KqMrͣwl#Tm瘯^tY~{kKFIar5wXSZksl'LD7A&(#$UY> L%.J<ƃd2 ,Wm}f R07 ZxxOF!?otqaynGuLANˮ)Ԇ]> z`O<)ňzxd)F&-uKnI^! uu3=!$K~SB1)f"?{P(&|p7Jpఐ:fןF;=>IeTJ2I{M "" {g:K$o8+gb6iI/ǑCm#.<ҋ]8[j?4N/GG5`+Tk\LP.l#ĢS[hVso4eL$ʞN7BOD׏d޼:阯0^WҊ| 2%V_Ʉ[w*OsBDt;v]B@RB]'t51"jX#51"""""`&FDDDDDmĈ[VLk9%$H~O0m\TDU&(LTJդ m _yRA rt0ZљODDtFĈ&$bk_kJ\S>d69__Z $){5+6tOl?WOlvAy;'W]_i 5/茘Ֆhc]JN jQ 6TxR)y227i GVqʥb'|u#Vd}X0Z)ŗka11֮^FC+jo%Hh;z>NFWys'%"":uCN .TalVSb)<]5ŬL; h(OW@qm9SB?"1%>ҊwP,Ao'fl@gfP֍q٬z#t"f x8,n"zM%>Q0kP v?(wqGh:(>؏Qlj4t$B<'YSB j>cJTFkDDt1#&i '`:}#C3~?H&²g5$Ha~z pn>XD0q`W5) :1N-V3B60WB~i]xD.qPBS&Vn19$ zlSA6FNv=!""O'an(qm_:nߐ9%3ƷwK]:&S#c 7hDn-՛fl$ˁ)՘4[ՌVBmc?v K{sArh'& 9643!볋׏Oyǒ?Y 80#o!H WˮV\i5~Oj~Ω^ٛ{Rl,Uf)ؓAKՇ'Q #tttH.d޼uo^#ڐ`)S"J+ȱ1<̞It­;-vDD=b2x:I3A Rxy2пy_"5E5""51"wMZbM ĈzQ1#"""""6fbDDg*b'Ohئu:;4R:kLPg9b>)5~nfbDt\Ljln_zc]kΑPZ ƺuFyGq+m=Q#fbDDmcz+5Z.|E3h8:uxx/W _r"bAJ}Xlٽ&E 2{r"fvLx2lULDDXyur⠳Oc&FD7BN _SAwRSSŸgJ9%` 녯}z0 q6 }?heC4\.)qMo!L1<]s뽆`=Qk{f FRv|VLgEvSIc>,?ȽH }Cyu%O~""kNuDD`4 H|A2<%8[qoTS~xG0Ct  c W˃u!/pJ{YC ,o-60i9,\))`}I,FDD7kbDDmXJ\[|헰xrBu{kR*[@f3 vnA/Wl~k\jwWs<9%3FMnM8,TrL7;"p| 巌dMhSjFICqE/H[r(>VedX0R9iIC{]7jP* I3^2׀-OmSb53#}F Wָ\?hq.&ÖCyuDDD7d2:"d27zu dΘ2%"?ރԄ[wU[t4"L&N$",lv@5f o^؝O)|m|9.kbDt=]ŚkbDtU&FDDDDDĈQ1#":#UI>/B+61ߙoQLzb$mvhhYu;?2/` r g K83'"<1"I1_asO'ʃfPL G\PJb+8Ǚf( cCٝ%g\s|tο=4"aMtL//Fh GV.Oآ=eJ1+UҊՀfs9k?ʌ-ODt 1#usNM.:ZvDD31"lҜĵkJG~A?~l@O?|[he׺xX3Drl`_1ѯe.Dq"'r pk+kC4+etu.{r>o5@cحKXN6+&[O_Ԕj-wGL:PԸNu|˾4 cq+; Qr:1ڭndKKkBVфK '3x-ODt-Dt86U$ȡ"$-9w{2@2,2,-HsO Мޝ@`PZD6ifB(_)|_ LUB]lj;4(׶M)<(c?R.h8RNծ֗@5`Is[FFHhd+ƥjs2A8SsKTͅEA?X4]K#tttH.d޼uSB1!LP{0WZD:wA7q 6sU=8&=c&FDUĀҊxm3DŻػ / p.L fbDtm]L΅]&w """""6fbDDDDDDLۘ$r ?V6GOhP#bj,jܱI5DE3w)%Jcl-4>i9Օ,5 xz-f~:DDDc&FD7.ln_VZ{.1l&-eng[!^<ֵ%8,n;ۚeRCہ`%}=SBB, rL94OFzbk!A!_ه8+˩vT MTZbAcWͺ0luVˬǗ'U"""jLn#Sˁٹcb\S3}Z׾u=8>؟u4ҋWCRbbz -]?T[ue([!uݷܾBu@|DbԮ@r05%p0 4YL9] ۆd2AigL=&]~­;-vdD""̓s9j,O!łF|ߝ߬ 2lV15.jÉnfbDt#䔐 95$'15_ZkJ|SB ְ5%o]!gzcj hJ\SKu=I.Ɣ0ķϊhXo7P;cXr=ӧ>5>0F ۈk7U[sGEtlXE| T:~kIi.Dt#ؤ9M1_a|_kGg:$Le-t ΆЎl?YϬ!A ^ uݷT{f!?onaCvXo7k<` e:<띖܎:e똂]SnąBu-'bDDDŚQ`%il)ֹsj $c5'coo-bȝ0LlVjVWftgwz\lHT=9_~f|"""kbDt86kYmQVɡ"U)9w{2.l@NF\xdpxD6iI}H̵1ؐgrMDc\5.@&(g(F\˩E38R<flܖsu|"""d2:"d27zřVߥP/mHf vƔ)c]~­;-vDD=b2x:2O7q}43$ H?_sFDDDƚ]OW&FDg]31"""""nc&FDDDDDmĈHU9ńO ?rTjI1ĩ ۬yؠRFZ)%Lq33瘉Mr1).]~y~sO~:Bq*S;J_Z $3L[ܤ ijs 9b.;fbDDmcz+:_B4@#{L sJ');, }03;<\^rJRs[N]-5SL䐯LW|fȡJ1'5Kͽ.dj닇V1;S"tI]BĈF0҉95$'15_ZkJ|SB ְQg[,Nv=(&Дz)S8vX9exmpLbk\s[>NKF[Lϊaـ qm}ׅL F\ڬ1j~]ևf^>Z5wXSZk?F""KJuDD`4 H| I}#C3~?H&²ggMӻ XϬ!A ^z"t°.D#'f^aq[y!+eהK\(-60q ^ 1uG܎:e똂4lyó!,'bDDtE&FDԆŻĵ~ g(^iJ\.cƨ=Ͱ靈'Pe_}8˗ ѝlH⤦Ԗߺ[hf76.bj8,TrL7;ڭڇMDDt&FD7sjyr+&@EQ oɡ[h6#5 {ChK8K81>sUږ2)eGpNmxh`_?RL* ʞ6`KgLP.m#Ģfܖi&""LGGG&ב]$ɤy(.Ҋ| ғpjY[wU[t4"L&N$"!̓ iLLDDty&FDkbD7kbDtU&FDDDDDĈQ1#":#UI>/TD3g,bj _]jL-aM7h1Ōj4DDDW31"I.&Ue6/b/eϗ3 [n~9^;paͳ;敎>~7HDDte1#"j#\zJUh8:>;jh_7Z1+wlTYJaSDUZdظr>,V=|rHbjBULQ3,O!ł*ͺ 3AV]o15:uCN .ϫ2@ e439ȽH }0gKU.GV=\DDDW 31"lҜ&阯0~bw-#D3[O3kH%c[5ǓC~8T&Ƙ8!1ze+/H~AtnѴJOqcf~:DDD 31"I.7~]fsV|y!uE  pkk17y7wE&(5?9<3Zi%\k|ur*+s|bzN;#Q1#"j#ӋHzޢFP`4cq2y{xhePS=W dddm*ݛG7)`큜jfihSwg&-z[d$>o<@!!ZR}XjJ!_DY(4jVf]~ uEceˉs ""zэ`*sjr9P=w,5_ZkJ|SB ְ5%o]!gX2Y}{(dQ:Z'1%)%>9&W-*.O3kxmبmyguy֒ ""э`4%DtXSZw= dz 'HBm"]6Kj0[6ۈ 6g#m؛G7$_GSP9cƨ\h:o\QZ ^( VT8;gffuX8|嘙oFwvEokhԎ_~f|""KFuDD]pvVG Ӌ_P| ؏xm#.,-a"prͭ}Ic6|ͤMZԻx75GW:{i%\k-tOl?W; ] |3Qkj4C$jٷ?FrϺL8cxڬń/A-ThG9%dBhy5ȡCK}VNZ'#smԟ J+rQ?7k qgL;4 x2_toc'""ĈF0ͩ ;Y=M Rv|LgEb\S3}%q6 CRtlBX?gh $ cJ\S{@\S[gEPq:QfZGUu]09;)qM` 4y1ۈk7☯M.z:""k6iNSZHL5%x<mxY/Hz`<`}# vˡ]nTLj|u7N'ƷnH +#T +uyH+-<ۘtDDD31"Nc5mYJ\[|헕RrHM$ ٢ӎev뀞ͤqUg 'ԫ.v:""#9QL&Ĉ4 "5VL, )qM /e[)OaMk%Mـ|#aMkJ|ߺLXoCF\|1ڎ /5&o!ZDEDDD';э`4 H|jvYl.[g֐ KU) IDATzdC.3XO<dxf1t)P\/eה %8GEDDDƚQ;ftgwz\rJ1fցQl&c{٭i&) lźI嫺lPSjmFkbDt86'vSf5%V/HDكVeG@z   3kÃsj+Ujd2:"d27ziV)NAuG\_EwOc!":dD"<TJH?_sĈz51":Ĉ`Mu31"""""n]o7N]_zEzѩt"Q1#"""""6fbDDooz]6Ĉު};&J?/C;yeS|_mMQկ`BM4K7>ӋOwm31"QgGO}_~w[wYQ } ?M|~嗍m ;jo0J(~#_/~b/>EO_{~t;feDDD731"9R?JG_ˡT%ajLPS-&/ޝ̵5f:+ovޑGŻ#R1Q7':N?JuMкYSmѸ}#""jmu[@.ţ4W1x۵5%){V2c4 pa~v>EݩOO@+oRv}x1{r ,7h߈b&FDF:&H~ASBjo@1CH-̓I h8:䔐O RLE&(#Vd}X0Z)ŗka> }w~3]L]e6vI6nZg}ńW52ძ.͞T;qO'эPsPPxLM%_>v+s6 G @@S@iE~RtL2gCiE~Y;in(7; hq6 g3(I{Zd6s֍p5wXLP} 9&`q~r21?%XVU3ݸ葨P%Μtqӎ> *=͂jh6VAW[5^Ӿ\IU6э`4D] tx<ԆQ" v v_c^Ԩߧ7)G\z1+͍oNTZ}7}fm =8ɀ\uw2AHoMk;rr6ݞT:ӉDDmXJ\[|헹~l4cMwtODŽ3~d3vnAe6`Wjc;ߘpXHQ?o+9%v7ju3.+,^;?(-op9MpvVG 6 CSy⃅Gzf@@_ .LVelO&L,#0ņ̹r욪i řWycPo):rJk79ˆsOꛍj?jmU{2k6q--؏XFDDt #gec2xnQ?WnʯkWH5mH暛VxQcw,;K㫻'3HDWdD"K&Ll/Hq̓s8Řkn}cwq̟giѾŚ]Rנ}Z+Dt?DtU&FTp{4_qDDDDDL xy!:>DDDDD31O}i'_@a;­;HT~#ܺBBDDDD31\߀<`?' ͫ~Orꏿy5'୿؍B{j??$/7XbĈ6FO__.^_~YY^U[ԗ[' !pNC """jQEA5tv$K_~%_ݤ?1j.JY跄V3bm>$*_n_ɏznE~+gm??x?~+,7';Z#Q=>O.)> fݩ*jo^?U>)AL&SCɤ`b&vzE*ܺv7;(&:Wd2{bDD+2nxwtaQUT9nsĈ.t7;(fb&FDDDDDmĈήximwG%31"""""nc&FDDDDDmĈΨxwG%Ş./֝^@DDDDV0ˋϙ9-G!u7;1"D" CV] >XR|GUOr-۴~2rd% fbDDDDDזW/敶[vߵ~D[++E/V bvfbDDv*wG%Qo= JU-dS x~ VޫTR6V>ZD'O~IkMns'~kv^O{bDDgou7;(/7?5'?_DW/ ꏿT_FUor/6 +}o @k[n;Zdb~WD1'MӭD_]H[?o: INk*Rl#ZE#2Cls#MZ$ǢTh;Hq!XuBdv" mJ"i[7;1ok^H^kwbZD&o|[bщlQTgG3_J(? }ߦ`b_@8znzn{&96.h,!vP*V|٭FM=\8偔a G'_)} 3҇ #K"÷Vo-Z6sP 34^0^1znYFbATB_|$[xxH?u@5ZsjMh[XwyymGX5BquZS˃LO*Ǜ=fNi&ttC\p(?6 4x# י/%,~)D]KR1'FDDDDDmĈQ1#"""""6FbDDDDDDH(e#1"""""lSDDDDDH KĈr@ud7xD"""""lc$FDDDDDmĈQ1#"""""6FbDDDDDDH(e#1"""""lc$FDDDDT:V?^P{VEτx괧#z&t`$FDDDDV&lޝ >Ļ5u޴>φ98rƦWROQ^8kSj\!i斾- FbDDDDDI:6{KE[/wE۠{\B,sT]JLw&Nπ>1Nҁ̕y]C VI'S"-=u;@6O/B: """"*u!@M~y{u6ӆ8-cʄozwP>';[-? :lur L#t[2as5Ťc. ]y(#,lJXv&<-/^O7oiOvVxT(46N#1""""3%;2a4# 6 wk]r8tIkv b퓼Sѵu`uk8!6@{eY@tE5cZ(>T]oFw6-}XHVEgXN$""""*@+bQjS _-!;-ީ=׈/8Ņה;ПA I=5A,L dYqosrwLlaN(?;T(k4ڧ->sc{4MwGV}SJ~aeT!I:PM˯Sy`2W&ROM`[i^y6p%E4]ޞJuOT*iw;׽(0jNCsNRrAeّ̗JٿꈞӴؑŊ.~+ yFҫvߵT*G'И?OwCtkv8:Ը5Gʞvwaر1'FDDDDDmĈ.QRktB܉DDDD)yRuG3N񀇈xQ1#:.9!&/۱,8:Z>}#:JuΪNDDT#*|?(fDDTKߥmFRoi"ʉlFL.'FDDDDDmĈ+q(uYpt"Jyb"X"*MĈNQѻ:~R %}8"(QSTHDt#""i+9c 0'FtJuH'&b$FtzHDya$FDD"4u_% Ҭ69&3,\<”7}bDQ:4 Dl}t];O%iϡWҐxBжº Zu.sbDGH{O;H" %7-61\tjtΩFn -rZSkOcͦؔ"JJvfCnL6oֲO;Bt!#:Ly#:'?࿣Q;l\Үدt6 2y;/‘;kR64u׆f3\/3[s_SgbLw!@AgjuK%:%ɏꟵn+~姙c zηalVs(QsK#1""x-Zq[*cAգGxy #?wu޾`}n=tPhs]lbxy&+f%'vf n /bB_|i}<.h*cD'0'1D""/> ۦ[F҇VڨEW+uv#0|kyö-nK25 Tyj205ΐxf%7 wCkWr8^8#" `xdь-ď4i|+o߫{_IB_|8KVb~ LQmF崘J?/TE&ou~ Y0/'!E/ZVB$D5l~FT*N$"".Y$pt"ُ|)=(oeXFb(yc{]cDD܉GڣsR4hNH#"'xEZ3$د6 454Nr i]ުg<24QNẻQH~ls@^FAΓ mG' mKww ~˗S8S "Ĉ(>?KyqpsP,u_YnN":TCcFْTXt%_e'+zK)3Xf%m%[:5:ԌM#S8w DtFbDDD8 #w͋vnY=omo"([mSBF-5nV2([iá5y+Ď,pD.a3ˌ8Az_)- )tv׆Q͝5[iw{ÃN:)嫌&fs"#1"""#CkͶn䅼iȫ]iRrD¡5 ؏[ҫT~q5e+i]^5G?*˳ECk0rrr+{Oᐓ:)AxQRktсCo! CahOqKbŇʀq%zXҫV`ŀ}H_خ=6j/gRЩO՛4ábG Wi[+-^H96'uS [;#1"@t:%BN:5]'WRVYFb{-O7ڴ4MΟf*ےV}p,2MVH>AƿDD 1cM^Gbs)c""/?{$Fqux1(_;@DDDDDTre#1"""""lc$FDDDDDmJZ,C%:sPrjG'Ss.'l4' +N&"""BO֎H$hC\w0#*IJF+2v2 _?CS͐S<u ]Fb[kFNu<UЖZ3$f,\Iy+y!|h^ԋ{ IDAT-#]mi_w7nkw[ݖ>|ۜ2qe dbض- 5m9\ur$Qs-ޖtaѧXbQGmie}[!0?LTXh*>cPY\jS폎k %s[}GR"m 0|kE%ᅿWΉe{tRSňΦ3xѮz:ڊ~tgii ]O:ıP<@{ WY>n.f;rh~e<=%qGX2Wv%m;{70- %vǞV$"""*I9_^I L_|Bz}O=cc3FD.$^mw_|Q! ƫIy""""RʑX|:V'>ktM!ScvjM/~e2 r_ICAޞJuO2PT仞B{BDDDDDG'D]t m/m#"""< aDUVʸ#1"""" S,5g҇WN.z;W|!:%N$""""*&7RJZ)AK >}d.n?>EL1#F.Q 0|kاGh#p5cla_l?Ճ :5wznỎQT)C#1""iw[R!NQ>1""ʒqrJOADES+S1#*E0 VwF{د.{Y6ieiOn(Prde9C.imޝHcjԔfpP)"""bǜQRT K=5Xwauہ]DoXPӍA X 7Xt6{v&}5\`{yY9<6ׄZ) w`ADDt^='][ ?Ε!zC49Q86{&zE5隬ḼfEg5}cq\w@moU}kurBO򽍞w~XNK k%o]|>;-yǷ^'_#@ Ǧ%tx-$Ln (BY|)% 7MkWb 0;6Ru4+6bbH D *zuEq䝖a;}^Sm7Nmo|` V]N^ E2ٮVI PVaT+4ZTq1""ʄͻTRd;VUX %R{VaJ~ HNDoPVo/-ϠdٰwrJfrecᾌq 7MPe5%-#$wCͭc`n ȍC,'CB`' [T A5՗g%'G3_oٚF/BplDVA:;g@!P%fX[oǒ\~@mT'5s!ַ  LDW )\^9ԩqy]CϴԓPvp5Ju啪lR7NJ =bˀU=vFYNʑ>FADDt )',1(&/7<4 cPzj;'3hXz*՛ a!cpI?(neB=L9fI_Uާ]8ì! 9a+s?;j89*cDn?>Vj<䒵p7Ͱn+KZʐ*0'1BO7,kT 34u[tpX@}fRCO .Yꗵ7}E*=u, q"7s] 2qg1W\ F'!ʏ͂-bvx1OR?/ wOP@<X섐O0LYf27^Q{P _ F1#""w9s XyyS#O|/>do0ȋ:pI_-@D9q3bKFma>N Wkfc%߽Ú yuF}zNR8z`a@^EQ-RxO #,sI?oʽUiZA-^ K_.>+~Vf[I_)V`|ҟ/G—2f\b8}ig]y_8ʚ|^"YO}1'B+',άOu7ܬ9vY)D"""" pǣ,S\.BĈr#8yގ􇈲Q1#"""+CTd|_˳o໽$\wN!#1~" / HB| *!qgizVgprP,o;l,f+P>ӑBS+{>%z_IC7tj;!Yxv/iO)(ŸQH,Hd?]ʂ߃:Ǫmi(YX7n9;]~!n.f;)Cåti1"3)H.o /(OM]9Obvd*Iyoy2bp71I7z-/!qDpaV^h鯗V̰_GB5X!Cgl&Rd1tӍ/u4TD6-uZ+܉1?,#c_ eh0!K{hDDtL=;%}hZ+y S\?Qĩ@)R#""" **] J0#""" LȸFbD%' ADD#Nގ&%:FbD7%N$"(w,ѹc$FDtf["""FbD%ȡLQ1aGDDQiwS*LfR?H|P1XL<2^0"""Oa||*ABH,{YPgQa$FT<&Q`$FDDDT~emZbB۵l*W7Wv&"""*p'#қ._s2 ,TݓDGl616FbDDDDE 0+FP/hG&ON 5:F P5CvL6Ms.l8TթgB۔ܷ *Ĉ 3s+Yi^f[|ܖv_90Дݖtf&-}xj-".Ǜmi~,]BH(+6xg`2rzwUR7 w1`e9Q1P"=$4Wk\H>[/lhZS_{;@D#1";y#ڊ''39i%lqy;b 򬙵M-9D" 2j-1$֎Ѭد_ӆi0#"ʂՅ{=7"1`jbv&MY !%'2aJ*PVo/d]"+?Փ7{MdftfoM W&X:Ditіa}uf)[+8(={.=Ck2fԚ;n:USk-Nߘ.UjtꟾT[Rm>1q{"y*ˁ~A^ @ף+jͦgAv&Kц?GgÒ E[Z~FA1n/G(cslE{jn~[EmyoYE@m:~8U]uڇ10-*V'))Bu`N+`zܩQ w<:,x~ܓ=\Bou!n;Pšh_o'nߝ߽+?loKۨvM&vr AmL*FDa$FDtd?z>t-?]``,7@YVxT M  Wk3Br(xӢCL:10^"czjBށ~owaڃX3zwUim9 }sk }?k1 ,"bcGsSO|V?Uur 7}Plyp{ʥzs8?tԷcF]N;CT8:/2٬w.5}ec :%c+>;-/G3 4+Ay ZZY ii~kF|+w@moU}1=}aW:n_;Wglʄʫǰs%C m*#(Uƛ*П(EZ2kX13{OǷ^C MKK;Zr),3W|iNK> O~ gr\Bs\O1(N_Bݖ^DYe;>mhtsn}Ocߙ5<.˯} AUm 8/iȐ'beDSGzy:U2!}RVxS?WZJIxQc"3xz֜o6z;b%SZJC !_0g}P1ЁO-s1MRT_~hKaPT"Fb?K(669~/8~6u@+iȔ0^˿[~bՇ(_6v7(AAy0-$qy囔bJָ.ؙ q%ie2,fWXt'r!ջbP6uF`S;'V\de=wdh-6yxz% y[;Ѥ} Dma>?')|$_#>ZHrT]Ce O*,mo7BS-#]~Aؒ:[]~!ӻ#327kn:~!:a2Sĺ|o=X[c`;e0'qy'j%:`nֺ-c AbSqti خ̪PۀN ėgw'fO~L%\wK`U{{{*joo/;+Y*kItjSiwI쿿__g+i(+K?hǶ Sso]8FщHO=Rzv&scB-27koFDT8:rxs`zY=`h{hԦE6nY4c}bDD [CIGNT!\a$Fah{!/4 u +E/1It݈dԥH0}tx\ DDDe#1"""""lD"ׅJsbDDDDDDHglZSktȉ/5Cbj'?JHglUٖvOs˹|t#hןC(#'=\T\whT*y"":8<}V iV_gL=Z>?tG~t]||Ҭtw\ˇ!m8z#]i-g#rt_^]KADcshJoSsv3@˿CCۏ>ٖ=cht+Kle鯗:Xչ- ; ƭxˑ[mW]Vγ0#"܈}A(qIn"*+fqs? `jsW\!*CJzڊҏ Jhr% IDATfLy]UǴ؉>1""""fGaF\#K"F`r-_c "Qx tw%O91"""";k:˽UԽ)WR64ux+_t8xDC[B˱;T{{{m: T*6 ?Dzpͽ \xTpwhgO9y1'FDDD8 QIa$FDDD8 QIDDDDDDH(8:(_dg"̉ 30Dmǎ[pzwRzSYu'ij?zڱ.ʄ-zXNQO_ gڪsF`<v&#䍫 w׸Z>ȹ7~Hc]|ڦxPD(ϐqtb04ښ0~!{V0Cj}ROM;0ߺmtuV&ԃ"tcpؽ|C:VƂ]C.چX|o`Τ&5\`{yZw/q:Q%dV9<+;kR@h~fkkc$!@M~$UhX2u斾XO=Εngl5!.Ctօr;>VrE`uaئgAv&Kц?Gg6괇C^hɒǏZ8i姆=wLK0W}{ 蘸sI(щaJii@>GaPhl[3_7^X"aI``+Y-VElWϤ PVaDRif6~Hf-c6ͨ?qٖ1FbĨ?U 7M\ˈA1U*bV| ˡ=sΏxJ 63Hu'Q1˩ڎe&囑˱er;~ j{} خwSL @ꮗ`ұzLݰwĪ3y m/+JJKeG,A!NNb7V9fΕ$Db/K`$FDDDDd1+26-y%pKϹrԸ_#ggr8(|ކW9"f%b+[]6 =T>1""""3 y_=v#j}RO V&lmn10\k_:pކ{;^8jt6S[5ޘ?)CށXEiWƴ_iZSOp3^S.ԛã+qjFbDD^DD&| Ϗi6ʄ}iuLc N(ƦrhCX;hΤct)P-{\q!uJK{2D(=ٙtNFkYr׈r;!hJݱb.>Il?!_3K'؊v04ښ㿂a8E`|KD`ʄ-t A_6V8* ;L$<@ &AtT_H|R813ˆM`++l1 j0b\IWk'`}08xƤ3PR FbDDDDDgS{zpt`{9YVjkA:(K(A% (q%9L`z3{b-˷x]"r4KNCU8Wvor L Hn;щ9ܟu>SlZ,2=J9J1Nt(?>:?s/<:+.YoMݯz`u3ksսXoӆ?|#[J ;'dBd*3阫pBɻzܦLPfhс'S,5C~ZSkD<թGMXus@oGOi0b^WW6m?N.i6$}=b.ȓ"%ww7% t^Nkxvl<xn ~IZ̑O9cZ@h.@ 断rB)5ޘ?$ljAJbc/RډO"/݀c`׾Rt1Jnyp{ʥzsxT8DDEw&@T?5qXAU"jmRV;hΤct)P-\>,k]|o~[EmMHA+Iչ2 +XYi<|o]Id>֔n/G(?& ySOG{]XuG16-C dJKWϱ`]cDgWK\Ĉ샒8G~-¡HXyd,7@YVxS?WvZRתf[D|۱+0u$~B{a@xBLOZ;i&[-—R$QIa$FDDI>6vgDs[hjA;9;7jY9<}&VjkAKe:Jjȗ(xn[&Ē7{] 9Pj?3ԟNIF|8%DDQf**](f*J,j;OpQ;+~˖c`Zm@r݉$Nvܟ8ʭt`݀`DD%E?%FRI۹E-o?!L@D)"oD*Suwmiht9! ')he}څ>͚c)Fb#ZدSktjND&ujN|ߦ93YR˻JSyV@DTxe٘Ej.nd-v3k CW]c/CUS""":/GT:Quw!1?L>~x](e\u&Cۏ;nӍ#%""""7HPnۖL+f,^ݣJeL#Q`$F! r`[H[?o ׹ul0!:mAh.$kch*ap]C=67BM?$%RmR2NHaFXN;*oX+h) 4Yy׻ޕjG;485JsTS"pFUr/O,<^qJ/ ?42ǎ=Qe*%R3)]u 8 \c{qU/tUq|V/w+jTYV<1s5u""":?#"*/m blp@0f5ͼ+\p}8<&uOtT 5!""*#1"2~ (}jֽ) UR knۧ  ) i5x0!&ܼ`$(5x𯝞TU_Q2txxjBDDTi8:܄̚ʌKHm;ToKkQV+2erܲK]K"o 7尽KLŠa^8JaDDD}bq2Dtu㻝Ϸdl5J]:`Rh̍ ׵ґo?olnL#R*Ꙙ].=FbuQB1ԯf/CAHĉjK/k"lW^֝^b `ȕUl_U!Q-`$FDT~·VS$#1[+f7hCF&x\ c/j1_jH=> (Q~IqS* ^4BB)U Dvi ~l/k)ޱ{9N%e) ADDDDDTjĈ.]%۠Tne`$FDDDDt) ;%{ 7kBH tW;4!e+YJM84C~T vU}]g92G%#1""""Kb>9j'۵KL3^my>vDEg^љ1#""""R'˽ [Au-aC}IfjnB\[]F6"u]3`fM LפTv@4.]Y#UΊG|l}H5'F[ϱro_9-uDҩMoش[~ T1gu/gWHTuWDDDINN<3b$VV' W׾o?v\.wg͕F,[ZcޟDKqaQb |=7{8HS{ 5*FgщUO+-JKҳ ٤-sv/PFd߈Y}-ؘ7 z\Ϛ<ls(-s"69@|ls m0DW6u ;!G!MR[\-|z0v/}Bň}b;D ቦD="~ǴƕIu7ZGb ش[@Bon'F[;4_Y`="}m7>2 ˀ'n6WM?Oj=Zwv{Po[?oPB(w H֊D"ЬEK-z"hvG=2:0"1vzn  -$psg-ytm1,nK$ #Z&SNܴ#v;IѝTakN2h3m zDbu{RdqXg-kQ9%"*;.LLsS]h\. y ae^93 !k~Yj` L h+iZyi-z[&Ն)eQ&&tו/H˖:q+\ `` :Uk]; DNҠX=J-$r7bh-xRw;-|Ѩ9jE5ڌ1) ^C9"}JU~rmDTjJk MtoAG'V=atAHHdl3lq@-H A]њ]_p@ҚatR(|+?i] 5{k{5@+to7y˔g-bQEƒہ&xf=VoR݇j3Eq') Z  Ef,l ;AO䔪ЕSU IDATt ܋cc[s;x/8ET׋/A-+[NPOt/fNӥNpж嶳THDDDTje$ĈZs" _5[9ENOX4jgUZG*5WY (ߘj<FbDD'qZpt+ůmNM GNռsź&p1Y7DDDt](u!hzzy#,J&rx& C6/w{|rV0J˜1Jn9fQPhG,T㉈\1#"*M'ʜ1} og4~-K_VWas tI%^F6\щc w!_c PXۣWMҩ1)jNWͮ7i՚> cXSY|SAW\BIZH%ԉj #1"8U<7-k 짶:|f>gM6l;Mg!O|#~cl-6  ww"N|xXvfl'3)?^}xC\ km>!Sʛy3XZh0EbJ_".ƠjPP%E;]nx~q?>RUXXwScw_>r pd)]7KPJS('FDT;+ů¿h.=tjZەaC} 7A`fMQ.\Z[lu0" Hw:_km Pii:Ju +2ӵt{WV^>}Xh?K9#K')+H|G|lIW~tjWUd W#8yKQ5wɷOc^A{ 'F[; G.6\#""u>M/-!CiWN'JK=cz-lYHؘ3BN먱'2c|&?YSr aSHR\kv'w!_;RuۚYʮV=(r 1 BP^. KCx-atvh+Û'xU.:@ATaɄؘ3ǺO0iv7AuA wH)#MD2Rza:+0ݕWKDmQ'zJ|q(-.@lat HSC짊6uB;-U}GӺFv|j#1"#1 @}]=Wm-ת5𦳭[L6W=Bo"Nm> GF:`g{Ӟe'fMwG2Cʈsirwː(|4-q1#"*LʴCn%$CHm!"hmC'$.ӯw ZX`8i<^7Y$2b,t׵ Ĵam&#:l B[gNF2k,ut׵,L>9O@B~Ɇmw'2: k3;sEcf H"DbL%ե3;-5r5Ty13W\[K|щDDǩ/>DDY([N8a$FDD\!"JHt*bU /LDXpˇѩq"""""RcQEJHV%!'2FbDD(r7cVq""qĈ {CQyFaq/Q ?Dk'yqZ՚jys6Q9щVATi8!fkH@Aѿtj U},xζ;YYWlgۦ{׉Y4ؘ3Ǻ-up"K.rۘ3OPjtڳB+-g-&L(>WKX/$ ¶!|DM=FF `$Вx""rĈyyi&z~_ z\Ϛmse-OAH|ls z f&ou_ G7!pls(-sƜ]b:Ŝ1g}t .pvg]8DD]~CiWN'JK=cZK&3♍9#ƥΥ \ 㶫wG[D/N-ZGf!5Zw›"[3gM9i [_}@@ד!.$ #W#~Ǵ%w%CG]mNlVx'.B?G_HZpܳx63%"=]~ZdfRҳDbQ~Hz@ ӱ}m>zF[wuuS @WFvջ$+O4]~Du=s;kJ 8 0i> |ѝ@`\Dtw?UpI;a-;;-|%숈hĈ6 UkMg[+1,臀bMV鼒_]]!ȃNjVlmÈq# =zs߉Fݑ3/tqx1@%(W,{Ѹ/FbDDT3چO^0:n ~`OH}xdJ?Mke(i*uC5LGt$= B['!3hFH[rɰh*8ѷ3tPʑ"N4gy<.\CyHW֦|_hHz쾃[z4aHA8Cnnmy^KF==ZªbEOf%^Yv_48K^C@viy>VqUݰ>PKwYwz>l]`_r|>_4VI#M;VCb USbY'iJՔ=kjJ>sUDtU` ZߤjPc>U J-؋*G'V3"JE2^:|7i$?ܰڇ}nnNkn?,5PB9a025ZP;|:}ج)Q4nmHLnKS{"Vr"2P gX5!E{G¥v߇0!k Ѭ ~c8ta%ӄ<;;p]yFN<`DDDDD5X;^PU a6i>ɿrځSGn[RfFUzwdnTr#Uok}bDDD I.ճ>L.K,BryYt"*Ud6!@d|@FIԑ9'9A=ro0@y3jۨɟ!l(/9;(}—?Fig9b$vyh. GZRL`Ƈ-KDZZH_zEO$GFjPHL3ksc8 &+Sʛy3H&2ّ a$F%ўQ)2C+_;]h _u@r|ǡaaAk###"""4Yl}B廝hKf&:H SD}bDDqlU}ح_vkXX2f8=YӿtG 2]();yv|oSeGr[Dk( #"""""*siDDDDDDtΑ{Չ* !"""@HDDDDDTjĈJAP T[\򠆕e^=#1"""5($%KdHbWg 6ǂ~_mh+o.,Ugn̙c˖s8"*-vȀ(FbDDE;isζS{֣\.w'wrKߚWls% ӒhɍӈpD"=JKүlJ["~Ŷwou_ Yul-s"9iGDYg0DW6JzRDDDtR#"d *tUT؇gMg;B?$W1>#_uBm~ .>ۣx4_^ Gg h+77іoFDDD6-JGߢ~cx8#ߞ8Ej w ""JQa7~ߺ;⬗i-hƐp%q|?9Xok>1ښﳍޙ%!P7a[^iƇRSuB׿ěE6攓"c+|:OEST;侈|pUj30Dm@|tvmC'zF't׵q6h|lp$ A~J(-z Zló&ݝEm%$M "JH*4[}\+1gZ@79cZJ67ZGb UK?$-Bje@דp+C'ə%Ħ@r.G3OV $Ld{$濬+mrV0 fSIAsߙFe2aIFS7&wwID^21yct!1گ_p/riT1.N6:U xi Emz{2ڍKlw;r%L \9C(Mr:e$m9j)W0酭~x|Ul3.˥np\R0E&'L!1$!DD@ŭu˓qu;kQJj;,/-hMib?oR4& ˻cc.Z G;벛$o9j,z+Q9忈'zY ̷)NE4|jN ;'1kbZg""*l}JjHfU/Zxqȇ.~ɦU:AWo<I6WJyL CͱL-ݷc0u-g4|ZHM쑬39̍S։M->1Ѩz+`}K"zYC佬mGVj39)a L}O5n.>ep)WC \*/,[:wlKӯ.XDU~6x)U DAȍ;Ǽ3ώ 8bX 񕪉`}Jyr$wusRۧ ؋Ĕsc80頦p) [;zdtMtvpqAlugl.[3 <KsjL}BqF1 U9]0\Zݠ{a0g[}R<7[9e{O:Q'GvحS\/_j@ADDDDD%]_ zujV@خj0ֶ>1""""5-۫A Z}"8 ?:"1Fs} H0%"˦}"q01cDaj/1U!:wĈ d "CH-QED)0#""lSʛ=!lW«=g H]d>DDё*33 &c(ez՞D/TRƇ/ok;Zڑ &,'FDT3Ups0Xku ]XR\k ;۱2] ` ܼ-'v}nnDĈ*a^`/q0!C@5{i ju-zlH45|RՠlȨ\1]F1"H0&@xek9]c-CGK'~>K}h:hdOqt"Q< ξU@~8|?0B uw ^= |k&}6cHN_nU^iQ b"*%B2眵."qwz)U MOt"%x$qŰ\vnԲ_" G'#1"""""R<1" E@@,|p@]Z_8' ^$DP`$FDD|T 8O9N^""/*yFb*7qD@HDP&FDTi8:09v7߻C;;gp{u_/]6 IDAT7hkB&qR`s,8ێ.UҜ1g[kY*N@}~|^HخbdC\ó&3;:W1>#_zV. #ߏMk\ rFHәBfE@IM zZ㷼W';GmVo[?oOM`$FDDDDKkLX9s1d7d[|P@$mQ'Ov=w>8q`|@^?mLw];򉼓~XjӍQ nAQQl+^ u:8OvUR.'N@Y狞hgܝOخjgl8u@/SXrKQ5YVWw\Q#F^ccN]UkbG0/$٫ُw.;tו V|;Ɏ'* c"Q'FDT2a֖ub@ 2פ Lק34nDt2}>=c}t02i O#+֋+VuچO4)RGw2wHW,& jam&#:l B[']c}ј'2ߧT5(s\9΅zqIEO2ڕPe]4v߇QՠTkXڮx*[N'I ]d .A'R<բ mt+Fb˥_rHځl':a} :b;tɺk̬^)\Fhh{[D:CIV2+sROl/q'N i-@.;ʀSHoR/fe$iHk&`|=Fs}x-=x|`Ty`Eb@څoߤf Cy;"q*LW5C6햗׽v[|ݹ{TUMN:+XIvc.T:#i6zY8Xօ%yE8g!o4>nG4ɻdUpq"QqbG)8.I^5}֧7QxK+vddhP\,9K9eh+ӿ_9=RH=Ĝh?'3Ǻyc~yTNJɎadRN~Y_MHfV jo*>1""N4"1 za:NFfDÛ"u7ӢNNjW""'FDTnZ^Zޔna1+pw彨^}GqXudU+tjWB%"#"q yɔD"U: kQqQ8:2 6i+ԮB%"Ĉ \&.$26j-2Bgm9U_.ht qt"Q%Hve.T">1""P8J""#"""""*5ѥ7<)jJ_TjC/zC3ѿ9v>fK2g;Tkoش[s?l̙,LDTy>77oy8K}rtySƙs;]6e:^>[vS[}X/$ ¶!|N3ڄyK$Вx""EĥH;@s{`.?2!uIYa{L<+Y I>:NmnQv\'NdB}TĶ>TMٳMDTѓlR jܒW&wmeN{H5ɷ+Mze)Z(leqט>?}-.p|ls3:2CteWZ1s|]K@ƠL.YSr aSHRptֻ/\?͉ (??|! !o[͓DDՄ+v9]3|Ѩɺk6Cp]4767 5x0!#߭wv߇01G+DTkɄؘ3ǺOĢ6t[ ӱ}a+\Fwqy}&):|q(-.@5JiJ\Y5[hNE[szgݙTHGO[]׃cN`I=U}Gz-5SDDinS<0ܜZf#8K'Vaj/qP#K;Wf̚1"sUkn1,J1O &Ei4uQexF.eB?W/{VيٹwLzwzOxǜ XvU-y^~ ss2y^;ہ`L֊M0ZmП q|=7]cpvi}Q5në9="fmCů96 +-x ؀Ig6m'Y9F{k*5LGɆmwn͑1t/ W#7P8o@G!o :q)g{dI%ܝGCW Ndt]VCBqxxX Bl!tqt >YYdRWOB'X>R;cv%q!ucR/A-+NPpt"QW\[K|3"ˋ1+q-#Io3vg 6TIbNg5*y&"'FDd6 6y_e./8bjs% V<sźܝg-^;:/GwO[wOKBIcJ6~ߒVe mu %sLi<1*z\p{[~ "He_5@: -z; :`!vt1Sm\mƇ?}yg~~Z; GKDI8ʌJD" H웕 U˙rffJݛǶ`]3]v#pľr Qt#'/F/7?qhQMa$FDt[&grXM_ Bo"NW?֊t\Ļu(g Q߹D|zCHv[G',P8~da@[l uxxȡqeWIJ3+ET6'JV+'BjHeMI™%W.y^fv.5& )Y+EzKX^'U>|bSoD }bDDnp\m ,Ң5!R5bAT;Ɇ8V}RU4OQ5*DDDDDD>1""8Ћ*ĈJQqt"QE`˚a(#1"""M *FbDtir"*Juwc$Vft׵lC|sh멪= ӿ_pJ#WuN-6߻k3;mrǔckv;1gu/_4}+AXVW sf~ѥ7pw!_H]qَ~5:AW>vu$;:O1ں{CKQHD/ Kݩ.~_i[DOR;62'nINX2'W5elUat9|ܽ@#KW]!r`j G'YhzOC ?E]L]'}GkANcA.k|@^hWZ1/Emz9B2GĢRXяa7 2[L|&rw/V)"""*VĪP-|L\Mnq# 'X}粿UM$cP0o Vq7mİآd.~K}g45`s% c421@*z mC'Y|;ECox2+-Ϗ9`g-Z0P%Keĸ<ó ®@5Vw81e7$w}bCnd)B$"""jC_Ɏ8<~n .1Ruֳ>_JUCjqbOeQ7Tu.79e/A-+NPpt"qݿ/62kW>]ZSt7pECFDG_qTQEa$F窾i9ujLi -JMD)GY&OخW{ssRۧ">77dleVUረĈ&b'0[dFD;.s֧)DRՠTMQ۠YCcA߭ReH>8xawe>5x8x=-T&4ܜ Ϥ5x QD"""Ecư! dTy_(0:1RhDZmE72bQ]3R^`/1?3k"hN}bDTFyU;jDg<#i7$Ĭ F''˘q8Hͩ2eщDDTqBbH+wCDa^50jO.B%ZchH<ȉDU uiK'#A-y Bb$FDDDDT4{  8x=k) l Ša^(Hʤ~6ǀ)[d^Dt)h&o.XQ꿺6>i;l 77(QЊ_xX^_1KΧ1$կE`e r|@ģnMG21@*KHX(AqxxP(e$HSS'P(iO)o"?(U qN;}R/A-+NPODFC&k-hADDQ  6^ԞGY'i^ѿtj7̱eKQJleu( Z+ھL>W݉xV;:H漂l0bں{Z-#Q(n |A9DDDT6kzuI]H[ywZnLPNibN`P2i*J)S#ZRVb!I%bK)ՌRh΃UIB o!$j~ыxc>n#'.D_=s]<]pdbK }^}~z㦉IWaCs 7t1؜9нG&K+Ӭ%ܪD_]Sc%`{Jihe3aܺ[IeY->;m.;rխ W]cq&NpgtcZa(!lst"9<6< yzN$uq*cqYw ;3^?D:OƦGRi?gr;T&3pBפ4qZʚja$FDDGÎ'{ԬKQlt+,TqFѡ0:NVAi IDATũ0;6(%Tkj {&=FD&۠~5z=Mx*>uT4fWtyڹMKEە #1""|r&{9ݲK@ rfwlT^Τ :껦 3w-Gl{z0P+<P!gSiV6+Gm_{Wkq/#1zn67b}u(ܰS[zRkˈHȢڸJP(8ѿ QVTׅN<:{3gzod3 ty}u<f'FC&Kl6|qaD?gt$貆JOzlCMmD_<_ ϕPoDN3:Q!c@BVaPJ^]uN^]Fmy핺2'?vCtvΰبeuzKq]P(#"Cn&{\0.{vGAR gt.P[=1!0e#1""y'{qAh]A=ri?ਯC2AtTxMaTnݜ ;!Kmr#''E@TDDG牕О{Y]% ~[,=206jy2jTk[ǚ=\뜈b$FAh^狓ZЬ~`U}=>tftiǻGR泄]W΋C'wq෭Өε>CS3d,N]ިMn,^oqPss""C3*&hN*O/pV\O՝=ݾhkzDF[· eovHRljDwHEe @O>e3nVVh06\ ǹ9!UKK&ߞzG]'|A]y ~k;RDgЮ1 Œx߱ 뀭bOW-(+*\JOw/?I 7e>a:AMoHMܪP019ߌD*꓍aˋAZ}b-o[~fpG&|7+sD%/=Iet`;GeENDDcX:=щth9qnwDG'R^o(D"""""#QqNFDDĈJQ1#"""""*5FbDDDDDD;J; 8a$FDDDD&#1""""":*bQO0#!""TFBDDQX&QщDDDDDDH8:6#!""}bDDDDDDH ݶ( 5 -`kr'XQ7*4zbeOSNDDDDDXm'n|?k<4I^t 0rQgP`nTQoi LLDDDDt$1;HtN]>vm R(*Yiz,t-=unRJ#uE>>0".=6ŦFTXkLjZ2Gr]eSchfw`$V6AM)C`.gL: "0kR"jjTY\'Df7ADDDDDʮ1@4*$'/ۡy`.'g6jW i6'`0 (""""FP(ݒOP$r"Kl2U*x]AzJ `\tw\&GYQ%K^1JOPO숫P`>1=-j a>ٗ}btxO`Q0#"""""*5FbDDDDDDH#1"""""RSDDB(w(?AD #1"lhRVT DD s뉈-#"""""*5FbDDDDDDH8O8ۘHwS@^XVAщDDDDDDH8:Ըʡ_%}bDDDDDDH$TQLk}ܕb*6T>qP~ADD+Q5>zNÉ3֍.㋧}0wYDDD)Ĉh_[}\vAA> .&_$)jޮ6X[d00}}4DDDE`$FDDe4}F l>P:ԝ729 "C}ޅucWs%> 7Kҙ[79%)jcѻNh3ĈRÉɫZ@p]2i޾9}JyJ:O㋇/zX!o R\.""ĈhjhY%ۓ0<3꓍ {F?Uà&\"'* Jhݘ-@DDTFbDDVmE6ajWh;&|7c+;g 7%. Mi?̐=O,(5BV$\.R(xܭ lʊ*_QXֶB`Q)݀BP \DDDD#x'kʊr7 HPDADDDqQ1#"""""*5FbDDDDDDybDDٸ 5FbDDٸ)>G$Dtpt"Q1#"""""*5FbDDDDDDHў++" 8֮Ηbtu}saGC[BteӏBO'G,VyAnUZ|1t^_kV۔UڠRr<Ѯb$F{o=slF&V)+UA?m2EOG[Rܵ%V)[iU hkJbyyXd"[ʘ˿Ce">dJ3k / 4l87p<ԋ޴^?߾k$*'K~_Ёho ^q7~a~|C;sW;|}ha׏~Gfn@:Zqtt5Hmf_/>=5+eN;.ܮDZ?wߟ <7u߻4 a#m]`y4ry˃W~Am7pN~3sX}~>hc9uLNTTƿ*{[z,2|GUߜ6yMK/OkCO'1Hyſ}z>'.hQ|ՍbV;ӷ<֐s텕;{|~ޡ"ϼ޽Ͼ3ØORqWqTw^wǟ.|Azj>O/vBA: r|P>zdzn.FV k<>t3ݿ @s=~UU{8?YhTƾ./Ӷ\OCu}g^Ogt:]-9_o&չY6.q̚}9Z{_cW;Ht;0{Ӏe]DC#Td#^v055UΆ1-:&;y߶$ ڬ.&|zR࿿~{}rOcwLտOݯKg|ޠ_~\t^@_&ln,% hPgum6sZ{ ԟ:/;qBxAn_Njڠ˽msm Ů{۽]8Qq8OJA}׀G~mDŽpszrYԥiꦯ/{uǣ*?J|uDyhqn''?uJNa w0(4X 8iQ[mDZ{x?ť\ON6ߪt+(~vhroiAޫ/‰b홆D1W!KDN*n=)wV|g߿goڔΆR>>*᫭pqUjtuɡϹ򵡶*.GQJàcثbmmMP%Bڼc}s}ƔUDu矋{Dj扽<%;IEP(2"*O _""b$FDD!$"""p"""""c$FDDDDDTjĈJ5oWxV)+O7bS*jb+RLl Ivd*wV\y0QG&:5rQ7viTm|VJO0+A{>m&\R6]Edn泄]@jH>9Eە=V+vޮ4lyv !O#v奟 sdtiNj痦Mtj>2V=щDDDDp4̭ٛ tx8'5^s_wĻgnX{_R0+Lt ZRߺ_,`NfؔˆبŬJwE yy=)uZzRddL~zMI H)XoM3+EGvg%lG޺r^ډjK| utvS~/YX=;gS).9._}u&xx|xآ]@S9rf[vљpU"52!9?hxS`4F{2t3u=CZF-^FMz+GqJPbqt2N2~Jo<ѷ>e4xB׫ C o\L_K+ Mop ;֭?^;Oٗ*jH9 >sCwMopZa6+zKN6WP GWƹMDy,q-XzRkYhW( Z[r)ҌzlhxSuBEJLN(+F}c!Y矫d$6jqu/">u$IEP(;l@vQݽ@D'[qI ^=ezDDD_0#"U*Xrg%|ADxy">X[*Ǟ~qN/p"""n>1)w#Eg0/Pڶ #1"""X{UZ~҅N$,I!SoEս*|ukNOd \~o}9_+?nR IDAT}È!zAQ)RF7N"AUjxSk^nQ"M͸@'&)e1-}[[1}yjL""$94{*  =}C7p$l_qArڟ}|n|D#ڝo\a@yXg"03ybF-I<Ofs6,dlP+Vlc59<GW67%QۭK6 ӏHODбxEϧWp{zFbH>˂%'Y]C*mCh%Azˆs*)&) K SZD&w"} XWC7+豙,60""6j1+]={ce+U kI}~M]cF3_a^fZWQˆUWMu|7-/Ҝ}lvI%ߩGEF[ODG30/7ӏ!?z},4p~IHt0+Ǧ!q@zݦDx3{<h7eͤuˉk9SCt;:Nn>-=aS]kkYQQ,/7 #r}pJlukU-m O y|t .J*")f^E&Ìz#BtIuukc;y')i%>+A0+-ԃ|1Vс0XPoDsWSIS.A\yؐn}WQu%nѬMmw2(\ž<]N0\w(˧ c`N]*CM)85 '|=苍ZF.=UVD`A ھ=D.W_,.u;OVC+guR#o+VYPcр:= +\Tfm|e9MʲNJQQh,۪e'ߖ'$;wJ/>|ܝ|s: 6jy0 wf?v`J1[ iv,'W7Мh/>ZF]zM=hm'XDGp=+/L/d 7$L&4'jj{t*4rû~>Ce'a-45rS3¨ΪI=蕻N$F٤ĵz3oyklj ͸,^oPk[R7՟kÛTЪ5d355Sɖԟ?A.6ty;1EF)[p[f55r Cd۲;@%M/ zt2>L*R^eR0xv5S3~A9miAтP|VC+rba '""cXYoc'V19b6+7۸XzRk0Tk iCst:j,P @oZ_QZˮ1 Mskr f>^zfFC۠`XQaY",bxG}ß۠|"""*1ښBX[[+wK9B݊rzMN<\QTU /B% o.z;.s'UDuP]kzM=OfYn?;Bz\ҩB[(s<9?#8]'-:AzȑD z!tPj)QZqFIEPH_Ufc}})굾>(l^>Q!RyyJޠ_NngkDZKZS=Uʜ*c}bo;?9u_O~ꎠחCD`$V"Bs\Yj>*co'sxrf+:#]FSPIDON6~v(#pt"f`V f; #ҏօVaD\Lt;]KOjD>>ʦo06-ݍuL~B'VQǦ6]q;~'=pA i8y Ew0Q˃h]?hxS`4I>1#ohI tPsr; (41[Bs.O/&7I9:cgIP(xe}XKbels@=aaycܭ!""]HhSB%lC3":R 41.sOGNol>o)Zξ6˿QhX?ʔUnxy">Xz:)~|ɫǀ*}gv I5ɫǶSO~{B}h9_BDt|kWQu}_ܫ[R˥x?ꯘzDZvWpo 0:zN\Xh zlJ76<1D&lFm4 DךX*ʓ,`FĢ0bʩt91?Ťc49)WQ]Fr|\/9":9\AE%yhF ; ٹ)1L '6*#6\^#0+Y%[2nBU?lB;_X/^qDG#1"'JJw:Jl]0t;`tkXQ}14zg4m}~}ZzR=6ŦFTPkLR{بEjmnT[kU^W#ބ#yVٔ 5Kpϯj,7,c_>{Uщٕ "%Z*[ ЖChC)>^0\wn|{ O<C;UFc@%eݝPf  pͼ1Xm߀e5WlukUfyt=CZF-^FM΂+?n}DH_ns^2oe?5>zN{7ÉGٓTNo} .'/XkWVT)ܒ\}sL̕3vQᆛ+_t1$/ϩy`JO%Wn6@6ݍ^''ux;TVavDt菇_|~w qϿ/{o5{|p,Yr'x#*Z}wԹzjCeY\JÉx8f̼ISDdzSFՕGD0ްT.WYa<36Nu ۔we$:Ji,AJGu wzM=NxM߫n#!-SCSݸ#H\o4]T^r!*17ifxlD_]zSCQب^gn|,7h8|6ߜTB>1"hgӉL7;5" 2b$FS2DDeq9>|~ޡ2}u~o,]ǟ.|A1/_T~o3N Ůط{/Ӷ\OCu}gbn-DGG'D&aDLt Qzkİ0bĶN۪5yD菇_|~7y`sg}P-WQBcT- ̸9=\@i۫a$FDT4[ %_qvب3rQD}KܔX\du.gOtthylUi62~NlÅv]l2н@o1N]TAtgD_vrևIB#c]ĬX1Eg?q?ז]Fmn1`t%2jSFC"m_nղff4>iociez\&G`{.{6'W[xq*f[| u=fyљpI[$pAƙTJZ}ho_QZˆ钋z` bѺN`qg܁Ux 2jlzS8"МJ^-~@}]uuW]fkEx hLjgr53鴺!-b/ƦٗIDC:lKOr֦@sݞ2QfPBFL-c0jhNJYw0VfgMǐ-XFTƇRpjɹZާƒUT˺;=nHAfA*-TTc%ea[Oݯ.,Fb38u՚o|~s,,:=Mx*>-.|Al!2MG #^mP$E}a2|Bq"w!@+ (RxtdvH:bV Z-TH%\᱔/~\#!.s8bRmV feϓ_VuDDDT8ښBX[[+wKhXPp?LYQ%K^7ږݱԣ5-H\,ڃQTK~er>mv!9 vVm ם24s@m-{S>L""izMɱUڴg^eMlsf}uўNx3>qr[*o\&сH†6,}s ȳh mےWw홻-zhb$FL.^M [JwF2W;>a !wRnkI;[Zc3YlJ9m}^}^T%$Ģ^& tQTmBڢwl1*&]V6}mMAσl3n{1#}&'-wzMY{ 﫻{lKDDDDhig~0~:w^ǒ;ێ'vKeԦ,(Dre9.i|3ԢEl"u-ЩC*_GN]0ntYZlhNQ2/qk^5W@tV.{̨PVT D 2N{[ό}~23+$ YH3.폤.mhzڠ:׶:%n}KRed!=dCM9EĊ(d¡}w ``x<趽; [7350:k]lc/C&b݃ז];*EmyǁY2kHYmݓ>yalLa$FR=sp^ڄVJˆ)RYY p=5 ['tMt|i.5_qrNRYƦGdv8 X-r{r '"" ѱo~IKpw] <Y6K F&۠i|SgdS6y<.l87U0P+<ɜKusU?N_8X[[S(kkkn =+ X?ʔUDuo>xKF-S53V!{P QߧMqge㛓P(=~S9)pQfM+I9U-DDDG#1"Get:H}Wӕg3=":DٚsJ_zMoꉕc{]Hg~cJI璞0t=qd3#Osc."3c$ _YpHc&L cY\ӑ`C˚FΔvk&3Ui:,qvLʃ>!~piORys]:W[-=ɨ__ҽg[ `% H_[٣JhGQXrX*٣J:ND^٪JARZŚW5b%$4c9g_6W|2X37ֶߗm[ =Um{|M)rxs$W\"ZX)*=<EM2vvcB.Sˍyۍm3$ޟƼrez:o3۾$"3GH]|{r?1JV;v[iX -~dn7m7&DI/v[GΓJ']Iq/*='L `Ņ79! _/X\HotCNn{g#ԽLQľ7{2J˞ݘ?[Rvܒ),O[+A%{Tɶx!6d";G/ї<1)>TGsN=zɞZVQ%{QqϏ+RP{ 7L K[B$8"{-{nxυf9<̇Z"Ip!bwR>O˵ `~cf=zknLx{/6&6Cf3L"VܳݘK~\q7?@,db+NHυ>!yBBy>ȯNMqH EH)+^9(BQ֓PwF_|eYt\UGf,~xe*Q\ ~k-{K%To}Llofp_h¯o?cVK"d+A zTk2=T^"""PJoyz椱@wOhpChADn+ "ZqH~!bܳ}!  m7ډ(zJ7Ҷ㠂}0TvD -oh%g~QN21xS D41=>is,kU47u~cYʎFй%꿮?zB8|1 ySyySM{%|(|ɨ3Vt1grHFeQY˼hy椱V]#l%6[}V{C˞<,J);niO(1!HmLNR{΅صVܳUЌML@@CI)U$ ryu"ś,c‚?Ki7Ȭ6Ivd7JVv<2qP[+Y"J頱5=L nf8R4.&-/D8|x49x\^zxkIIjM~9eD^9쪠e$ʮ/FGl{ljW%;uJ"ŷte۷';B`^b)/3 鵝}};9KPa$tsWzӘKM)qqIX2; b ˠP(pDU~bB|ޒ=W{\??[j+Mf8؆ y{3ꄲV!9aPdbL ݐV6 [mZW LV'ɕPn+ "1:>ZInWvT88$/ԛOVZ) @&ℛh:[;SY˼_gpi9h&;*)9HsіTK2J䍘c'P" UO& )_ y1鉬KB؀$"Cyʎ[Qyz椱k;5c 7kn}\NtKۍvoe/S䰞}0St|+ygf?1ѴO>NByTA{"9CJ+Nf+@"Z<ԣMsS( ?l* x~pO_=ATvE4*=I%N\ 2tS(j\H3{u?=zk=[ث,?'Yڵ}"*n`Ie|)sShv-JƋosiܗ֣J*|F{3ʚNm!"k!i<1P4.N&Q4P(:XXXP(;zWqVهtz󝜎/J6([Oij P(p?1l-CYz|Vx^}8:`uZrXe=p|lL21tC&i"{U$Ō 0hkۅ%6cokUŚ"a{; H5dbIH*5zs-Jv :ph#^ثۏ*M@!H %rX*٣J:NҊٌ:N[[pkK-" kj\bMLat6:=X98@6 \ l)""r(Rq=v0Q൝۶Z>N 9܃Wo|3􋟘']bĂ8 n.Jkli9i\ d jb7P(ZS85׹vw)m""(՚V=7o1ev#4h/U^z⟥/_e*wQɧ[GцGsd'_4j衉(F T<]߽Bm O8|7XLg 29eOFo{Vzr@;mg{#?KO[6$]b_S5*uܹ_z$0G*Vɔ/A|:τl.ܭ;O I"CìQPa= W'+V"jXHɧ[;䄚p25}-:X]6q{\^zlaŷuH  YCW r5.Lnv9s =p;H_&h\B=&_VhwS$M;. StMtNm40Y3DwZՇXvQ?soVmbUpj{8sY!WY"5{NN% _Aa#S(A\R<͟C̑/N(w. ~>F]({NRp%)3DDTzltC_6ͣwOpo3uSϊu'6?z96{5-!"W6l:8I~+`Wk;wjMÈh-CYz|VtO ĥ-9P6z2 nJiuìɽ}`2zLlY7{ŧpI|>SvSTwgO#_6}cuN6qV,E2\"lږWL8C,xx+щy۹Ƶݲ!`m; >ȽTSÿKʬ .U1_791JDD& I[?\S&"рD ݝb\ąKO\qϷɌRR^_z?띧7Rj:ak=ƛ!Wn)UwSiq<'nk<5%VdNXN+(ld 51X?}5Ʊ2ÒL 1'뇶>W,jX^{m_&=pq1T-Jv :ph#^ `I0""W5۽{.G3*PƏ =ím/!"ڲz,bMLat67j>.8O l)""r(Rqˢח/3X}3j^o|} %쉼_3yqJ7w[;3KoݭqU v-h(U[gN)L -{n%z| {|}94tQEsVZ(J®-ʫeg?]QqKqd/>c%PeL `<>xJOh'6y&vzKZOOiSvddWqVA3*Gvm!"dm K + X(՚LOhv-vU-c\9eDP8!je%*i.#"Ҳ羴U7*GK D[_Hom9Q?+Uŷ4 ni,n{"Vtz󝜎/J6 [62Bk'![>o;dz6l8: ?op DsBB)GˆS6 dbkKH7&db2pe6H)\; ݐ21tC&6ثأJ=Ze]VVc6۽OQu|YC'a={}F5f7dhi{r ` [ֻuߘݘY>Nd9G7im_n|r|(nO/J ;7 [{'O~i7wE*PƗ_:F  vwX3*z3_oexkk;[|V^sJ>0ím/jxmu\Qث 5C'd u-{g<\>üWáJe-?2>Ȏi3cZmDכ/_)qsWo|3^˼m ?bP嵝T){1Ԭ۽?}qU}@n/sc*=N /zR|@Z0[>sq6|Gvb|WӡO~!9$[gN 6w$ /vNKכ/?->&}JDݭqڕ1 [ojL,ôy*dr0"f3OKl<3]Y%k!"+D%꿮?zKnUGY3M풎w(N><4}A4tw'2t[qq>}5໔KQ@hkŗe)"3Oc wmhK6ƤʲdV6/S7Tk2=Dpt\,\ʂf[,_?6I̱+ۉhk=ۍ?SnHSm$DO'wі;~?lv%DCӃ \] ~Vf3n I!-mcrMCBgE^cۘ!=`=s2=kV'gTצrˈ~!ߏ'"j>{dWY*:RY^Zܗ*֣c-#)w5;xϯ-V-m!-Ƣ%]_^e-gTX\FDD&8ii^|Lŋ=y_1&baaAP@Q({:*+nz󝜎/cUicNJ\\D ql)z.%;zWvR(8:VvVY>ԲRim%{ neOkQGE8f[JVjKXo:):.%;zWvBM 21tC&n ;@:'զT9` H7db4JFiRkZ]fRQ5J[|Bqݪ#dbyZO֏|l)T?n6_:\?t7xx&ҷ| ewHJ\F)qqIqF粶sf[Շ鮯)_ζ^݀ jb^¡ IDATƹڔǨ\L ָB|I, 21 Ekk8 dbTP5tmeRkwt^|c~i9b䛴.>6K&詯)Oh^).5s7_yVKOfZтj?KRV.&^Z(21Elo o>l jdz9?NS矣7[?㳚_DD{sʏ=_IFN(2xW<;5j]GYk9/毦eooL4#] o_RQ<}_Loc|8vbFp61RFsb:a…ͣ{JF~BWQvN_Ǩqo ?sry$FTNY:&RqX2db+u_]jZ[_v w =&"rX  ^ q7j㭼b!Lf2ìɽ}`".נM<\-#h9:&"h4_ O=ؿm+KDDKm֣Pk.!"Y`RqxShNFDDJqOZөnO>'p/5j;a BQk:h2po7\{d}x6;ܱ&wEr)Sscw%q8Nܯn&'q/zS921)dbKdNil}$dbD6t-BPfzBּuBs ^x=۝I@B| s8\0SXTY*VR WU}2o`5B221X]2涫&epfw*싺Z}9@z!ku%c>'$W xL56,M;u}xLjM?Q酺#b:ww}n#bG4>|QѬmz57  }?׉ݸ'l$J&S vO^LjӘ7l 84ye|*&W%D ?2o Sn^s~"}Š^vIIMm7CyA=EM:Z=[3D'p܁*2"M67.̑y5DDTQCs~5%"~+~{{}漘 Wvdߞ]~{7%C<8O ֆub^ܥ)譯n iLwM& ^ $x+i,8KK ˂>L\SlM%hN#H%6翼ּ+WD'׷':oF{ V'1vdwMFφ_ Ep.Ya,4Akge)ܲӅ=؎K,ڧTk;% Z#% zS(L?Zqm>|=db$SUVe0TYQi{з;ӓ8ptC&n XZp=lə\['2+kq%O<.K\)zYk ϯe,YnmRv 7ov/)֤Yөtko W[?p}KXL3B&dIcR Ρi貨s$@ZTL!6۳ u_y*^D~YlP(X19.VY6KR%TLUI;Ϩ8D$mMr&9ϔ_mНqr,{Ue\TkI*ĆL#\KY&Sd12\tޞ+^M+ kXtFջ\m}Mg Bfhwi슌)&͇=cv8i$x뾚~CMm2T 5?2l$XqKCE ։n\088z՞\07տx 炞A|g1&5bTsa*7e-y -q]@ra o@NDD08lrE_ *|UDD#-ATy]|Y%ZiDnsĪ#F*Kra.S$‚p=Q]xd#[FH}5jMW=jMR1nM7Ï}25|,KoLw^r2'詯)Ȏ=jMgum1(D#H4=sSt5~<_z6|M+HX9#T,8rbꔟ19DD??!b&" k{W,f},2z:U>T,& S*K+3uAQ OtPr1z]dEU9 /$昭PO3\P7pjӎchAwpO ԠT_U](fV $:l4`Y u1 VBbd_ǘRe,y+|lyFt{8ȡe6ɜPhNFDDJqOZөnO>'9]Sq=pvNy#tW8zp3蘣{ '& Il[2ɃD+XXXP( :P(sLd%)1i\S\&v!n)RBR?YIjjjv"&J\\Rej?X/ «y:B҄9f5ԩDD:]gi$"l}X!``[ِmr$RhY?o݃ݙZ @!H7dbiT579S1:%_T=.3R:MK_L.+b)Hj=eo>+G1<∸`B&jNS>{Td,}CeQE2A,iJ_S >'{@]:k}~Foc}0&چL,\CVOF= K/A6DB`aqJuIDYV w&io2OLgx6=ؿk&u_MS6i|= gfbMIbƽ4:L,9ervF[ҪcmsAOB`p"+ ~=s\pM.zYK/y,GE t-OtMs-W.WE2g.K쬸^`'8 /-iDnm8\%E,c_*jr OL Dpo a5rݯ{:՚*cRU]l >25nVk |!p q~Gs&ΩyN@l(Wn sc6|B]>6VOæ"yOS_S?H_1xdӛBk2brvLLE `_;Mc6WyUJkY=>km/#sZM*D;PQapJ2~9h.ۗc9ӱ2u-BM#jTT)9f㫔RD$j0u2/\VMM_ևM_Mm}/p}5_:'τJ#Tk:{~+},|O;՚XpBmcBDcoo{8٩Tk:]AuXV0%)Igrim2TF y3i#y'o>P m#G.ڝҾ2љ:\089.˙!a'.Mvi\09;bdDqzx/ldXmpĝ8xLp,뾚.TJ-b>i+q>dB%Ebq/1Gj‹Q)3=uJUxjx|L"YY]Vl˲C2ѾSD^"ml},r"`!QJ%l=u/.D 4PKogT嗄8 9iAwC?1N@tTCY広G̬نgľ7l4`Y qѾ|1K5B-oCh 1įёqN!9[ 51EԸ#kzԧ ȬTQͦBe]pSڹHDoBsth l}XSHTد G]_w՚W6P&!=cȵLOДfSpҬ]:n"S?p"l0B陬 "8,64*e;9MYCo~N5d+!,UJk)/u3?YRUJ\\R:ȯɿ+fFd^ N9f5O*XUpt"?L?u+-cV%Z @!H7dbL,Ÿ6KJ. 2؞8rmz3gT*9MYWvyy\=Je<.3q_扗W˚\D4?Jʰ^7DTk;ao@Znm2^ n_Od3gXdbWzjЗx}b_;5;n'q8E]})We<;xyW*g>"?ΚG_,%sw=nﱧ8 2zb  3b]댓g/68eM*ǐ)XBцeك*t&WD䐨!&C\{eI8 $7~I*t̊9(4eLX451ecfLu6&ǠQfz.ۓxaMfxMDw^ o݃4qt=id@- 2i_f7Wkn&WQ(ӌ\m}vdL#8@_9X:a$"{wg u-O3KGE_ *|UD\3 =Ճn]J% ~T.z$%8w]\A˅#D q5""2X aTsa*7e-y@ɳD5A\H;3)LE1wkE^54"D6sb1tb"!G6rՃ$9W=()U߹( ?;#ܶ^k瞸받^;]{swfWnX:7{e|=k ܤtB*opD|Mѝ\xD#xm6,O,-O Ϻs';:k*'"}]^U7_ڙc6RNOB1q8}yQQC@i5PVL~5hhE,SGF.TV Ŝ#r +]9´(/N)"GvTCյ4F"]نcRQe%qL)njTIbaC#9A67?Idy_Rg5DD_M5}kjL$za|o{ c.MuO8$ߚr3Dny{Oh\J@q7GZ|&"鷤`MR5l8҃z;N|ed 1D\AcDsw!"I׉}-K6WG\qrF Quq#?9#&bi;oj;4HgF¢P%ϜMqTĐscNHGDEϊwΏ.MviLL\dK1r[ؑx }DN>A}:]kl""W[n*P')"-(Tn~1ӯ*$1+lmQInNT?ޏB=Mw-feK%392=X abǠa.Ն@;rǾSD^"hAw.5 $&͚NaIp?1L±21Ua>S( 2z,S 3*SK;{{—s&.ۛEuqaiZ:sE`\#r#cM/dr^'9}5( 2+Y۾sdIc^v.*:/sU++K!J]=5|M_'!@Ob#+ܤ:4eXX,Q*KR8yhNH؜CϺa8=Ȳ|=i˪"[J ;ql7e\zY 29%;kI,Q̬BYƄL#\Y1fYgcr :>=OII&I V #S4 ~%ZwwT6vpqbPQk,n"4qt8bFٻw3j 5PM7 1mvaJnaDA&̱|Kvi88 䢢Ovy*""Bc:1 ֹ`pEqTT5aw IQ16xzxdt=DD(R2+yyzɨQ{;>5 tG[!.z՞\07k!F䖈نcURTº:?T4)<UNrz^F#w2TkkT?l .G| 25|,K>Pz{[[yſNˍj&Iܶ^kӿq=jy]rs` [(sSt5)# ? ܐ`鐉G{T.ASbTTqjbJ8#T,8rb19DD|bx6$gqGeC՟sf5ϢRt bP EY|dĨk/:H<#VETToܡReGE˱Y|d0T]K|xӈm8&U9ֹ`pųCR Qt$*'‚0u2]V¦nfæ6{.=+^| m~'9DkӶb܌z$c|ة~΁H_!cpTV9O""n""~+?rH},J8@q@&.燩]<8~QODDB#8o蒿IЙ @beRed*qYod#q(<:\089.˙!a'.Mvi\L"!"*:? 4{GA]a%zV^!sM79h}۸"vTϼ%A6m{O 䭼b>Qfy$lx/_ ҧSTWBiX?ڠ;h2u>[U "1Z҄oLzPǟATE]$\|xg鬘cBF<*@sA=$ڴa_a{~@ ,*kB1bžFO#p['3Ir|1KRY|Jlmt6[Vdz>kjb+,}51 51Xjb% bjbTk2=$db[qj nRak\ >A/6+eb{wsg/Lv)q,Re)ڔ2X7X&xixn_<}B) Xvy[xrNCE ;v <]φRˏEjk0eJ/ԉwvn *fY  ‘μCâZFz؃,/wqcg\Pyheك*Bu-=bYq=fSѳ +F&&,b,)tZ"**K7XP)K2=9&1A քIX2Dn.T N'dx|=fY,mqfo2C&z щBV`_lpD\/yD|NNEP)851|dĨDqdbJDdSB 0CR4ڗc9ӱaF`!5pL*Nѝ1dO&b%E$8rT5ݭl}f/c|֩~fgFޗ=)o,` uLm_hÈ͹S5(, 2 zY#YJH)iut[,_L9e*:TB#8w0ga|MHghwJDglsDWcg|$/gz'o87AE!"fr1(\Ɩfrv.ˈ8,NH֐h궋?prmVPBr22(𐉥^щ*c>6P$1z%bՃB*!n]ѡi|!1l-uuh.8LҾv4K?1C(7W|s&.6zp['SlL塊0ǞJGce_ǘRe,yċ,N׍ZizdaM{w՚NƝPkMK?J'qtGQ&=(<" Ep.YzC4e UW.;Q]PeR[KP|?Y4?EH#Z?..)\BPfzTF"}VL@뾚#}?QFhP[az@ &ko( 21tC&nR73=ME]mWMfh2 21CZ~q;}E921y`o,ދy,v~> 5.ڤgvnƴu./f8֐"4MvvOM,A!\ȍѮAiEc9%/*rNΈA( qQ<7p2 #g^XX!`Cg=y\(uߘgOzt@'5 N!"|lK_w~KĈX4]o9Q@d3#rh}jkL CO 6#f t4*_Rח5Ѱ~܊a yyǟ<ת&kPfe ~rQ 6%'Ǧͣ ?ƙU/#Qq1$'+K–L(V]s_Ŷ=x ~:!Gb3:Ecf[e.MKGǡ'ǦMuL׍8m5]8t] >M$.c m. ׍0+$]F?"""KXZZaiiԑ%A.uDoOA ,mj?'vo'oHL~]_%551""/&r紾muĈp90[!ѦLlwDDDDDbODDDDDTlĈ6@he ~nJ\+]qeDKDDDkL0>eDgVسwl1ӻn`XUDD[hQ%km,^i TXӴJ@$4(/8$Z?Ĉ6=X2/ۉGm~a%/r߸&aqWZv4M9Ă ]8Jz?a-#cD^}EñekpI{A866n-(/jDX4]@WD|;R~=Sa8hrȕ}/b%쌆O0oeUKB@swOT&6X\/~:%z4uYh SgĉWZ[,4=09v/ap,jӅ|7'WcF&hM&XtRjN'*Ǵ|A\Exיp,:bAKs*#:[uحt\)f>{<˥V_h1EBˑ']5bt"29Y fbDDOҟ=Fʪ>|tWݾ,Elъ)UhbID%mSI&WvN$5%jԙJ{^`W/WL7 Y꒲)][LB)pG[LB3"!Lk{1bGt{:su9rOC+OoQaloLv^/3W'{OszrlԪ@̀b-ˍZ?*P[.#YTԊx,UUyR6%AhԷYsvWf3f5)7htL2 ʎb2jox[=ܸsګϴpvTdԦ 7sטRCs Z˱h}vQX^G2t>dƟ1#"JL-? MrldTq[Ad-4UO58u6?fbDDDDDCꊵ:lhcTcQ1#"""""*6fbDDа+~syX5Z>a4hvAMf*,uPy7""7L0o܈MOڹ9'vK<裶}gOoeLh]FTv)UVj֜{:$$yQYŃ["[49q޷x4yO#98zdjCXϴ f c]BDDT$w"QS>G;ʝӅUiF]e7ZkW?< bkL 1O^?Dz `Sz|a:3fcQx;]eAwCut2*M㸸 n:5F?ɱt0Bîu\Pq#@RCΊV \V>&#+KQAQ2>kUۣ.Ŷ=xmVux}wCvd3*;OsddbNmT UwS|$>X\|c_ŧis+ݟڐ6VS[Cլ97ZBJB΍ٳeial\h(=~׆aPRCMF[N˧ݾUηh_͉(W=Oڕ;lҢ(XV_<ೄU/Ĉ Sg3ս媺]8t] ><'\eZ]!^=sOsZwJx&romq?ms;6=f.O\7hVg3܍.s\~1xp,ㅲVA ~yץS\DXZZaiiԑm l-qtZ_۹oBE&WzZP" jb(wNK PDDD눙[IQ;^ Ka JDDnx"""""bc&FDDDDDTlĈ["08r% VL0>k0R Vv+F;mVĈ6@he4J\0/gl~ŀt?$v!Wz|Ƥ>C:1⒚l'Mv^M.!5`NnQq1#"cq+G^rȕWƚF'{#y|g4l߆Ѱaw l#F?\fO5^ڜ^ K fqش96Gjւ 31"]nk9 qћb&FD|vGtȕe49@vM.qxNhsY-]@'*VQ2Gr96* Tj.Fh W5!W:4CSb+OTizW+ǽ+EY8_?^%.f繕 ""\m|ݾxRA8X}ç.hQ2*j6E!eVgmu6S*y>.WʝӦ:,vdu#N~ۄA(C~΍")kuilJ\vxx]t\œѰy?6WK7?3'""" Lha\+6?]аhrmR8hr$Ψ?(OtG4/x!+`;h=i.v-_4&HIJosv-^#""7L();:C,2h pժh4lN! 4<~d4lO֙ϯ˕'횕쮿xҮ4l>A TG垯հOMas0.2{"""ʃQe.s4lo+wNaSʝ_Mmr$oRKm q96' 63MO*r75ʁ~:JfUIDDD1#"/o-}R0gJ >))GR'}*m \pfS4l~pqylƳjJQg3խyrK9mP ;ݹJL6CtvRXpnĜdu#N+`3!W__Sh`&FDT51n64<~d4ltYf=o:ODD0#"FCt%а_K6l'Mv^S^Jubɱ!HQ;U-8hrM=]FK.uܧB{rDDDxD"<MŇ9QAcQBîu&[#ݍsT `Sz|a}dAfq䯙6G\FfST+boFvMu ~rQ ߯x/IYejUl;; {X{DDDTܝHDT:жe.Mh-Tup躼sLpWl1Ov^7hr=ַ iNΙ;6iSRcٽxў'chsY%""5AXZZ*u$DD hxz Lϸj3 iݦVsbvvɕV-i,DDA`MTCsZ_x)[ߚkbD ;v31"""""bc&FDDDDDTlĈJ)0x&XQ)>! lJt7J}z$5#""Qa|v`d;?%xYzyn)?fjՙj<іLh-\FX .|v[ۉGm~rNOt>F^B.% 'FDDDL(ACt{~!WX{ksԶm䯙+]'kas4|P쮿xҮY{J|yYՇ#f_j: ӟ`yhsLDGY 쮹/LkT^?zyIzz2rgDɿW'9mjQ᫹;_{@m^g4g" :#KV-wvoͦh3Bî[;!OUXڠ_oUu-D&W:w31"Lu[)kuilJ\vxx]t\?&;qrYoT: H.ύT_ALyN[HMҒ ,M%&dr{x\2P2Ax"""""bc&FDDDDDTlĈQ1#"""""*6fbDDcCJ,H`px1o~MQ_#"" L0>k0ޝ=A U$Bg '4<~dThbzكF3"""Ĉ6ϞT}7J%/OBovV%}W2{B._<(jlҙ `;ht׉&ǞKC+jG]M.!5аhrɥN\c_#""!;C,2as4|PY>96møU3jﳻ1" 8>Ifq䯙j5y|X[<GT5_) [/|mN5O0L\27hp40ߺj]?%+k3 ֶ>b&FDGY ʝhԪ{I'{r܋OfԞ>̻r3ݟj?mK)1Etȕۧ^EGT5kG݉aN5*٣.Ŷ=(fADFd4cduM3oG]_fo9cp3{ލ ګ% Ǣg*ׇ]Ĉ6 \-\g51~x/iA/ŤKʪ>|t7_n_rF+◩UFogw$̚` &)~K@=g|v\LVL\^{0|6eB8?8]/ھtH%hfALnj K1{ .KX%+l15 kbYj[1z0#"*LjH]Ě=W4*GGRu]輞|ÌbˍMv^7եyz(exOo㯙N5+2 ~Nh9qnAS%P6} 1߈\::[uحtw]%>)L3c}З6@{K4hU#K'w Ǣ#٠%mR@DvXը{fGhѰ>pm>.,K)1Z]ִA=4W/5Q hit>hS STOz}lc7Ub.1P5s~LD[`kݽ[S n1|PChKASuxt* ^Or[խ_[O_ *җ{7sRڎPؓu1t 9> *9Ĉ6ZR5+[o, us=jU5ڤcvJʋč|B͋Pʞd:{geݙ cۙIia戨;lA_}|_pތ!6eXzD﹑=6?%2)jD^h@ߙ&7!s)~R KKK ,--:"Bi,\+ku"_]v){5P2A;ظ;h5lhc51"""""bc&FDDDDDTlĈQ1#"""""*6;h}R@D[31",L[OWrĈSD[$M#"""""*6fbDDDDDDLؘADDD vL:{<{vFm0``px[ks8ڗ|~xX_@b:%y]_<9jj7g*ĈyսFª=VCw#4>k0R/ KDgu6s4lF4,Nkp#W:J/ ؔ3&>x,IC{|FCL}842\6ۉGs s8M= GnHZB.!۰UQɳ+ɚb\tMC̈́6Lkl)L 3H G;ʝ+ /۟ka=)=^=Lj9"!=_G5ZCAfUz|.wfH-/ȭx6?f4Vh:u!rh}j~NIY"$d4/yq/U ƥ>4;\l6KEcF31"ZcrOmjT4*;5O^^:hOtz?l_<4>PX Qb.d^5*PeL'Ǿ,ku*cխ"H^Sklͬvɕ/䁫VZdVR'f۸]s#jOM*VL(|7F`"g m-g=W{Pz;M*P /Ћ}qGF3kR SFZ$ 祐勄-bks۷SiB,Ԥ4 ao}8-wv{+RV޷ke: }avIkتN?( -[K8XPh拃뷚ҋ~0#"n===?isAwW8sW5UvY `v}*ՎgS2U sd+L$hXHh-lܶ|qXթM+FA|o)ݗ`x6C.{<;1LTҤRl&;MtA]cxmh8}"u~1x{&I!)jGõȞdVRL[ܚU􄥥%AJ f!B,~>' 4ݘ@s}OWnz/+W`J*8ߝsbɑtzzw~>_C¬59"!Bdr{xiWl>Wj2P2A%[?JHYZ- Xv-*͋ʘ ܝHD g[O5ުսS6.e$DV4Ĉҕ&FDeKĈ5Ov&"""""*6fbDDDDDDLx":"Z_ץ(?fbDD+կ~Uh:"pw"Q1#"""""*6fbDDkjG=c#"""bADfCa||yrÇUCHqG%=$!"""b&FDTGTN{O:?`_O1WcӳKw'gT_Ö?>7/n4-LOZ04T;n; \/_~}ǘto^!)Ma=NUo+n!|n8bMQ^Ds4)7ijn{ҹ:m9Hoқ]Wڔ.L۵ wx݉uaKG ~[yTriIo/2_zܝHDDVAXZZ*u$DD h_W?~ÿemh @&Wz':mN 3BA]쉈V}z?;֩+"""z+0#"IDDDD;ؘ31"qv ǿ4o8^"K|YGR`)Z3fov76f""`&FDT)?{gjuxƾ\x8z"G {(ZW5nck5{\k@]gJDD.DDy c`1t[ܶh˯bNYٮT@Ŏ*$U0z11!&}pza.b*4_k/z+69{@!VI+.*ʏύy;TGC9<ЫW'Gyygg m-g=dIns 4nҡ IDATIjWkHDD0#"+Lh>ݧ9sAWcv}RgU &'A^az:bRu\џ* gc `arm?nPY g*z{{~63K}Ƚ0K*WlADDT<Ĉ s-Q6&Cp GG4ٍj I\X '3 ]8NsDޟV6 TBm00zW =˼p%~B Ow@ԀSrg7+ {n[ 3ͽ6Yg4JkG$dќւhR@D[$R#!",AEå=="\=+qLm$+{c.%6̔w<%3B"Ax"wZ%kH|pŝ[3c7ϛm{jbDo#Ĉ ǚX ωEKDD"""""bc&FDDDDDTlĈ659WVC7`mnOA=Zscu/`hh%;Yn -֙!B*[7 iq-<)ɠDDT2Ĉ v罻z7@ֱ}. DJy=sC{R1Pwh[*Y!&sԘQQᘉmTMz?ukAbLcE=x=nT;gue c%R}xc]Ytw5Zd~oRo+5˷j3ZiA2{-]IEJmIqW)E6[sV;hM}3=8K`;36 fbDDy]2CwZRHe,|Ss:psB䂪G*1F9b9;p2:b*?ugv9 վ{ >snTVOi*0﹀{(:7*&!UƘz:S.۴,9$zjo~y ~rR\^dȽ&cf륥}fuȶiPj~gK;hS]쉈P Lc鶸s/Ћ} ̅^LLtȮI N/ Ƽ3DZ@B[tmt2 S'@oqz;K̙ƛe6ȹ YTUbG08R\^d?0kD:Bd!Es +I?,+_dhsb&FDT;zw&3Tv4>CutJmƞ)Q+T?Ep {tw}1w0`7h3[㌐{]97 fm_y" PӜRCkrIͽ~L`s!"b&FDTn|{ Ef4Hg nVFތ3nH vl.TcVCBdTmbf7=R;|"ԒT%ʽYV-gjqY?YxՆ-"$y֚9Q;Ԥ?m36`dFDD$R#!",AEå$,c;zm˒,XmfO֯7wk'+{c<1c&FDĀyG݅}0`8 zfV9w31"̘eNgbDo fbD 31"""""bc&FDDDDDTlĈ650`jfmÅK ~-7:[dy`cu/`ѽgyO!ѕ@1Q10#"*L!Jwa|Δt`5t<{(u^ʚfL&翬\1T@1o:47Į@DDDELh#ī[ r=*Uπٍj,f~t ]p/x=?ެX;3Z-ZoB/Rrc ""ba&FDN\Z ݗoj{bXnN6jJpCs>Eà ]{I)ޓ^ONwd*?"""L(|=5 yx\腔VUiH}=6TJ(T?ERr`$mZVv?"""*fbDDJWYIԏN™~]&W_S}j?Gz]ɼœpr+"""*Y ""} +p~"3Yjb+ڮj nCO^}g";Kwx_/@`$dќJzmj?AqG&k;Oy)w +lq$""u$,-- TH6 Abpȴ0`{J|@D9J^XӖ4"t pw"VQe{3c7MRGCDDDo51"t&FDmf31"""""bc&FDDDDDTlĈJlY~XyOs6LВe=Fwgey`h{םJf~""""dHb t{[|Nݾ1ojعVga'rPMǓa ""z;1#"3nU5- XZdY*u+QIŮKlՂ)hCwּx|gouv /Ӭ37>@ĸYkj}v9\L,WlA6)fbDDy]2CwZ,m_n"GC1w_FP=4Y7{.#{΍"BX {( F==yƭUꦚ[}VcL7s}?GPǍݫW'}k<оDO>`!""dhS Lc鶡NSs2JUq{:̅^LLtȮ%:Y@CG,x-wVsc^"8l\>8GF_4Z { OQ肬,\:BdYHDDTZĈ* gc `arY*z{{~Ŀ?G&Pg }S? z5{iN 2݉DD9pj]u:d*QmԆǧ3?H|jƾӫW $LHȢIy91)'XqH}h|ehZ.z^!""ڄ%AJ f!B,.uX%mfOR^_=[>XU$*L~:mIc!"J'w'QNjcZ {_Cau/c7MіŚQ:Ĉf&?'FDDDDDTlĈQ1#"*1s]{-{ -v32C<0iL}L.ot/yսqs3naӬ]SDDDD[31";|@JzGNݾ1ojؙbݤ{(J~`Wz"G 8ta9Q|Um8MqCG;buksGe<3i:旋i`ǛUpb\ICΞg74gXLg]""31"<.Ev;qC'0k#/c(ߛ=s=WFW!cWwUO=sTm47?yZOY]nVaݗojš?x}C1s*iu|ܸݽzu)f$zIs̝';6HSRI*M:hpe +.* 4t Tֶ7nC}JGƼxEHq؀{UFs4i}>\hk94>Es_Ybet݅[%s̝ĚQQ]_T54сyTv4B1mC0`A)ww>e`am'Y[MU?Er @{(9~B92QHs>]~orvmDDDo-Ĉ s"V6Tpo-2ճ7=NM[-t,SxH3Ft˶K03/ g[3:Kx-bC=TFBͩfFޏp#'W tO is_۝EaiiIRGBDYKEUۆ `jH6HX=[>XUn$Z3\+kuڒBDNĈ514NսS6.~|DDDoĈҽ51 kbD ;v31"""""bc&FDDDDDTlĈJN~JXܼ9~"K|Y]Y߻5XgV݃ս*N5^-2;0x;S8kv~?+jBlՎz =#z̿aj߯M05仡4e""Z?mF*+,)3^p:{zݨvR'?XRFKs<`hj&i-oU3+(-2leHxc]J fr6nOv5=Ƥw!8 IYYkaU-;e""Z7Ĉ򐲣މk2CK ik#/c(ߛ=s=WFk<о󞯦4P=&pDl =1zv:!zJsP`srw]PU43> x߿ߒ'3R Cɚky}C13]$zzt'MyO10ޓ͌?cA")`^ۗNƀJһ~ZOdwf2N$"Cm83zwb&xSs2JUq5#6ޞ4R;B-}OZhP`.bbBz43 0|l9w.,SNY>\hk94]}//Jg<`$O_~-xar d.,{qYE}R N Lp6,S^{_?4fe5T J\Nt;Zv 1{g>*z{{~ fpaKssW&>#YIJ  ӻ*tYrn$K{92[dLDD넙Qa}`Qj& vXJٍj +ڮj q{hU""M(ɽ>> ZiB6BcȡF4 #ܕfD0 7¥7J&:9:~RmVVdQBw1#Y-)%~BGC~fčZ,Mߙ U'ȃ*9+sNWFQ65r!1G64=2vǑ|QDPˊ v%V} Js^n4JezZadci r2vB^tlt#Sv# |ә Y6]]WC1x}?~n\* ;vq3[כi_]q~|EDD"Ĉ*'Ft'FD'{bDDDDDDJX+1"HLdh.Q3ȵf&/\ T$ wZa%_ ?&_jx3e""j'FDԜ뛘g:%zfԾIP$_CvIIȼ+ { nU,mZĞ1/ё.eMmЯKr\@R wH5LjpHEFR@U*Y3fK:*ՌPW<$g+b\eb|qDPTrwj^vDDĈH]fZg\iq]HQ3Hy<,?f7?%y~)ws/e&Llvi!( KM=Ҳѝ*/r)9լ͸l~HܜK>~9mGkF|xx2-z |ӂd氫BI58[$Đ UlRzkʳ(!Kϖs <u_W ][?$,6!fBU ɳe""j +1"tNjDxᙿ],IRK]D`³$]ڍFbYHWljɔtJvE8΢foO9špsPb}Rq쒒 y%7 !x $zhw:V :G[$ӟ +1"c )1lFqoy_4Mk`x0*!$.>t]P]ߘt(m]X$&۶5f;0tPk쥐DٓMKUBC(9-q֖̌#X!w:"Bܟu:wsص%y;7ӛ3kHo4W,u.VbDt#",TbD=VbDt +1"""""vc%FDDDDDnĈN3IE63I lM$HJ6_ X)|eF>TS2[جA#BĈLΩ\׌$7雖쒒]b}"NߌÝ#ZaޒaZ,XwUUkQD&"":X mAȐ4Z@ة5OͪYmN A&-jg+"$qhsJh{g.TCr$-jRE=2Sd,Dm_i1I5h*[iN "":aX5`ZtoH5ݞ (qW9Uy؏$MHSֲ~j Ne꘸-z SÓ]Yq/_ݙu|)U,:ha~V雩aGaXI ƻȬS D&6];ݱ҈b$*՗bNN;S ":tNjtJvE8΢ pX`v`KF~ӂ13[m[,8aRMx*T- z6{˕U vS ?ozۂ&It?,{XZ&2X x:z;%"":#":zv-T2i1ӥsغ=JٯW{⅂Ş۝(Xkj8`ZmD@b~:ZwF);>v1K L=_uYҋ/X+NN8Ĉ[s6UǟsUKw c9qͨʒ3MvY{9ߵ1ˎ{dle&Gd' 3.PnFxlv`@g'H^fha;ݩ"yA|3!":)A[)$v/b&D@z:d2}vM "6W'"~;L.MlM$)["{X<9U:=1"j{bDt'FDDDDDĈڍQ#":45ZȐ3ȍƷ\pFo/ J" $Ңv$j^ݘ_z)J9rb}QGw q&NKJzPb1%\6ghQP\Վ:-"":dg"cQ|$1tW&2İ-7 y⸺l!k`VjwƖ4^WS⋦cܩ8da%FDA]ʹϸs_N5ʭ@<<DwLtp֦TD 7 D_B}D%y~)ws/e&#Κ^.POjp|ĦkG6j'i3^Oz~ŭBfd"C0rI2.%ynj&A+F g"{(lP >|iA2M^9@(GWHxYx4W-*n^2!gSAl`%FDԀ]I@|q(=ܸ$)5]l: +<wRѨߴ`Lgxlo $Y8/|Zk47Rk eR.Olf.aہ] &*{׷ ^w}xƕ;^Ͱ5Pkrt kRla%FDtV[(qbZk @tYR 8,-jEp9լDN7V2V|ghe/vJGAVjqV: g]SDgp=!wmIRIͷRAĈ[kg<αϤ7=<HOHq;s1 Of]beX;*1T܌{,\'naT 7wDS'HWJFajWb{(|Tɖ N/P~cyZ:Xd^\H&zQ$"A΄!oGϺ쒼i48a?~n\* Qo'om0 .PU:{bDt'FDDDDDĈڍQ#"jD@ZZI @V)M$d"C%sH# يY&9l6j쥥ciqf6~LDD5nC7Q}α:$A;'71Y|.Tf`ȋ pqtpP=K!8G[դFwLDDJX9I58mCnL%6Q>>}R2!%(^95؀FhΒJ+ko Mk0(}X6PڻwXթaoCӴ]7u5sj87 F_JzVIu~ŭpNhu}5S2Y#pRqγ6=xx88ހ[1q/_9U ;M~? cu=fDRsjx+[[ᔄ5_W{BzP T?#cS-={k+(Y֖#"j.M֮NLSkL-tXR.=ZߠnEnvXmA6J`/M _=Y8[*G7I>NZ 'P}M]$u-Wg\S[ԿTƦ|5`9tpWթ=2VbDDGnbg-ƐuopzպJ('0S@vIo,KJl$ZQ"^twHvsIZkȐ ܒj T{|x#q?5-QG#"jslxTqFg*ÉdU%f&Gd!ʞ.w`W vi\!Vʚ< Y#cJ]V^+$ $âӋ“Q{-_UjOO{bDt'FDDDDDĈڍQ.DDuNZGu:"X>t DԂ7ot:"D"""""vc%FDDDDDnĈN+N'CDDDo)3ťʍ˝ͅADV?˪)S+3yKKOTn\VWڽ4Xcآ>I OX٫ܸ\=#`m6 5Q~y䏘zDwo/Unk^n~sBv҈NVbDDx݋/^\˿E_e{~": y}F^]ϋՈk\>g\U/pe@ojo_={Y֫4>,s[9w7 c{%#"":X5H/G-___n-ç(Vs7^o~W>dxj Ԉ ?P:]Oˍ˗PHHZQ[#"j9Ǐfݽ-X^,!|2__>UWOo*/ G/t2.Gܛwa_ 31,D:\^W%Z:7/LN Ar?jzۗ5[[DAo޼裏>TItNDDTEŞxu"a޼ySJDDDt(VbDDu89^HDDDDDnĈڍiH>gQkeF͌DjD6~YCUwGDDTQsZ|[$sj8wSZ( .)Ahnߌ:&6tC7g酉Ud|wDDDXzJ+4^E.V ]}&gL`m.d"Cr$Y#ӭɛc]4@&2( R\ m/+4g+bŹ%;-t2!98$Mi1PQK0VyZ˻^ǻ;""JĈHA3MkI5:ȩc58kSq хΩ~LΩ G _>xJ eX^TEKSֲnֽau)|qtg/YV>dWi.eow*-溯s3H+n=UD9k5T/I{k+VZ̈́&&VbDD ٥EϸSk]7Yk$LIS˨7DyU>Ր_ :kD[muWEmV7xAuXk$&{oVﴌbsÈ_HoٕOoI$z+1"cu*n }-Z@xj}X3j?~ߎ@ٙ9α5g˓9I2*3.+ sN@n!6\;oF$~%7ueieO^ ;]]^fmM$farDp 93Y~}a<-fLr'E:%JV&p#""jL NgBDtRNgqrd90'0&D@z:Vbw!jNӇj?ikDUMDF^#"*JR&xreՒ]_mg\ivG)8>u;;dĈj`%Ft#LޱX+1"""""vc%FDqLm.d"CRk9, \2D&P+ m? NZzVPU; VbDDi_m}H>zl+O}3d`CC #Z +1"TCr$-j63I>3 Sr0T;r$Y5ڊ%ϒKmN m/J!lqU_KvQe"Crp4KbؠTwzynJ0SryxwGDD6X5`BZto|MvƢ/rC ڔΩ@ A5SP%D&2 N T LlvX䫌feH,>Cz=[ 8/L@z|~i.b95<ٕ-B,ۙ~I:Sh3S6,F%Y,G fʟ5Qvi:sA3p.KI,n<"@t;I$I 46<7Hşn؍Ћ_6WHSV3k$&E^a/G=MKK'J9lzѫ39-I58I'veEa0ע氥f3 *{ =ު.0[mF)h܃у`Lwר^+{QscMvJ٥;)N Ǒ|&7kSf%]0Z^:>`wzP.l8 1_r\]V^[˽_z{MmprdSO)QϴgxV$@2]7V: ! ; I!Bߎ+z|q(=E.ɫݡs[<TD$rfZMxYx-0}vBDTISs "2[jV|.M~xƕ 5uro7 ffcvGDDt4#"t=1"j Ĉ$#"""""j7VbDDDDDDJXM" -jM$d"Cs3H/yQ38fHEjV3nː=J9GPHAOo6Na׃ك'c6uKJzX\Վq""ӄё.zG+K5l9%ctÞ'5<87:9uw[/jpHE<3BKn\p)SVWj$/jrnI2%Yh10\ŒPܩcj6ĈHA3MkI5+[>R|f8/L@j8*1/_z7҉QnXt!=sjxJ+ ӓjp֦pN ~ Ƹtd"E.46Ys,9=Kq+n=UD@>dWߵu5&Ov&"j.M$ 8^k={kD҆/]+u3Pމ2w; |!ӋI^c<©]l:vQ<$RVckexuwa޷M~X^jץ<[ϸ&?/""{bDDredD:2p XpN o8盾/2*=-e^& hH3WYvm+m`x2wT4zb+Vxp(6%!""z#"jsɆٙ?)Q>N@D+1"|NZ͛N@D^HDDDDDnĈڍѻz=16_}T""":XLl=t DDDtlx"Z_io=^^z*1oͬW^itM?z“]z^+1"&1f)%IDATǕTno_v/z?WڽG/xsyvo+%Ͽ=;ūܾכBv/$m?v -o^x^~êTa%FDԌڽmsp1 \88/Ž%>p^2z߿,~_nԛo{a{DDDtdX5H/Gɓr%0_ |2ZE9JW>qWaY~9tq""":X5kG_z7~ 迩ܸro߅7\W.U: *8ՙ{ܾqgN< rW'"B>!w:"Bܟ?>NCD-xG}O[tw2'"* .DDDDDDƫ͛N@DDDg+1"kN$"""""j7VbDDDDDDJXhj$!2!g*9sQy!Daaj!5n/X52#y^Q95S;;9˽֍SLoF]R҃US$""z?DDGOSBYvl'6ݶmc]dW6%kGxj]_Êm!xX. zӰ]?b:y""3=1"tNC5t^XmAO=l/,][ Ƴ*4JU),!^w}xƕ;hZL-TecY8X59ϟ{dl]7e8i naL1^gjD3P.9hgߥ(%^.2꺤 )F9kՇ]V^fЈB>!w:"Bܟu:S$$văDgS'M݇%"j7Ax""zG~뺚E|u=,v:""S=1"JIƞQ#"""""j7VbDDDDDDJ<1"L~,c%FDTI즶DՉDDDDDDJdg"""""ⓝ:Q#"""""j7VbDDDDDDJX+1"""""vc%FDDDDDnĈڍQ#"""""j7VbDDDDDDJX+1"""""vc%FDDDDDnĈڍQ#"""""j7VbDDDDDDm;<.qjIENDB`pyparsing-2.0.3/examples/0000775000175000017500000000000012416136732014375 5ustar barrybarrypyparsing-2.0.3/examples/sql2dot.py0000664000175000017500000000573112171425201016333 0ustar barrybarry#!/usr/bin/python # sql2dot.py # # Creates table graphics by parsing SQL table DML commands and # generating DOT language output. # # Adapted from a post at http://energyblog.blogspot.com/2006/04/blog-post_20.html. # sampleSQL = """ create table student ( student_id integer primary key, firstname varchar(20), lastname varchar(40), address1 varchar(80), address2 varchar(80), city varchar(30), state varchar(2), zipcode varchar(10), dob date ); create table classes ( class_id integer primary key, id varchar(8), maxsize integer, instructor varchar(40) ); create table student_registrations ( reg_id integer primary key, student_id integer, class_id integer ); alter table only student_registrations add constraint students_link foreign key (student_id) references students(student_id); alter table only student_registrations add constraint classes_link foreign key (class_id) references classes(class_id); """.upper() from pyparsing import Literal, CaselessLiteral, Word, delimitedList \ ,Optional, Combine, Group, alphas, nums, alphanums, Forward \ , oneOf, sglQuotedString, OneOrMore, ZeroOrMore, CharsNotIn \ , replaceWith skobki = "(" + ZeroOrMore(CharsNotIn(")")) + ")" field_def = OneOrMore(Word(alphas,alphanums+"_\"':-") | skobki) def field_act(s,loc,tok): return ("<"+tok[0]+"> " + " ".join(tok)).replace("\"","\\\"") field_def.setParseAction(field_act) field_list_def = delimitedList( field_def ) def field_list_act(toks): return " | ".join(toks) field_list_def.setParseAction(field_list_act) create_table_def = Literal("CREATE") + "TABLE" + Word(alphas,alphanums+"_").setResultsName("tablename") + \ "("+field_list_def.setResultsName("columns")+")"+ ";" def create_table_act(toks): return """"%(tablename)s" [\n\t label="<%(tablename)s> %(tablename)s | %(columns)s"\n\t shape="record"\n];""" % toks create_table_def.setParseAction(create_table_act) add_fkey_def=Literal("ALTER")+"TABLE"+"ONLY" + Word(alphanums+"_").setResultsName("fromtable") + "ADD" \ + "CONSTRAINT" + Word(alphanums+"_") + "FOREIGN"+"KEY"+"("+Word(alphanums+"_").setResultsName("fromcolumn")+")" \ +"REFERENCES"+Word(alphanums+"_").setResultsName("totable")+"("+Word(alphanums+"_").setResultsName("tocolumn")+")"+";" def add_fkey_act(toks): return """ "%(fromtable)s":%(fromcolumn)s -> "%(totable)s":%(tocolumn)s """ % toks add_fkey_def.setParseAction(add_fkey_act) other_statement_def = ( OneOrMore(CharsNotIn(";") ) + ";") other_statement_def.setParseAction( replaceWith("") ) comment_def = "--" + ZeroOrMore(CharsNotIn("\n")) comment_def.setParseAction( replaceWith("") ) statement_def = comment_def | create_table_def | add_fkey_def | other_statement_def defs = OneOrMore(statement_def) print("""digraph g { graph [ rankdir = "LR" ]; """) for i in defs.parseString(sampleSQL): if i!="": print(i) print("}")pyparsing-2.0.3/examples/htmlStripper.py0000664000175000017500000000234312171425201017434 0ustar barrybarry# # htmlStripper.py # # Sample code for stripping HTML markup tags and scripts from # HTML source files. # # Copyright (c) 2006, Paul McGuire # from pyparsing import * import urllib.request, urllib.parse, urllib.error removeText = replaceWith("") scriptOpen,scriptClose = makeHTMLTags("script") scriptBody = scriptOpen + SkipTo(scriptClose) + scriptClose scriptBody.setParseAction(removeText) anyTag,anyClose = makeHTMLTags(Word(alphas,alphanums+":_")) anyTag.setParseAction(removeText) anyClose.setParseAction(removeText) htmlComment.setParseAction(removeText) commonHTMLEntity.setParseAction(replaceHTMLEntity) # get some HTML targetURL = "http://wiki.python.org/moin/PythonDecoratorLibrary" targetPage = urllib.request.urlopen( targetURL ) targetHTML = targetPage.read() targetPage.close() # first pass, strip out tags and translate entities firstPass = (htmlComment | scriptBody | commonHTMLEntity | anyTag | anyClose ).transformString(targetHTML) # first pass leaves many blank lines, collapse these down repeatedNewlines = LineEnd() + OneOrMore(LineEnd()) repeatedNewlines.setParseAction(replaceWith("\n\n")) secondPass = repeatedNewlines.transformString(firstPass) print(secondPass)pyparsing-2.0.3/examples/jsonParser.py0000664000175000017500000000670512171425201017073 0ustar barrybarry# jsonParser.py # # Implementation of a simple JSON parser, returning a hierarchical # ParseResults object support both list- and dict-style data access. # # Copyright 2006, by Paul McGuire # # Updated 8 Jan 2007 - fixed dict grouping bug, and made elements and # members optional in array and object collections # json_bnf = """ object { members } {} members string : value members , string : value array [ elements ] [] elements value elements , value value string number object array true false null """ from pyparsing import * TRUE = Keyword("true").setParseAction( replaceWith(True) ) FALSE = Keyword("false").setParseAction( replaceWith(False) ) NULL = Keyword("null").setParseAction( replaceWith(None) ) jsonString = dblQuotedString.setParseAction( removeQuotes ) jsonNumber = Combine( Optional('-') + ( '0' | Word('123456789',nums) ) + Optional( '.' + Word(nums) ) + Optional( Word('eE',exact=1) + Word(nums+'+-',nums) ) ) jsonObject = Forward() jsonValue = Forward() jsonElements = delimitedList( jsonValue ) jsonArray = Group(Suppress('[') + Optional(jsonElements) + Suppress(']') ) jsonValue << ( jsonString | jsonNumber | Group(jsonObject) | jsonArray | TRUE | FALSE | NULL ) memberDef = Group( jsonString + Suppress(':') + jsonValue ) jsonMembers = delimitedList( memberDef ) jsonObject << Dict( Suppress('{') + Optional(jsonMembers) + Suppress('}') ) jsonComment = cppStyleComment jsonObject.ignore( jsonComment ) def convertNumbers(s,l,toks): n = toks[0] try: return int(n) except ValueError as ve: return float(n) jsonNumber.setParseAction( convertNumbers ) if __name__ == "__main__": testdata = """ { "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "TrueValue": true, "FalseValue": false, "Gravity": -9.8, "LargestPrimeLessThan100": 97, "AvogadroNumber": 6.02E23, "EvenPrimesGreaterThan2": null, "PrimesLessThan10" : [2,3,5,7], "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML", "markup"], "EmptyDict" : {}, "EmptyList" : [] } } } } """ import pprint results = jsonObject.parseString(testdata) pprint.pprint( results.asList() ) print() def testPrint(x): print(type(x),repr(x)) print(list(results.glossary.GlossDiv.GlossList.keys())) testPrint( results.glossary.title ) testPrint( results.glossary.GlossDiv.GlossList.ID ) testPrint( results.glossary.GlossDiv.GlossList.FalseValue ) testPrint( results.glossary.GlossDiv.GlossList.Acronym ) testPrint( results.glossary.GlossDiv.GlossList.EvenPrimesGreaterThan2 ) testPrint( results.glossary.GlossDiv.GlossList.PrimesLessThan10 ) pyparsing-2.0.3/examples/fourFn.py0000664000175000017500000001603312217256135016210 0ustar barrybarry# fourFn.py # # Demonstration of the pyparsing module, implementing a simple 4-function expression parser, # with support for scientific notation, and symbols for e and pi. # Extended to add exponentiation and simple built-in functions. # Extended test cases, simplified pushFirst method. # Removed unnecessary expr.suppress() call (thanks Nathaniel Peterson!), and added Group # Changed fnumber to use a Regex, which is now the preferred method # # Copyright 2003-2009 by Paul McGuire # from pyparsing import Literal,CaselessLiteral,Word,Group,Optional,\ ZeroOrMore,Forward,nums,alphas,Regex,ParseException import math import operator exprStack = [] def pushFirst( strg, loc, toks ): exprStack.append( toks[0] ) def pushUMinus( strg, loc, toks ): for t in toks: if t == '-': exprStack.append( 'unary -' ) #~ exprStack.append( '-1' ) #~ exprStack.append( '*' ) else: break bnf = None def BNF(): """ expop :: '^' multop :: '*' | '/' addop :: '+' | '-' integer :: ['+' | '-'] '0'..'9'+ atom :: PI | E | real | fn '(' expr ')' | '(' expr ')' factor :: atom [ expop factor ]* term :: factor [ multop factor ]* expr :: term [ addop term ]* """ global bnf if not bnf: point = Literal( "." ) e = CaselessLiteral( "E" ) #~ fnumber = Combine( Word( "+-"+nums, nums ) + #~ Optional( point + Optional( Word( nums ) ) ) + #~ Optional( e + Word( "+-"+nums, nums ) ) ) fnumber = Regex(r"[+-]?\d+(:?\.\d*)?(:?[eE][+-]?\d+)?") ident = Word(alphas, alphas+nums+"_$") plus = Literal( "+" ) minus = Literal( "-" ) mult = Literal( "*" ) div = Literal( "/" ) lpar = Literal( "(" ).suppress() rpar = Literal( ")" ).suppress() addop = plus | minus multop = mult | div expop = Literal( "^" ) pi = CaselessLiteral( "PI" ) expr = Forward() atom = ((0,None)*minus + ( pi | e | fnumber | ident + lpar + expr + rpar | ident ).setParseAction( pushFirst ) | Group( lpar + expr + rpar )).setParseAction(pushUMinus) # by defining exponentiation as "atom [ ^ factor ]..." instead of "atom [ ^ atom ]...", we get right-to-left exponents, instead of left-to-righ # that is, 2^3^2 = 2^(3^2), not (2^3)^2. factor = Forward() factor << atom + ZeroOrMore( ( expop + factor ).setParseAction( pushFirst ) ) term = factor + ZeroOrMore( ( multop + factor ).setParseAction( pushFirst ) ) expr << term + ZeroOrMore( ( addop + term ).setParseAction( pushFirst ) ) bnf = expr return bnf # map operator symbols to corresponding arithmetic operations epsilon = 1e-12 opn = { "+" : operator.add, "-" : operator.sub, "*" : operator.mul, "/" : operator.truediv, "^" : operator.pow } fn = { "sin" : math.sin, "cos" : math.cos, "tan" : math.tan, "abs" : abs, "trunc" : lambda a: int(a), "round" : round, "sgn" : lambda a: (a > epsilon) - (a < -epsilon) } def evaluateStack( s ): op = s.pop() if op == 'unary -': return -evaluateStack( s ) if op in "+-*/^": op2 = evaluateStack( s ) op1 = evaluateStack( s ) return opn[op]( op1, op2 ) elif op == "PI": return math.pi # 3.1415926535 elif op == "E": return math.e # 2.718281828 elif op in fn: return fn[op]( evaluateStack( s ) ) elif op[0].isalpha(): raise Exception("invalid identifier '%s'" % op) else: return float( op ) if __name__ == "__main__": def test( s, expVal ): global exprStack exprStack = [] try: results = BNF().parseString( s, parseAll=True ) val = evaluateStack( exprStack[:] ) except ParseException as e: print(s, "failed parse:", str(pe)) except Exception as e: print(s, "failed eval:", str(e)) else: if val == expVal: print(s, "=", val, results, "=>", exprStack) else: print(s+"!!!", val, "!=", expVal, results, "=>", exprStack) test( "9", 9 ) test( "-9", -9 ) test( "--9", 9 ) test( "-E", -math.e ) test( "9 + 3 + 6", 9 + 3 + 6 ) test( "9 + 3 / 11", 9 + 3.0 / 11 ) test( "(9 + 3)", (9 + 3) ) test( "(9+3) / 11", (9+3.0) / 11 ) test( "9 - 12 - 6", 9 - 12 - 6 ) test( "9 - (12 - 6)", 9 - (12 - 6) ) test( "2*3.14159", 2*3.14159 ) test( "3.1415926535*3.1415926535 / 10", 3.1415926535*3.1415926535 / 10 ) test( "PI * PI / 10", math.pi * math.pi / 10 ) test( "PI*PI/10", math.pi*math.pi/10 ) test( "PI^2", math.pi**2 ) test( "round(PI^2)", round(math.pi**2) ) test( "6.02E23 * 8.048", 6.02E23 * 8.048 ) test( "e / 3", math.e / 3 ) test( "sin(PI/2)", math.sin(math.pi/2) ) test( "trunc(E)", int(math.e) ) test( "trunc(-E)", int(-math.e) ) test( "round(E)", round(math.e) ) test( "round(-E)", round(-math.e) ) test( "E^PI", math.e**math.pi ) test( "2^3^2", 2**3**2 ) test( "2^3+2", 2**3+2 ) test( "2^3+5", 2**3+5 ) test( "2^9", 2**9 ) test( "sgn(-2)", -1 ) test( "sgn(0)", 0 ) test( "foo(0.1)", 1 ) test( "sgn(0.1)", 1 ) """ Test output: >pythonw -u fourFn.py 9 = 9.0 ['9'] => ['9'] 9 + 3 + 6 = 18.0 ['9', '+', '3', '+', '6'] => ['9', '3', '+', '6', '+'] 9 + 3 / 11 = 9.27272727273 ['9', '+', '3', '/', '11'] => ['9', '3', '11', '/', '+'] (9 + 3) = 12.0 [] => ['9', '3', '+'] (9+3) / 11 = 1.09090909091 ['/', '11'] => ['9', '3', '+', '11', '/'] 9 - 12 - 6 = -9.0 ['9', '-', '12', '-', '6'] => ['9', '12', '-', '6', '-'] 9 - (12 - 6) = 3.0 ['9', '-'] => ['9', '12', '6', '-', '-'] 2*3.14159 = 6.28318 ['2', '*', '3.14159'] => ['2', '3.14159', '*'] 3.1415926535*3.1415926535 / 10 = 0.986960440053 ['3.1415926535', '*', '3.1415926535', '/', '10'] => ['3.1415926535', '3.1415926535', '*', '10', '/'] PI * PI / 10 = 0.986960440109 ['PI', '*', 'PI', '/', '10'] => ['PI', 'PI', '*', '10', '/'] PI*PI/10 = 0.986960440109 ['PI', '*', 'PI', '/', '10'] => ['PI', 'PI', '*', '10', '/'] PI^2 = 9.86960440109 ['PI', '^', '2'] => ['PI', '2', '^'] 6.02E23 * 8.048 = 4.844896e+024 ['6.02E23', '*', '8.048'] => ['6.02E23', '8.048', '*'] e / 3 = 0.90609394282 ['E', '/', '3'] => ['E', '3', '/'] sin(PI/2) = 1.0 ['sin', 'PI', '/', '2'] => ['PI', '2', '/', 'sin'] trunc(E) = 2 ['trunc', 'E'] => ['E', 'trunc'] E^PI = 23.1406926328 ['E', '^', 'PI'] => ['E', 'PI', '^'] 2^3^2 = 512.0 ['2', '^', '3', '^', '2'] => ['2', '3', '2', '^', '^'] 2^3+2 = 10.0 ['2', '^', '3', '+', '2'] => ['2', '3', '^', '2', '+'] 2^9 = 512.0 ['2', '^', '9'] => ['2', '9', '^'] sgn(-2) = -1 ['sgn', '-2'] => ['-2', 'sgn'] sgn(0) = 0 ['sgn', '0'] => ['0', 'sgn'] sgn(0.1) = 1 ['sgn', '0.1'] => ['0.1', 'sgn'] >Exit code: 0 """ pyparsing-2.0.3/examples/Setup.ini0000664000175000017500000000264510145327026016200 0ustar barrybarry[Startup] AppName=M3i.comm stname = Utility modemid=125D&DEV_1999 audioid=125D&DEV_1998 win98path= winmepath= win2kpath= winxppath= win95path= winnt4path= stupgrade =Install/Upgrade Drivers stuninstall =Uninstall Drivers stchoose =Choose One Function to Process stchoosez3 =Choose Devices to Process copycompl =Copying files completed RemString1=Set up has finished remove ESS device driver and cleaned your system. Click Finish to exit. RemString2=ESS devices is removed completely.No need to reboot. If you want to reinstall, run the setup again with driver package. stshowmsg1=Setup will clean the installed files and update registry. stshowmsg2=Setup is updating system's registry .... stshowmsg3=Setup is starting sysdriver=es56cvmp.sys mdmzn=mdmm3com.inf mdmznp=esmdm_98.inf mdmzna=mdmessa.inf spkname=essspk.exe remvess=remvess.exe slmcat=allem3m.cat audiocat=allem3.cat audioinf=M3i sysaudio=es198xdl.sys audiovxd=es198x.vxd [Languages] Default=0x0009 count=30 key0=0x002d key1=0x0003 key2=0x0804 key3=0x0404 key4=0x001a key5=0x0005 key6=0x0006 key7=0x0013 key8=0x0009 key9=0x000b key10=0x0c0c key11=0x040c key12=0x0007 key13=0x0008 key14=0x000e key15=0x0021 key16=0x0010 key17=0x0011 key18=0x0012 key19=0x0014 key20=0x0015 key21=0x0416 key22=0x0816 key23=0x0019 key24=0x001b key25=0x0024 key26=0x000a key27=0x001d key28=0x001e key29=0x001f [test] foo=bar pyparsing-2.0.3/examples/simpleBool.py0000664000175000017500000000547012215051663017056 0ustar barrybarry# # simpleBool.py # # Example of defining a boolean logic parser using # the operatorGrammar helper method in pyparsing. # # In this example, parse actions associated with each # operator expression will "compile" the expression # into BoolXXX class instances, which can then # later be evaluated for their boolean value. # # Copyright 2006, by Paul McGuire # Updated 2013-Sep-14 - improved Python 2/3 cross-compatibility # from pyparsing import infixNotation, opAssoc, Keyword, Word, alphas # define classes to be built at parse time, as each matching # expression type is parsed class BoolOperand(object): def __init__(self,t): self.label = t[0] self.value = eval(t[0]) def __bool__(self): return self.value def __str__(self): return self.label __repr__ = __str__ __nonzero__ = __bool__ class BoolBinOp(object): def __init__(self,t): self.args = t[0][0::2] def __str__(self): sep = " %s " % self.reprsymbol return "(" + sep.join(map(str,self.args)) + ")" def __bool__(self): return self.evalop(bool(a) for a in self.args) __nonzero__ = __bool__ __repr__ = __str__ class BoolAnd(BoolBinOp): reprsymbol = '&' evalop = all class BoolOr(BoolBinOp): reprsymbol = '|' evalop = any class BoolNot(object): def __init__(self,t): self.arg = t[0][1] def __bool__(self): v = bool(self.arg) return not v def __str__(self): return "~" + str(self.arg) __repr__ = __str__ __nonzero__ = __bool__ TRUE = Keyword("True") FALSE = Keyword("False") boolOperand = TRUE | FALSE | Word(alphas,max=1) boolOperand.setParseAction(BoolOperand) # define expression, based on expression operand and # list of operations in precedence order boolExpr = infixNotation( boolOperand, [ ("not", 1, opAssoc.RIGHT, BoolNot), ("and", 2, opAssoc.LEFT, BoolAnd), ("or", 2, opAssoc.LEFT, BoolOr), ]) if __name__ == "__main__": p = True q = False r = True tests = [("p", True), ("q", False), ("p and q", False), ("p and not q", True), ("not not p", True), ("not(p and q)", True), ("q or not p and r", False), ("q or not p or not r", False), ("q or not (p and r)", False), ("p or q or r", True), ("p or q or r and False", True), ("(p or q or r) and False", False), ] print("p =", p) print("q =", q) print("r =", r) print() for t,expected in tests: res = boolExpr.parseString(t)[0] success = "PASS" if bool(res) == expected else "FAIL" print (t,'\n', res, '=', bool(res),'\n', success, '\n') pyparsing-2.0.3/examples/getNTPservers.py0000664000175000017500000000211512171425201017507 0ustar barrybarry# getNTPservers.py # # Demonstration of the parsing module, implementing a HTML page scanner, # to extract a list of NTP time servers from the NIST web site. # # Copyright 2004, by Paul McGuire # from pyparsing import Word, Combine, Suppress, CharsNotIn, nums import urllib.request, urllib.parse, urllib.error integer = Word(nums) ipAddress = Combine( integer + "." + integer + "." + integer + "." + integer ) tdStart = Suppress("") tdEnd = Suppress("") timeServerPattern = tdStart + ipAddress.setResultsName("ipAddr") + tdEnd + \ tdStart + CharsNotIn("<").setResultsName("loc") + tdEnd # get list of time servers nistTimeServerURL = "http://www.boulder.nist.gov/timefreq/service/time-servers.html" serverListPage = urllib.request.urlopen( nistTimeServerURL ) serverListHTML = serverListPage.read() serverListPage.close() addrs = {} for srvr,startloc,endloc in timeServerPattern.scanString( serverListHTML ): print(srvr.ipAddr, "-", srvr.loc) addrs[srvr.ipAddr] = srvr.loc # or do this: #~ addr,loc = srvr #~ print addr, "-", loc pyparsing-2.0.3/examples/select_parser.py0000664000175000017500000001434312171425202017576 0ustar barrybarry# select_parser.py # Copyright 2010, Paul McGuire # # a simple SELECT statement parser, taken from SQLite's SELECT statement # definition at http://www.sqlite.org/lang_select.html # from pyparsing import * ParserElement.enablePackrat() LPAR,RPAR,COMMA = map(Suppress,"(),") select_stmt = Forward().setName("select statement") # keywords (UNION, ALL, AND, INTERSECT, EXCEPT, COLLATE, ASC, DESC, ON, USING, NATURAL, INNER, CROSS, LEFT, OUTER, JOIN, AS, INDEXED, NOT, SELECT, DISTINCT, FROM, WHERE, GROUP, BY, HAVING, ORDER, BY, LIMIT, OFFSET, OR) = map(CaselessKeyword, """UNION, ALL, AND, INTERSECT, EXCEPT, COLLATE, ASC, DESC, ON, USING, NATURAL, INNER, CROSS, LEFT, OUTER, JOIN, AS, INDEXED, NOT, SELECT, DISTINCT, FROM, WHERE, GROUP, BY, HAVING, ORDER, BY, LIMIT, OFFSET, OR""".replace(",","").split()) (CAST, ISNULL, NOTNULL, NULL, IS, BETWEEN, ELSE, END, CASE, WHEN, THEN, EXISTS, COLLATE, IN, LIKE, GLOB, REGEXP, MATCH, ESCAPE, CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP) = map(CaselessKeyword, """CAST, ISNULL, NOTNULL, NULL, IS, BETWEEN, ELSE, END, CASE, WHEN, THEN, EXISTS, COLLATE, IN, LIKE, GLOB, REGEXP, MATCH, ESCAPE, CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP""".replace(",","").split()) keyword = MatchFirst((UNION, ALL, INTERSECT, EXCEPT, COLLATE, ASC, DESC, ON, USING, NATURAL, INNER, CROSS, LEFT, OUTER, JOIN, AS, INDEXED, NOT, SELECT, DISTINCT, FROM, WHERE, GROUP, BY, HAVING, ORDER, BY, LIMIT, OFFSET, CAST, ISNULL, NOTNULL, NULL, IS, BETWEEN, ELSE, END, CASE, WHEN, THEN, EXISTS, COLLATE, IN, LIKE, GLOB, REGEXP, MATCH, ESCAPE, CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP)) identifier = ~keyword + Word(alphas, alphanums+"_") collation_name = identifier.copy() column_name = identifier.copy() column_alias = identifier.copy() table_name = identifier.copy() table_alias = identifier.copy() index_name = identifier.copy() function_name = identifier.copy() parameter_name = identifier.copy() database_name = identifier.copy() # expression expr = Forward().setName("expression") integer = Regex(r"[+-]?\d+") numeric_literal = Regex(r"\d+(\.\d*)?([eE][+-]?\d+)?") string_literal = QuotedString("'") blob_literal = Regex(r"[xX]'[0-9A-Fa-f]+'") literal_value = ( numeric_literal | string_literal | blob_literal | NULL | CURRENT_TIME | CURRENT_DATE | CURRENT_TIMESTAMP ) bind_parameter = ( Word("?",nums) | Combine(oneOf(": @ $") + parameter_name) ) type_name = oneOf("TEXT REAL INTEGER BLOB NULL") expr_term = ( CAST + LPAR + expr + AS + type_name + RPAR | EXISTS + LPAR + select_stmt + RPAR | function_name.setName("function_name") + LPAR + Optional(delimitedList(expr)) + RPAR | literal_value | bind_parameter | Combine(identifier+('.'+identifier)*(0,2)).setName("ident") ) UNARY,BINARY,TERNARY=1,2,3 expr << operatorPrecedence(expr_term, [ (oneOf('- + ~') | NOT, UNARY, opAssoc.RIGHT), (ISNULL | NOTNULL | NOT + NULL, UNARY, opAssoc.LEFT), ('||', BINARY, opAssoc.LEFT), (oneOf('* / %'), BINARY, opAssoc.LEFT), (oneOf('+ -'), BINARY, opAssoc.LEFT), (oneOf('<< >> & |'), BINARY, opAssoc.LEFT), (oneOf('< <= > >='), BINARY, opAssoc.LEFT), (oneOf('= == != <>') | IS | IN | LIKE | GLOB | MATCH | REGEXP, BINARY, opAssoc.LEFT), ('||', BINARY, opAssoc.LEFT), ((BETWEEN,AND), TERNARY, opAssoc.LEFT), (IN + LPAR + Group(select_stmt | delimitedList(expr)) + RPAR, UNARY, opAssoc.LEFT), (AND, BINARY, opAssoc.LEFT), (OR, BINARY, opAssoc.LEFT), ]) compound_operator = (UNION + Optional(ALL) | INTERSECT | EXCEPT) ordering_term = Group(expr('order_key') + Optional(COLLATE + collation_name('collate')) + Optional(ASC | DESC)('direction')) join_constraint = Group(Optional(ON + expr | USING + LPAR + Group(delimitedList(column_name)) + RPAR)) join_op = COMMA | Group(Optional(NATURAL) + Optional(INNER | CROSS | LEFT + OUTER | LEFT | OUTER) + JOIN) join_source = Forward() single_source = ( (Group(database_name("database") + "." + table_name("table")) | table_name("table")) + Optional(Optional(AS) + table_alias("table_alias")) + Optional(INDEXED + BY + index_name("name") | NOT + INDEXED)("index") | (LPAR + select_stmt + RPAR + Optional(Optional(AS) + table_alias)) | (LPAR + join_source + RPAR) ) join_source << (Group(single_source + OneOrMore(join_op + single_source + join_constraint)) | single_source) result_column = "*" | table_name + "." + "*" | Group(expr + Optional(Optional(AS) + column_alias)) select_core = (SELECT + Optional(DISTINCT | ALL) + Group(delimitedList(result_column))("columns") + Optional(FROM + join_source("from")) + Optional(WHERE + expr("where_expr")) + Optional(GROUP + BY + Group(delimitedList(ordering_term)("group_by_terms")) + Optional(HAVING + expr("having_expr")))) select_stmt << (select_core + ZeroOrMore(compound_operator + select_core) + Optional(ORDER + BY + Group(delimitedList(ordering_term))("order_by_terms")) + Optional(LIMIT + (Group(expr + OFFSET + expr) | Group(expr + COMMA + expr) | expr)("limit"))) tests = """\ select * from xyzzy where z > 100 select * from xyzzy where z > 100 order by zz select * from xyzzy select z.* from xyzzy""".splitlines() tests = """\ select a, b from test_table where 1=1 and b='yes' select a, b from test_table where 1=1 and b in (select bb from foo) select z.a, b from test_table where 1=1 and b in (select bb from foo) select z.a, b from test_table where 1=1 and b in (select bb from foo) order by b,c desc,d select z.a, b from test_table left join test2_table where 1=1 and b in (select bb from foo) select a, db.table.b as BBB from db.table where 1=1 and BBB='yes' select a, db.table.b as BBB from test_table,db.table where 1=1 and BBB='yes' select a, db.table.b as BBB from test_table,db.table where 1=1 and BBB='yes' limit 50 """.splitlines() for t in tests: t = t.strip() if not t: continue print(t) try: print(select_stmt.parseString(t).dump()) except ParseException as pe: print(pe.msg) print() pyparsing-2.0.3/examples/sparser.py0000664000175000017500000003174212171425202016424 0ustar barrybarry#!/usr/bin/env python """ NAME: sparser.py SYNOPSIS: sparser.py [options] filename DESCRIPTION: The sparser.py script is a Specified PARSER. It is unique (as far as I can tell) because it doesn't care about the delimiter(s). The user specifies what is expected, and the order, for each line of text. All of the heavy lifting is handled by pyparsing (http://pyparsing.sf.net). OPTIONS: -h,--help this message -v,--version version -d,--debug turn on debug messages EXAMPLES: 1. As standalone sparser.py myfile 2. As library import sparser ... #Copyright (C) 2006 Tim Cera timcera@earthlink.net # # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free # Software Foundation; either version 2 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 General Public License # for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 675 Mass Ave, Cambridge, MA 02139, USA. """ #===imports====================== import sys import os import getopt import re import gzip from pyparsing import * #===globals====================== modname = "sparser" __version__ = "0.1" #--option args-- debug_p = 0 #opt_b=None #string arg, default is undefined #---positional args, default is empty--- pargs = [] #---other--- #===utilities==================== def msg(txt): """Send message to stdout.""" sys.stdout.write(txt) sys.stdout.flush() def debug(ftn, txt): """Used for debugging.""" if debug_p: sys.stdout.write("%s.%s:%s\n" % (modname, ftn, txt)) sys.stdout.flush() def fatal(ftn, txt): """If can't continue.""" msg = "%s.%s:FATAL:%s\n" % (modname, ftn, txt) raise SystemExit(msg) def usage(): """Prints the docstring.""" print(__doc__) #==================================== class ToInteger(TokenConverter): """Converter to make token into an integer.""" def postParse( self, instring, loc, tokenlist ): return int(tokenlist[0]) class ToFloat(TokenConverter): """Converter to make token into a float.""" def postParse( self, instring, loc, tokenlist ): return float(tokenlist[0]) class ParseFileLineByLine: """ Bring data from text files into a program, optionally parsing each line according to specifications in a parse definition file. ParseFileLineByLine instances can be used like normal file objects (i.e. by calling readline(), readlines(), and write()), but can also be used as sequences of lines in for-loops. ParseFileLineByLine objects also handle compression transparently. i.e. it is possible to read lines from a compressed text file as if it were not compressed. Compression is deduced from the file name suffixes '.Z' (compress/uncompress), '.gz' (gzip/gunzip), and '.bz2' (bzip2). The parse definition file name is developed based on the input file name. If the input file name is 'basename.ext', then the definition file is 'basename_def.ext'. If a definition file specific to the input file is not found, then the program searches for the file 'sparse.def' which would be the definition file for all files in that directory without a file specific definition file. Finally, ParseFileLineByLine objects accept file names that start with '~' or '~user' to indicate a home directory, as well as URLs (for reading only). Constructor: ParseFileLineByLine(|filename|, |mode|='"r"'), where |filename| is the name of the file (or a URL) and |mode| is one of '"r"' (read), '"w"' (write) or '"a"' (append, not supported for .Z files). """ def __init__(self, filename, mode = 'r'): """Opens input file, and if available the definition file. If the definition file is available __init__ will then create some pyparsing helper variables. """ if mode not in ['r', 'w', 'a']: raise IOError(0, 'Illegal mode: ' + repr(mode)) if string.find(filename, ':/') > 1: # URL if mode == 'w': raise IOError("can't write to a URL") import urllib.request, urllib.parse, urllib.error self.file = urllib.request.urlopen(filename) else: filename = os.path.expanduser(filename) if mode == 'r' or mode == 'a': if not os.path.exists(filename): raise IOError(2, 'No such file or directory: ' + filename) filen, file_extension = os.path.splitext(filename) command_dict = { ('.Z', 'r'): "self.file = os.popen('uncompress -c ' + filename, mode)", ('.gz', 'r'): "self.file = gzip.GzipFile(filename, 'rb')", ('.bz2', 'r'): "self.file = os.popen('bzip2 -dc ' + filename, mode)", ('.Z', 'w'): "self.file = os.popen('compress > ' + filename, mode)", ('.gz', 'w'): "self.file = gzip.GzipFile(filename, 'wb')", ('.bz2', 'w'): "self.file = os.popen('bzip2 > ' + filename, mode)", ('.Z', 'a'): "raise IOError, (0, 'Can\'t append to .Z files')", ('.gz', 'a'): "self.file = gzip.GzipFile(filename, 'ab')", ('.bz2', 'a'): "raise IOError, (0, 'Can\'t append to .bz2 files')", } exec(command_dict.get((file_extension, mode), 'self.file = open(filename, mode)')) self.grammar = None # Try to find a parse ('*_def.ext') definition file. First try to find # a file specific parse definition file, then look for 'sparse.def' # that would be the definition file for all files within the directory. # The definition file is pure Python. The one variable that needs to # be specified is 'parse'. The 'parse' variable is a list of tuples # defining the name, type, and because it is a list, the order of # variables on each line in the data file. The variable name is a # string, the type variable is defined as integer, real, and qString. # parse = [ # ('year', integer), # ('month', integer), # ('day', integer), # ('value', real), # ] definition_file_one = filen + "_def" + file_extension definition_file_two = os.path.dirname(filen) + os.sep + "sparse.def" if os.path.exists(definition_file_one): self.parsedef = definition_file_one elif os.path.exists(definition_file_two): self.parsedef = definition_file_two else: self.parsedef = None return None # Create some handy pyparsing constructs. I kept 'decimal_sep' so that # could easily change to parse if the decimal separator is a ",". decimal_sep = "." sign = oneOf("+ -") # part of printables without decimal_sep, +, - special_chars = string.replace('!"#$%&\'()*,./:;<=>?@[\\]^_`{|}~', decimal_sep, "") integer = ToInteger( Combine(Optional(sign) + Word(nums))).setName("integer") positive_integer = ToInteger( Combine(Optional("+") + Word(nums))).setName("integer") negative_integer = ToInteger( Combine("-" + Word(nums))).setName("integer") real = ToFloat( Combine(Optional(sign) + Word(nums) + decimal_sep + Optional(Word(nums)) + Optional(oneOf("E e") + Word(nums)))).setName("real") positive_real = ToFloat( Combine(Optional("+") + Word(nums) + decimal_sep + Optional(Word(nums)) + Optional(oneOf("E e") + Word(nums)))).setName("real") negative_real = ToFloat( Combine("-" + Word(nums) + decimal_sep + Optional(Word(nums)) + Optional(oneOf("E e") + Word(nums)))).setName("real") qString = ( sglQuotedString | dblQuotedString ).setName("qString") # add other characters we should skip over between interesting fields integer_junk = Optional( Suppress( Word(alphas + special_chars + decimal_sep))).setName("integer_junk") real_junk = Optional( Suppress( Word(alphas + special_chars))).setName("real_junk") qString_junk = SkipTo(qString).setName("qString_junk") # Now that 'integer', 'real', and 'qString' have been assigned I can # execute the definition file. exec(compile(open(self.parsedef).read(), self.parsedef, 'exec')) # Build the grammar, combination of the 'integer', 'real, 'qString', # and '*_junk' variables assigned above in the order specified in the # definition file. grammar = [] for nam, expr in parse: grammar.append( eval(expr.name + "_junk")) grammar.append( expr.setResultsName(nam) ) self.grammar = And( grammar[1:] + [restOfLine] ) def __del__(self): """Delete (close) the file wrapper.""" self.close() def __getitem__(self, item): """Used in 'for line in fp:' idiom.""" line = self.readline() if not line: raise IndexError return line def readline(self): """Reads (and optionally parses) a single line.""" line = self.file.readline() if self.grammar and line: try: return self.grammar.parseString(line).asDict() except ParseException: return self.readline() else: return line def readlines(self): """Returns a list of all lines (optionally parsed) in the file.""" if self.grammar: tot = [] # Used this way instead of a 'for' loop against # self.file.readlines() so that there wasn't two copies of the file # in memory. while 1: line = self.file.readline() if not line: break tot.append(line) return tot return self.file.readlines() def write(self, data): """Write to a file.""" self.file.write(data) def writelines(self, list): """Write a list to a file. Each item in the list is a line in the file. """ for line in list: self.file.write(line) def close(self): """Close the file.""" self.file.close() def flush(self): """Flush in memory contents to file.""" self.file.flush() #============================= def main(pargs): """This should only be used for testing. The primary mode of operation is as an imported library. """ input_file = sys.argv[1] fp = ParseFileLineByLine(input_file) for i in fp: print(i) #------------------------- if __name__ == '__main__': ftn = "main" opts, pargs = getopt.getopt(sys.argv[1:], 'hvd', ['help', 'version', 'debug', 'bb=']) for opt in opts: if opt[0] == '-h' or opt[0] == '--help': print(modname+": version="+__version__) usage() sys.exit(0) elif opt[0] == '-v' or opt[0] == '--version': print(modname+": version="+__version__) sys.exit(0) elif opt[0] == '-d' or opt[0] == '--debug': debug_p = 1 elif opt[0] == '--bb': opt_b = opt[1] #---make the object and run it--- main(pargs) #===Revision Log=== #Created by mkpythonproj: #2006-02-06 Tim Cera # pyparsing-2.0.3/examples/btpyparse.py0000664000175000017500000001042612171425201016751 0ustar barrybarry""" Pyparsing parser for BibTeX files A standalone parser using pyparsing. pyparsing has a simple and expressive syntax so the grammar is easy to read and write. Matthew Brett 2010 Simplified BSD license """ from pyparsing import (Regex, Suppress, ZeroOrMore, Group, Optional, Forward, SkipTo, CaselessLiteral, Dict) class Macro(object): """ Class to encapsulate undefined macro references """ def __init__(self, name): self.name = name def __repr__(self): return 'Macro("%s")' % self.name def __eq__(self, other): return self.name == other.name def __ne__(self, other): return self.name != other.name # Character literals LCURLY,RCURLY,LPAREN,RPAREN,QUOTE,COMMA,AT,EQUALS,HASH = map(Suppress,'{}()",@=#') def bracketed(expr): """ Return matcher for `expr` between curly brackets or parentheses """ return (LPAREN + expr + RPAREN) | (LCURLY + expr + RCURLY) # Define parser components for strings (the hard bit) chars_no_curly = Regex(r"[^{}]+") chars_no_curly.leaveWhitespace() chars_no_quotecurly = Regex(r'[^"{}]+') chars_no_quotecurly.leaveWhitespace() # Curly string is some stuff without curlies, or nested curly sequences curly_string = Forward() curly_item = Group(curly_string) | chars_no_curly curly_string << LCURLY + ZeroOrMore(curly_item) + RCURLY # quoted string is either just stuff within quotes, or stuff within quotes, within # which there is nested curliness quoted_item = Group(curly_string) | chars_no_quotecurly quoted_string = QUOTE + ZeroOrMore(quoted_item) + QUOTE # Numbers can just be numbers. Only integers though. number = Regex('[0-9]+') # Basis characters (by exclusion) for variable / field names. The following # list of characters is from the btparse documentation any_name = Regex('[^\s"#%\'(),={}]+') # btparse says, and the test bibs show by experiment, that macro and field names # cannot start with a digit. In fact entry type names cannot start with a digit # either (see tests/bibs). Cite keys can start with a digit not_digname = Regex('[^\d\s"#%\'(),={}][^\s"#%\'(),={}]*') # Comment comments out to end of line comment = (AT + CaselessLiteral('comment') + Regex("[\s{(].*").leaveWhitespace()) # The name types with their digiteyness not_dig_lower = not_digname.copy().setParseAction(lambda t: t[0].lower()) macro_def = not_dig_lower.copy() macro_ref = not_dig_lower.copy().setParseAction(lambda t : Macro(t[0].lower())) field_name = not_dig_lower.copy() # Spaces in names mean they cannot clash with field names entry_type = not_dig_lower('entry_type') cite_key = any_name('cite_key') # Number has to be before macro name string = (number | macro_ref | quoted_string | curly_string) # There can be hash concatenation field_value = string + ZeroOrMore(HASH + string) field_def = Group(field_name + EQUALS + field_value) entry_contents = Dict(ZeroOrMore(field_def + COMMA) + Optional(field_def)) # Entry is surrounded either by parentheses or curlies entry = (AT + entry_type + bracketed(cite_key + COMMA + entry_contents)) # Preamble is a macro-like thing with no name preamble = AT + CaselessLiteral('preamble') + bracketed(field_value) # Macros (aka strings) macro_contents = macro_def + EQUALS + field_value macro = AT + CaselessLiteral('string') + bracketed(macro_contents) # Implicit comments icomment = SkipTo('@').setParseAction(lambda t : t.insert(0, 'icomment')) # entries are last in the list (other than the fallback) because they have # arbitrary start patterns that would match comments, preamble or macro definitions = Group(comment | preamble | macro | entry | icomment) # Start symbol bibfile = ZeroOrMore(definitions) def parse_str(str): return bibfile.parseString(str) if __name__ == '__main__': # Run basic test txt = """ Some introductory text (implicit comment) @ARTICLE{Authors2011, author = {First Author and Second Author and Third Author}, title = {An article about {S}omething}, journal = "Journal of Articles", year = {2011}, volume = {16}, pages = {1140--1141}, number = {2} } """ print('\n\n'.join(defn.dump() for defn in parse_str(txt))) pyparsing-2.0.3/examples/rangeCheck.py0000664000175000017500000000500212053623313016767 0ustar barrybarry# rangeCheck.py # # A sample program showing how parse actions can convert parsed # strings into a data type or object, and to validate the parsed value. # # Copyright 2011, Paul T. McGuire # from pyparsing import Word, nums, Suppress, ParseException, empty, Optional from datetime import datetime def rangeCheck(minval=None, maxval=None): # have to specify at least one range boundary if minval is None and maxval is None: raise ValueError("minval or maxval must be specified") # set range testing function and error message depending on # whether either or both min and max values are given inRangeFn = { (True, False) : lambda x : x <= maxval, (False, True) : lambda x : minval <= x, (False, False) : lambda x : minval <= x <= maxval, }[minval is None, maxval is None] outOfRangeMessage = { (True, False) : "value %%s is greater than %s" % maxval, (False, True) : "value %%s is less than %s" % minval, (False, False) : "value %%s is not in the range (%s to %s)" % (minval,maxval), }[minval is None, maxval is None] # define the actual range checking parse action def rangeCheckParseAction(string, loc, tokens): parsedval = tokens[0] if not inRangeFn(parsedval): raise ParseException(string, loc, outOfRangeMessage % parsedval) return rangeCheckParseAction # define the expressions for a date of the form YYYY/MM/DD or YYYY/MM (assumes YYYY/MM/01) integer = Word(nums).setName("integer") integer.setParseAction(lambda t:int(t[0])) month = integer.copy().addParseAction(rangeCheck(1,12)) day = integer.copy().addParseAction(rangeCheck(1,31)) year = integer.copy().addParseAction(rangeCheck(2000, None)) SLASH = Suppress('/') dateExpr = year("year") + SLASH + month("month") + Optional(SLASH + day("day")) dateExpr.setName("date") # convert date fields to datetime (also validates dates as truly valid dates) dateExpr.setParseAction(lambda t: datetime(t.year, t.month, t.day or 1).date()) # add range checking on dates mindate = datetime(2002,1,1).date() maxdate = datetime.now().date() dateExpr.addParseAction(rangeCheck(mindate, maxdate)) tests = """ 2011/5/8 2001/1/1 2004/2/29 2004/2/30 2004/2 """.splitlines() for t in tests: t = t.strip() if not t: continue print(t) try: print(dateExpr.parseString(t)[0]) except Exception as e: print(str(e)) print() pyparsing-2.0.3/examples/eval_arith.py0000664000175000017500000001567612171425201017072 0ustar barrybarry# eval_arith.py # # Copyright 2009, 2011 Paul McGuire # # Expansion on the pyparsing example simpleArith.py, to include evaluation # of the parsed tokens. # # Added support for exponentiation, using right-to-left evaluation of # operands # from pyparsing import Word, nums, alphas, Combine, oneOf, \ opAssoc, operatorPrecedence, Literal class EvalConstant(object): "Class to evaluate a parsed constant or variable" vars_ = {} def __init__(self, tokens): self.value = tokens[0] def eval(self): if self.value in EvalConstant.vars_: return EvalConstant.vars_[self.value] else: return float(self.value) class EvalSignOp(object): "Class to evaluate expressions with a leading + or - sign" def __init__(self, tokens): self.sign, self.value = tokens[0] def eval(self): mult = {'+':1, '-':-1}[self.sign] return mult * self.value.eval() def operatorOperands(tokenlist): "generator to extract operators and operands in pairs" it = iter(tokenlist) while 1: try: yield (next(it), next(it)) except StopIteration: break class EvalPowerOp(object): "Class to evaluate multiplication and division expressions" def __init__(self, tokens): self.value = tokens[0] def eval(self): res = self.value[-1].eval() for val in self.value[-3::-2]: res = val.eval()**res return res class EvalMultOp(object): "Class to evaluate multiplication and division expressions" def __init__(self, tokens): self.value = tokens[0] def eval(self): prod = self.value[0].eval() for op,val in operatorOperands(self.value[1:]): if op == '*': prod *= val.eval() if op == '/': prod /= val.eval() return prod class EvalAddOp(object): "Class to evaluate addition and subtraction expressions" def __init__(self, tokens): self.value = tokens[0] def eval(self): sum = self.value[0].eval() for op,val in operatorOperands(self.value[1:]): if op == '+': sum += val.eval() if op == '-': sum -= val.eval() return sum class EvalComparisonOp(object): "Class to evaluate comparison expressions" opMap = { "<" : lambda a,b : a < b, "<=" : lambda a,b : a <= b, ">" : lambda a,b : a > b, ">=" : lambda a,b : a >= b, "!=" : lambda a,b : a != b, "=" : lambda a,b : a == b, "LT" : lambda a,b : a < b, "LE" : lambda a,b : a <= b, "GT" : lambda a,b : a > b, "GE" : lambda a,b : a >= b, "NE" : lambda a,b : a != b, "EQ" : lambda a,b : a == b, "<>" : lambda a,b : a != b, } def __init__(self, tokens): self.value = tokens[0] def eval(self): val1 = self.value[0].eval() for op,val in operatorOperands(self.value[1:]): fn = EvalComparisonOp.opMap[op] val2 = val.eval() if not fn(val1,val2): break val1 = val2 else: return True return False # define the parser integer = Word(nums) real = Combine(Word(nums) + "." + Word(nums)) variable = Word(alphas,exact=1) operand = real | integer | variable signop = oneOf('+ -') multop = oneOf('* /') plusop = oneOf('+ -') expop = Literal('**') # use parse actions to attach EvalXXX constructors to sub-expressions operand.setParseAction(EvalConstant) arith_expr = operatorPrecedence(operand, [ (signop, 1, opAssoc.RIGHT, EvalSignOp), (expop, 2, opAssoc.LEFT, EvalPowerOp), (multop, 2, opAssoc.LEFT, EvalMultOp), (plusop, 2, opAssoc.LEFT, EvalAddOp), ]) comparisonop = oneOf("< <= > >= != = <> LT GT LE GE EQ NE") comp_expr = operatorPrecedence(arith_expr, [ (comparisonop, 2, opAssoc.LEFT, EvalComparisonOp), ]) def main(): # sample expressions posted on comp.lang.python, asking for advice # in safely evaluating them rules=[ '( A - B ) = 0', '(A + B + C + D + E + F + G + H + I) = J', '(A + B + C + D + E + F + G + H) = I', '(A + B + C + D + E + F) = G', '(A + B + C + D + E) = (F + G + H + I + J)', '(A + B + C + D + E) = (F + G + H + I)', '(A + B + C + D + E) = F', '(A + B + C + D) = (E + F + G + H)', '(A + B + C) = (D + E + F)', '(A + B) = (C + D + E + F)', '(A + B) = (C + D)', '(A + B) = (C - D + E - F - G + H + I + J)', '(A + B) = C', '(A + B) = 0', '(A+B+C+D+E) = (F+G+H+I+J)', '(A+B+C+D) = (E+F+G+H)', '(A+B+C+D)=(E+F+G+H)', '(A+B+C)=(D+E+F)', '(A+B)=(C+D)', '(A+B)=C', '(A-B)=C', '(A/(B+C))', '(B/(C+D))', '(G + H) = I', '-0.99 LE ((A+B+C)-(D+E+F+G)) LE 0.99', '-0.99 LE (A-(B+C)) LE 0.99', '-1000.00 LE A LE 0.00', '-5000.00 LE A LE 0.00', 'A < B', 'A < 7000', 'A = -(B)', 'A = C', 'A = 0', 'A GT 0', 'A GT 0.00', 'A GT 7.00', 'A LE B', 'A LT -1000.00', 'A LT -5000', 'A LT 0', 'A=(B+C+D)', 'A=B', 'I = (G + H)', '0.00 LE A LE 4.00', '4.00 LT A LE 7.00', '0.00 LE A LE 4.00 LE E > D', '2**2**(A+3)', ] vars_={'A': 0, 'B': 1.1, 'C': 2.2, 'D': 3.3, 'E': 4.4, 'F': 5.5, 'G': 6.6, 'H':7.7, 'I':8.8, 'J':9.9} # define tests from given rules tests = [] for t in rules: t_orig = t t = t.replace("=","==") t = t.replace("EQ","==") t = t.replace("LE","<=") t = t.replace("GT",">") t = t.replace("LT","<") t = t.replace("GE",">=") t = t.replace("LE","<=") t = t.replace("NE","!=") t = t.replace("<>","!=") tests.append( (t_orig,eval(t,vars_)) ) # copy vars_ to EvalConstant lookup dict EvalConstant.vars_ = vars_ failed = 0 for test,expected in tests: ret = comp_expr.parseString(test)[0] parsedvalue = ret.eval() print(test, expected, parsedvalue, end=' ') if parsedvalue != expected: print("<<< FAIL") failed += 1 else: print() print() if failed: print(failed, "tests FAILED") else: print("all tests PASSED") if __name__=='__main__': main() pyparsing-2.0.3/examples/parsePythonValue.py0000664000175000017500000000436712416127706020273 0ustar barrybarry# parsePythonValue.py # # Copyright, 2006, by Paul McGuire # from __future__ import print_function from pyparsing import * cvtBool = lambda t:t[0]=='True' cvtInt = lambda toks: int(toks[0]) cvtReal = lambda toks: float(toks[0]) cvtTuple = lambda toks : tuple(toks.asList()) cvtDict = lambda toks: dict(toks.asList()) cvtList = lambda toks: [toks.asList()] # define punctuation as suppressed literals lparen,rparen,lbrack,rbrack,lbrace,rbrace,colon = \ map(Suppress,"()[]{}:") integer = Regex(r"[+-]?\d+")\ .setName("integer")\ .setParseAction( cvtInt ) real = Regex(r"[+-]?\d+\.\d*([Ee][+-]?\d+)?")\ .setName("real")\ .setParseAction( cvtReal ) tupleStr = Forward() listStr = Forward() dictStr = Forward() unicodeString.setParseAction(lambda t:t[0][2:-1].decode('unicode-escape')) quotedString.setParseAction(lambda t:t[0][1:-1].decode('string-escape')) boolLiteral = oneOf("True False").setParseAction(cvtBool) noneLiteral = Literal("None").setParseAction(replaceWith(None)) listItem = real|integer|quotedString|unicodeString|boolLiteral|noneLiteral| \ Group(listStr) | tupleStr | dictStr tupleStr << ( Suppress("(") + Optional(delimitedList(listItem)) + Optional(Suppress(",")) + Suppress(")") ) tupleStr.setParseAction( cvtTuple ) listStr << (lbrack + Optional(delimitedList(listItem) + Optional(Suppress(","))) + rbrack) listStr.setParseAction(cvtList, lambda t: t[0]) dictEntry = Group( listItem + colon + listItem ) dictStr << (lbrace + Optional(delimitedList(dictEntry) + \ Optional(Suppress(","))) + rbrace) dictStr.setParseAction( cvtDict ) tests = """['a', 100, ('A', [101,102]), 3.14, [ +2.718, 'xyzzy', -1.414] ] [{0: [2], 1: []}, {0: [], 1: [], 2: []}, {0: [1, 2]}] { 'A':1, 'B':2, 'C': {'a': 1.2, 'b': 3.4} } 3.14159 42 6.02E23 6.02e+023 1.0e-7 'a quoted string'""".split("\n") for test in tests: print("Test:", test.strip()) result = listItem.parseString(test)[0] print("Result:", result) try: for dd in result: if isinstance(dd,dict): print(list(dd.items())) except TypeError as te: pass print() pyparsing-2.0.3/examples/searchParserAppDemo.py0000664000175000017500000000164712171425201020635 0ustar barrybarryfrom searchparser import SearchQueryParser products = [ "grape juice", "grape jelly", "orange juice", "orange jujubees", "strawberry jam", "prune juice", "prune butter", "orange marmalade", "grapefruit juice" ] class FruitSearchParser(SearchQueryParser): def GetWord(self, word): return set( p for p in products if p.startswith(word + " ") ) def GetWordWildcard(self, word): return set( p for p in products if p.startswith(word[:-1]) ) def GetQuotes(self, search_string, tmp_result): result = Set() # I have no idea how to use this feature... return result def GetNot(self, not_set): return set( products ) - not_set parser = FruitSearchParser() tests = """\ grape or orange grape* not(grape*) prune and grape""".splitlines() for t in tests: print(t.strip()) print(parser.Parse(t)) print()pyparsing-2.0.3/examples/scanYahoo.py0000664000175000017500000000070412171425202016663 0ustar barrybarryfrom pyparsing import makeHTMLTags,SkipTo,htmlComment import urllib.request, urllib.parse, urllib.error serverListPage = urllib.request.urlopen( "http://www.yahoo.com" ) htmlText = serverListPage.read() serverListPage.close() aStart,aEnd = makeHTMLTags("A") link = aStart + SkipTo(aEnd).setResultsName("link") + aEnd link.ignore(htmlComment) for toks,start,end in link.scanString(htmlText): print(toks.link, "->", toks.startA.href)pyparsing-2.0.3/examples/SingleForm.dfm0000664000175000017500000012532212171425202017126 0ustar barrybarryobject Form1: TForm1 Left = 161 Top = 149 Width = 696 Height = 342 Caption = 'DbxSingle' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object ActionToolBar2: TActionToolBar Left = 0 Top = 0 Width = 688 Height = 26 ActionManager = ActionManager1 AllowHiding = False Caption = 'ActionToolBar2' ColorMap.HighlightColor = 14410210 ColorMap.BtnSelectedColor = clBtnFace ColorMap.UnusedColor = 14410210 Spacing = 0 end object PageControl1: TPageControl Left = 0 Top = 26 Width = 688 Height = 289 ActivePage = TabSheet1 Align = alClient TabOrder = 1 object TabSheet1: TTabSheet Caption = 'Data' object DBGrid1: TDBGrid Left = 0 Top = 0 Width = 680 Height = 261 Align = alClient DataSource = DataSource1 TabOrder = 0 TitleFont.Charset = DEFAULT_CHARSET TitleFont.Color = clWindowText TitleFont.Height = -11 TitleFont.Name = 'MS Sans Serif' TitleFont.Style = [] end end object TabSheet2: TTabSheet Caption = 'Log' ImageIndex = 1 object Memo1: TMemo Left = 0 Top = 0 Width = 680 Height = 399 Align = alClient TabOrder = 0 end end end object SimpleDataSet1: TSimpleDataSet Aggregates = <> Connection.ConnectionName = 'IBLocal' Connection.DriverName = 'Interbase' Connection.GetDriverFunc = 'getSQLDriverINTERBASE' Connection.LibraryName = 'dbexpint.dll' Connection.LoginPrompt = False Connection.Params.Strings = ( 'BlobSize=-1' 'CommitRetain=False' 'Database=C:\Program Files\Common Files\Borland Shared\Data\emplo' + 'yee.gdb' 'DriverName=Interbase' 'Password=masterkey' 'RoleName=RoleName' 'ServerCharSet=ASCII' 'SQLDialect=1' 'Interbase TransIsolation=ReadCommited' 'User_Name=sysdba' 'WaitOnLocks=True') Connection.VendorLib = 'GDS32.DLL' DataSet.CommandText = 'EMPLOYEE' DataSet.CommandType = ctTable DataSet.MaxBlobSize = -1 DataSet.Params = <> Params = <> AfterPost = DoUpdate BeforeDelete = DoUpdate Left = 104 Top = 56 end object ActionManager1: TActionManager ActionBars = < item Items.CaptionOptions = coAll Items = < item Action = DataSetFirst1 ImageIndex = 0 end item Action = DataSetPrior1 ImageIndex = 1 end item Action = DataSetNext1 ImageIndex = 2 end item Action = DataSetLast1 ImageIndex = 3 end item Action = DataSetInsert1 ImageIndex = 4 end item Action = DataSetDelete1 ImageIndex = 5 end item Action = DataSetEdit1 ImageIndex = 6 end item Action = DataSetPost1 ImageIndex = 7 end item Action = DataSetCancel1 ImageIndex = 8 end item Action = DataSetRefresh1 ImageIndex = 9 end> ActionBar = ActionToolBar2 end> Images = ImageList1 Left = 112 Top = 184 StyleName = 'XP Style' object DataSetFirst1: TDataSetFirst Category = 'Dataset' Caption = 'First' ImageIndex = 0 end object DataSetPrior1: TDataSetPrior Category = 'Dataset' Caption = 'Prior' ImageIndex = 1 end object DataSetNext1: TDataSetNext Category = 'Dataset' Caption = 'Next' ImageIndex = 2 end object DataSetLast1: TDataSetLast Category = 'Dataset' Caption = 'Last' ImageIndex = 3 end object DataSetInsert1: TDataSetInsert Category = 'Dataset' Caption = 'Insert' ImageIndex = 4 end object DataSetDelete1: TDataSetDelete Category = 'Dataset' Caption = 'Delete' ImageIndex = 5 end object DataSetEdit1: TDataSetEdit Category = 'Dataset' Caption = 'Edit' ImageIndex = 6 end object DataSetPost1: TDataSetPost Category = 'Dataset' Caption = 'Post' ImageIndex = 7 end object DataSetCancel1: TDataSetCancel Category = 'Dataset' Caption = 'Cancel' ImageIndex = 8 end object DataSetRefresh1: TDataSetRefresh Category = 'Dataset' Caption = 'Refresh' ImageIndex = 9 end end object ImageList1: TImageList Left = 112 Top = 120 Bitmap = { 494C01010C000F00040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000004000000001002000000000000040 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000084848400848484008484840084848400848484008484 8400848484000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000848484000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000008484000084 8400000000000000000000000000000000000000000000000000000000000000 0000000000000084840000000000000000000000000000000000000000000000 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 0000848484000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000084848400000000008484840000000000000000000000 0000000000000000000000000000000000000000000000000000008484000084 8400000000000000000000000000000000000000000000000000000000000000 0000000000000084840000000000000000000000000000000000000000000000 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 0000848484000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000848484000000000000000000848484000000000000000000000000000000 0000000000000000000000000000000000000000000000000000008484000084 8400000000000000000000000000000000000000000000000000000000000000 0000000000000084840000000000000000000000000000000000000000000000 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 0000848484000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000084848400000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000008484000084 8400000000000000000000000000000000000000000000000000000000000000 0000000000000084840000000000000000000000000000000000000000000000 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 0000848484000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000008484 8400000000008484840000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000008484000084 8400008484000084840000848400008484000084840000848400008484000084 8400008484000084840000000000000000000000000000000000000000000000 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 0000848484000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000008484000084 8400000000000000000000000000000000000000000000000000000000000000 0000008484000084840000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000008484000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000084840000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000008484840000000000000000000000000084848400000000000000 0000000000000000000000000000000000000000000000000000008484000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000084840000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000008484 8400000000000000000084848400000000008484840000000000000000000000 0000000000000000000000000000000000000000000000000000008484000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000084840000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000008484 8400000000000000000000000000000000000000000000000000008484000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000084840000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000008484840000000000000000000000000084848400000000000000 0000000000000000000000000000000000000000000000000000008484000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000008484000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000848484000000000000000000000000000000000000000000000000008484 8400000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000084848400000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000084848400000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000848484000000000000000000000000000000000000000000000000008484 8400000000000000000000000000000000000000000000000000000000000000 0000848484000000000000000000000000000000000084848400000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000848484000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000008484840000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000084848400000000000000000000000000000000008484 8400000000000000000000000000000000000000000000000000000000000000 0000848484000000000000000000848484000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000008484840000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000848484000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000008484840000000000000000008484 8400000000000000000000000000000000000000000000000000000000000000 0000848484008484840000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000848484008484 8400000000000000000000000000000000000000000000000000000000000000 0000848484000000000000000000848484000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000008484840000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000848484000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000008484840000000000000000008484 8400000000000000000000000000000000000000000000000000000000000000 0000848484000000000000000000000000000000000084848400000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000848484000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000008484840000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000084848400000000000000000000000000000000008484 8400000000000000000000000000000000000000000000000000000000000000 0000848484000000000000000000000000000000000000000000000000008484 8400000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000084848400000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000084848400000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000848484000000000000000000000000000000000000000000000000008484 8400000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000424D3E000000000000003E000000 2800000040000000400000000100010000000000000200000000000000000000 000000000000000000000000FFFFFF0000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000FFFFFFFFFFFFFC07FFFFFFFFC001F807 FFFFFFFF8031F807FFFFFC7F8031F807F3E7F0FF8031F807F1C7F1FF8001F807 F88FE3FF8001F807FC1FE7FF8001F80FFE3FE7078FF1FF7FFC1FE3878FF1FE3F F88FE1078FF1FC1FF1C7F0078FF1FFFFF3E7F8378FF1FEFFFFFFFFFF8FF5FFFF FFFFFFFF8001FDFFFFFFFFFFFFFF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7FFFFFFFFFFBFFFC7FFFFFFFFFF1FF FC7FFFFFE007E0FFE00FE007F00FC47FE00FE007F81FCE3FE00FE007FC3FFF1F FC7FFFFFFE7FFF8FFC7FFFFFFFFFFFC7FC7FFFFFFFFFFFE7FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7FF9FF9FFE7E7 E787FE1FF87FE1E7E607F81FF81FE067E007F01FF80FE007E607F81FF81FE067 E787FE1FF87FE1E7E7E7FF9FF9FFE7E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 000000000000} end object DataSource1: TDataSource DataSet = SimpleDataSet1 Left = 108 Top = 250 end object SQLMonitor1: TSQLMonitor OnTrace = SQLMonitor1Trace Left = 228 Top = 122 end end pyparsing-2.0.3/examples/removeLineBreaks.py0000664000175000017500000000276412171425201020203 0ustar barrybarry# removeLineBreaks.py # # Demonstration of the pyparsing module, converting text files # with hard line-breaks to text files with line breaks only # between paragraphs. (Helps when converting downloads from Project # Gutenberg - http://www.gutenberg.org - to import to word processing apps # that can reformat paragraphs once hard line-breaks are removed.) # # Uses parse actions and transformString to remove unwanted line breaks, # and to double up line breaks between paragraphs. # # Copyright 2006, by Paul McGuire # from pyparsing import * # define an expression for the body of a line of text - use a parse action to reject any # empty lines def mustBeNonBlank(s,l,t): if not t[0]: raise ParseException(s,l,"line body can't be empty") lineBody = SkipTo(lineEnd).setParseAction(mustBeNonBlank) # now define a line with a trailing lineEnd, to be replaced with a space character textLine = lineBody + Suppress(lineEnd).setParseAction(replaceWith(" ")) # define a paragraph, with a separating lineEnd, to be replaced with a double newline para = OneOrMore(textLine) + Suppress(lineEnd).setParseAction(replaceWith("\n\n")) # run a test test = """ Now is the time for all good men to come to the aid of their country. """ print(para.transformString(test)) # process an entire file z = para.transformString(file("Successful Methods of Public Speaking.txt").read()) file("Successful Methods of Public Speaking(2).txt","w").write(z) pyparsing-2.0.3/examples/0README.html0000664000175000017500000002737312171425202016303 0ustar barrybarry pyparsing Examples

pyparsing Examples

This directory contains a number of Python scripts that can get you started in learning to use pyparsing.

  • greeting.py
    Parse "Hello, World!".
  • greetingInKorean.py ~ submission by June Kim
    Unicode example to parse "Hello, World!" in Korean.
  • greetingInGreek.py ~ submission by ???
    Unicode example to parse "Hello, World!" in Greek.
  • holaMundo.py ~ submission by Marco Alfonso
    "Hello, World!" example translated to Spanish, from Marco Alfonso's blog.
  • chemicalFormulas.py
    Simple example to demonstrate the use of ParseResults returned from parseString(). Parses a chemical formula (such as "H2O" or "C6H5OH"), and walks the returned list of tokens to calculate the molecular weight.
  • wordsToNum.py
    A sample program that reads a number in words (such as "fifteen hundred and sixty four"), and returns the actual number (1564). Also demonstrates some processing of ParseExceptions, including marking where the parse failure was found.
  • pythonGrammarparser.py ~ suggested by JH Stovall
    A sample program that parses the EBNF used in the Python source code to define the Python grammar. From this parser, one can generate Python grammar documentation tools, such as railroad track diagrams. Also demonstrates use of Dict class.
  • commasep.py
    Demonstration of the use of the commaSeparatedList helper. Shows examples of proper handling of commas within quotes, trimming of whitespace around delimited entries, and handling of consecutive commas (null arguments). Includes comparison with simple string.split(',').
  • dictExample.py
    A demonstration of using the Dict class, to parse a table of ASCII tabulated data.
  • dictExample2.py ~ submission by Mike Kelly
    An extended version of dictExample.py, in which Mike Kelly also parses the column headers, and generates a transposed version of the original table!
  • scanExamples.py
    Some examples of using scanString and transformString, as alternative parsing methods to parseString, to do macro substitution, and selection and/or removal of matching strings within a source file.
  • urlExtractor.py
    Another example using scanString, this time to extract all HREF references found on Yahoo!'s home page, and return them as a dictionary.
  • makeHTMLTagExample.py
    A sample program showing sample definitions and applications of HTML tag expressions created using makeHTMLTags helper function. Very useful for scraping data from HTML pages.
  • urlExtractorNew.py
    Another updated version of urlExtractor.py, using the new makeHTMLTags() method.
  • fourFn.py
    A simple algebraic expression parser, that performs +,-,*,/, and ^ arithmetic operations. (With suggestions and bug-fixes graciously offered by Andrea Griffini.)
  • SimpleCalc.py ~ submission by Steven Siew
    An interactive version of fourFn.py, with support for variables.
  • LAParser.py ~ submission by Mike Ellis
    An interactive Linear Algebra Parser, an extension of SimpleCalc.py. Supports linear algebra (LA) notation for vectors, matrices, and scalars, including matrix operations such as inversion and determinants. Converts LA expressions to C code - uses a separate C library for runtime evaluation of results.
  • configParse.py
    A simple alternative to Python's ConfigParse module, demonstrating the use of the Dict class to return nested dictionary access to configuration values.
  • getNTPservers.py
    Yet another scanString example, to read/extract the list of NTP servers from NIST's web site.
  • getNTPserversNew.py
    An updated version of getNTPservers.py, using the new makeHTMLTags() method.
  • httpServerLogParser.py
    Parser for Apache server log files.
  • idlParse.py
    Parser for CORBA IDL files.
  • mozillaCalendarParser.py ~ submission by Petri Savolainen
    Parser for Mozilla calendar (*.ics) files.
  • pgn.py ~ submission by Alberto Santini
    Parser for PGN (Portable Game Notation) files, the standard form for documenting the moves in chess games.
  • simpleSQL.py
    A simple parser that will extract table and column names from SQL SELECT statements..
  • dfmparse.py ~ submission by Dan Griffith
    Parser for Delphi forms.
  • ebnf.py / ebnftest.py ~ submission by Seo Sanghyeon
    An EBNF-compiler that reads EBNF and generates a pyparsing grammar! Including a test that compiles... EBNF itself!
  • searchparser.py ~ submission by Steven Mooij and Rudolph Froger
    An expression parser that parses search strings, with special keyword and expression operations using (), not, and, or, and quoted strings.
  • sparser.py ~ submission by Tim Cera
    A configurable parser module that can be configured with a list of tuples, giving a high-level definition for parsing common sets of water table data files. Tim had to contend with several different styles of data file formats, each with slight variations of its own. Tim created a configurable parser (or "SPECIFIED parser" - hence the name "sparser"), that simply works from a config variable listing the field names and data types, and implicitly, their order in the source data file.

    See mayport_florida_8720220_data_def.txt for an example configuration file.

  • romanNumerals.py
    A Roman numeral generator and parser example, showing the power of parse actions to compile Roman numerals into their integer values.
  • removeLineBreaks.py
    A string transformer that converts text files with hard line-breaks into one with line breaks only between paragraphs. Useful when converting downloads from Project Gutenberg to import to word processing apps that can reformat paragraphs once hard line-breaks are removed, or for loading into your Palm Pilot for portable perusal.

    See Successful Methods of Public Speaking.txt and Successful Methods of Public Speaking(2).txt for a sample before and after (text file courtesy of Project Gutenberg).

  • listAllMatches.py
    An example program showing the utility of the listAllMatches option when specifying results naming.
  • linenoExample.py
    An example program showing how to use the string location to extract line and column numbers, or the source line of text.
  • parseListString.py
    An example program showing a progression of steps, how to parse a string representation of a Python list back into a true list.
  • parsePythonValue.py
    An extension of parseListString.py to parse tuples and dicts, including nested values, returning a Python value of the original type.
  • indentedGrammarExample.py
    An example program showing how to parse a grammar using indentation for grouping, such as is done in Python.
  • simpleArith.py
    An example program showing how to use the new operatorPrecedence helper method to define a 6-function (+, -, *, /, ^, and !) arithmetic expression parser, with unary plus and minus signs.
  • simpleBool.py
    An example program showing how to use the new operatorPrecedence helper method to define a boolean expression parser, with parse actions associated with each operator to "compile" the expression into a data structure that will evaluate the expression's boolean value.
  • simpleWiki.py
    An example program showing how to use transformString to implement a simple Wiki markup parser.
  • sql2dot.py~ submission by EnErGy [CSDX]
    A nice graphing program that generates schema diagrams from SQL table definition statements.
  • htmlStripper.py
    An example implementation of a common application, removing HTML markup tags from an HTML page, leaving just the text content.
  • macroExpansion.py
    An example implementation of a simple preprocessor, that will read embedded macro definitions and replace macro references with the defined substitution string.
  • sexpParser.py
    A parser that uses a recursive grammar to parse S-expressions.
  • nested.py
    An example using nestedExpr, a helper method to simplify definitions of expressions of nested lists.
  • withAttribute.py
    An example using withAttribute, a helper method to define parse actions to validate matched HTML tags using additional attributes. Especially helpful for matching common tags such as <DIV> and <TD>.
  • stackish.py
    A parser for the data representation format, Stackish.
  • builtin_parse_action_demo.py
    New in version 1.5.7
    Demonstration of using builtins (min, max, sum, len, etc.) as parse actions.
  • antlr_grammar.py~ submission by Luca DellOlio
    New in version 1.5.7
    Pyparsing example parsing ANTLR .a files and generating a working pyparsing parser.
  • shapes.py
    New in version 1.5.7
    Parse actions example simple shape definition syntax, and returning the matched tokens as domain objects instead of just strings.
  • datetimeParseActions.py
    New in version 1.5.7
    Parse actions example showing a parse action returning a datetime object instead of string tokens, and doing validation of the tokens, raising a ParseException if the given YYYY/MM/DD string does not represent a valid date.
  • position.py
    New in version 1.5.7
    Demonstration of a couple of different ways to capture the location a particular expression was found within the overall input string.
pyparsing-2.0.3/examples/makeHTMLTagExample.py0000664000175000017500000000143412171425201020311 0ustar barrybarryimport urllib.request, urllib.parse, urllib.error from pyparsing import makeHTMLTags, SkipTo # read HTML from a web page serverListPage = urllib.request.urlopen( "http://www.yahoo.com" ) htmlText = serverListPage.read() serverListPage.close() # using makeHTMLTags to define opening and closing tags anchorStart,anchorEnd = makeHTMLTags("a") # compose an expression for an anchored reference anchor = anchorStart + SkipTo(anchorEnd)("body") + anchorEnd # use scanString to scan through the HTML source, extracting # just the anchor tags and their associated body text # (note the href attribute of the opening A tag is available # as an attribute in the returned parse results) for tokens,start,end in anchor.scanString(htmlText): print(tokens.body,'->',tokens.href) pyparsing-2.0.3/examples/AcManForm.dfm0000664000175000017500000011434112171425202016663 0ustar barrybarryobject Form1: TForm1 Left = 193 Top = 105 Width = 696 Height = 480 Caption = 'AcManTest' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object RichEdit1: TRichEdit Left = 0 Top = 107 Width = 688 Height = 346 Align = alClient Lines.Strings = ( 'RichEdit1') TabOrder = 0 end object ActionToolBar1: TActionToolBar Left = 0 Top = 25 Width = 688 Height = 28 ActionManager = ActionManager1 Caption = 'ActionToolBar1' ColorMap.HighlightColor = 14410210 ColorMap.BtnSelectedColor = clBtnFace ColorMap.UnusedColor = 14410210 EdgeBorders = [ebTop, ebBottom] Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] ParentFont = False ParentShowHint = False ShowHint = True Spacing = 0 end object ActionMainMenuBar1: TActionMainMenuBar Left = 0 Top = 0 Width = 688 Height = 25 UseSystemFont = False ActionManager = ActionManager1 AnimationStyle = asSlide Caption = 'ActionMainMenuBar1' ColorMap.HighlightColor = 14410210 ColorMap.BtnSelectedColor = clBtnFace ColorMap.UnusedColor = 14410210 EdgeBorders = [ebTop, ebBottom] EdgeOuter = esNone Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] ParentShowHint = False ShowHint = True Spacing = 0 end object ActionToolBar2: TActionToolBar Left = 0 Top = 53 Width = 688 Height = 28 ActionManager = ActionManager1 Caption = 'ActionToolBar2' ColorMap.HighlightColor = 14410210 ColorMap.BtnSelectedColor = clBtnFace ColorMap.UnusedColor = 14410210 EdgeBorders = [ebTop, ebBottom] Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] ParentFont = False ParentShowHint = False ShowHint = True Spacing = 0 end object ActionToolBar3: TActionToolBar Left = 0 Top = 81 Width = 688 Height = 26 ActionManager = ActionManager1 Caption = 'ActionToolBar3' ColorMap.HighlightColor = 14410210 ColorMap.BtnSelectedColor = clBtnFace ColorMap.UnusedColor = 14410210 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] ParentFont = False Spacing = 0 end object ActionManager1: TActionManager FileName = 'settings' ActionBars.SessionCount = 4 ActionBars = < item Items = < item Action = EditUndo1 ImageIndex = 3 ShortCut = 16474 end item Action = EditCut1 ImageIndex = 0 ShortCut = 16472 end item Action = EditCopy1 ImageIndex = 1 ShortCut = 16451 end item Action = EditPaste1 ImageIndex = 2 ShortCut = 16470 end item Action = SearchFind1 ImageIndex = 15 ShortCut = 16454 end item Action = SearchReplace1 ImageIndex = 17 end> ActionBar = ActionToolBar1 AutoSize = False end item Items = < item Items = < item Action = FileOpen1 ImageIndex = 12 ShortCut = 16463 end item Action = FileSaveAs1 ImageIndex = 13 end item Action = FilePrintSetup1 end item Action = FileRun1 end item Action = FileExit1 ImageIndex = 14 LastSession = -1 UsageCount = -1 end> Caption = '&File' end item Items = < item Action = EditCut1 ImageIndex = 0 ShortCut = 16472 end item Action = EditCopy1 ImageIndex = 1 ShortCut = 16451 end item Action = EditPaste1 ImageIndex = 2 ShortCut = 16470 end item Action = EditSelectAll1 ShortCut = 16449 end item Action = EditUndo1 ImageIndex = 3 ShortCut = 16474 end item Action = EditDelete1 ImageIndex = 4 ShortCut = 46 end> Caption = '&Edit' end item Items = < item Action = RichEditBold1 ImageIndex = 5 ShortCut = 16450 end item Action = RichEditItalic1 ImageIndex = 6 ShortCut = 16457 end item Action = RichEditUnderline1 ImageIndex = 7 ShortCut = 16469 end item Action = RichEditStrikeOut1 end item Action = RichEditBullets1 ImageIndex = 8 end item Action = RichEditAlignLeft1 ImageIndex = 9 end item Action = RichEditAlignRight1 ImageIndex = 10 end item Action = RichEditAlignCenter1 ImageIndex = 11 end> Caption = 'F&ormat' end item Items = < item Action = SearchFind1 ImageIndex = 15 ShortCut = 16454 end item Action = SearchFindNext1 ImageIndex = 16 ShortCut = 114 end item Action = SearchReplace1 ImageIndex = 17 end item Action = SearchFindFirst1 end> Caption = '&Search' end item Items = < item Action = CustomizeActionBars1 end> Caption = '&Tools' end item Items = < item Action = HelpContents1 ImageIndex = 18 end> Caption = '&Help' end> ActionBar = ActionMainMenuBar1 AutoSize = False end item Items = < item Action = RichEditBold1 ImageIndex = 5 ShortCut = 16450 end item Action = RichEditItalic1 ImageIndex = 6 ShortCut = 16457 end item Action = RichEditUnderline1 ImageIndex = 7 ShortCut = 16469 end item Action = RichEditBullets1 Caption = 'Bull&ets' ImageIndex = 8 end item Action = RichEditAlignLeft1 ImageIndex = 9 end item Action = RichEditAlignRight1 ImageIndex = 10 end item Action = RichEditAlignCenter1 ImageIndex = 11 end> ActionBar = ActionToolBar2 AutoSize = False end item AutoSize = False end item AutoSize = False end item Items = < item Action = FileSaveAs1 ImageIndex = 13 LastSession = 2 end item Action = CustomizeActionBars1 end item Action = FileExit1 ImageIndex = 14 end item Action = HelpContents1 Caption = 'C&ontents' ImageIndex = 18 end item Action = ActionShowStatus Caption = '&ShowStatus' end> ActionBar = ActionToolBar3 AutoSize = False end> Images = ImageList1 Left = 88 Top = 136 StyleName = 'XP Style' object EditCut1: TEditCut Category = 'Edit' Caption = 'Cu&t' Hint = 'Cut|Cuts the selection and puts it on the Clipboard' ImageIndex = 0 ShortCut = 16472 end object EditCopy1: TEditCopy Category = 'Edit' Caption = '&Copy' Hint = 'Copy|Copies the selection and puts it on the Clipboard' ImageIndex = 1 ShortCut = 16451 end object EditPaste1: TEditPaste Category = 'Edit' Caption = '&Paste' Hint = 'Paste|Inserts Clipboard contents' ImageIndex = 2 ShortCut = 16470 end object EditSelectAll1: TEditSelectAll Category = 'Edit' Caption = 'Select &All' Hint = 'Select All|Selects the entire document' ShortCut = 16449 end object EditUndo1: TEditUndo Category = 'Edit' Caption = '&Undo' Hint = 'Undo|Reverts the last action' ImageIndex = 3 ShortCut = 16474 end object EditDelete1: TEditDelete Category = 'Edit' Caption = '&Delete' Hint = 'Delete|Erases the selection' ImageIndex = 4 ShortCut = 46 end object RichEditBold1: TRichEditBold Category = 'Format' AutoCheck = True Caption = '&Bold' Hint = 'Bold' ImageIndex = 5 ShortCut = 16450 end object RichEditItalic1: TRichEditItalic Category = 'Format' AutoCheck = True Caption = '&Italic' Hint = 'Italic' ImageIndex = 6 ShortCut = 16457 end object RichEditUnderline1: TRichEditUnderline Category = 'Format' AutoCheck = True Caption = '&Underline' Hint = 'Underline' ImageIndex = 7 ShortCut = 16469 end object RichEditStrikeOut1: TRichEditStrikeOut Category = 'Format' AutoCheck = True Caption = '&Strikeout' Hint = 'Strikeout' end object RichEditBullets1: TRichEditBullets Category = 'Format' AutoCheck = True Caption = '&Bullets' Hint = 'Bullets|Inserts a bullet on the current line' ImageIndex = 8 end object RichEditAlignLeft1: TRichEditAlignLeft Category = 'Format' AutoCheck = True Caption = 'Align &Left' Hint = 'Align Left|Aligns text at the left indent' ImageIndex = 9 end object RichEditAlignRight1: TRichEditAlignRight Category = 'Format' AutoCheck = True Caption = 'Align &Right' Hint = 'Align Right|Aligns text at the right indent' ImageIndex = 10 end object RichEditAlignCenter1: TRichEditAlignCenter Category = 'Format' AutoCheck = True Caption = '&Center' Hint = 'Center|Centers text between margins' ImageIndex = 11 end object FileOpen1: TFileOpen Category = 'File' Caption = '&Open...' Hint = 'Open|Opens an existing file' ImageIndex = 12 ShortCut = 16463 end object FileSaveAs1: TFileSaveAs Category = 'File' Caption = 'Save &As...' Hint = 'Save As|Saves the active file with a new name' ImageIndex = 13 end object FilePrintSetup1: TFilePrintSetup Category = 'File' Caption = 'Print Set&up...' Hint = 'Print Setup' end object FileRun1: TFileRun Category = 'File' Browse = False BrowseDlg.Title = 'Run' Caption = '&Run...' Hint = 'Run|Runs an application' Operation = 'open' ShowCmd = scShowNormal end object FileExit1: TFileExit Category = 'File' Caption = 'E&xit' Hint = 'Exit|Quits the application' ImageIndex = 14 end object SearchFind1: TSearchFind Category = 'Search' Caption = '&Find...' Hint = 'Find|Finds the specified text' ImageIndex = 15 ShortCut = 16454 end object SearchFindNext1: TSearchFindNext Category = 'Search' Caption = 'Find &Next' Enabled = False Hint = 'Find Next|Repeats the last find' ImageIndex = 16 ShortCut = 114 end object SearchReplace1: TSearchReplace Category = 'Search' Caption = '&Replace' Hint = 'Replace|Replaces specific text with different text' ImageIndex = 17 end object SearchFindFirst1: TSearchFindFirst Category = 'Search' Caption = 'F&ind First' Hint = 'Find First|Finds the first occurance of specified text' end object CustomizeActionBars1: TCustomizeActionBars Category = 'Tools' Caption = '&Customize' CustomizeDlg.StayOnTop = False end object HelpContents1: THelpContents Category = 'Help' Caption = '&Contents' Enabled = False Hint = 'Help Contents' ImageIndex = 18 end object ActionShowStatus: TAction Category = 'Tools' Caption = 'ShowStatus' OnExecute = ActionShowStatusExecute end end object ImageList1: TImageList Left = 168 Top = 136 Bitmap = { 494C010113001400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000005000000001001000000000000028 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 1040104010420000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000010401040 FF7FFF7F18631042000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000010401040FF7FFF7F 0000000018631863104200000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000104210401040FF7FFF7F00000000 1040104000001863186310420000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000001863000000000000 0000000000000000186300000000000000000000000000000000000000000000 00000000000000000000000000000000000010421040FF7F0000000010401040 1040104010400000186318631042000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000010420000 0000000010420000000000000000000000000000000000001863000000000000 0000000000000000186300000000000000001042000000001040104010400042 E07F104010401040000018631863104200000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000010420000 0000000010420000000000000000000000001042104010401040104010401040 0042104010401040104000001863000000000000000000000000000000000000 0000000000000000000000000000000000000000000000001863000000000000 0000186300000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000001040FF7F1040104010401040 1040E07FE07F1040104010400000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000001863000000000000 0000186300000000000000000000000000000000000000001863000000000000 000018630000000000000000000000000000000000001040FF7F104010401040 104010400042E07FE07F10401040000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000001863000000000000 0000186300000000000000000000000000000000000000001040FF7F10401040 104000421040E07FE07F10401040104000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 1042000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000001040FF7F1040 1040E07FE07FE07F104010401040000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 104200000000000000000000000000000000000000000000000000001040FF7F 1040104010401040104000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000001040 FF7F104010400000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 1040104000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000001042104210421042104210421042 104210421042FF7F186310421863FF7F18630000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000001042104210421042104210421042 1042104210421042FF7F1042FF7F104210420000000000000000000000000000 0000000000000000000000000000000000000000000000420042000000000000 0000000000000000000000000042000000000000000000000000000000000000 0000000000000000000000000000000000001000100010001000000000001042 10421042FF7FFF7FFF7F10001000100010000000000000000000000000000000 0000000000000000000000000000000000000000000000420042000000000000 0000000000000000000000000042000000000000000000000000004200420000 00000000000018630000004200000000000000000000000010001F0010000000 00001042FF7FFF7FFF7F10000000000000000000FF7F00000000000000000000 0000000000000000FF7F00000000000000000000000000420042000000000000 0000000000000000000000000042000000000000000000000000004200420000 000000000000186300000042000000000000000000000000100010001F001000 0000FF7FFF7FFF7FFF7F10000000000000000000FF7F00000000000000000000 0000000000000000FF7F00000000000000000000000000420042000000000000 0000000000000000000000000042000000000000000000000000004200420000 00000000000000000000004200000000000000000000000010001F0010001F00 0000FF7FFF7FFF7FFF7F10000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000420042004200420042 0042004200420042004200420042000000000000000000000000004200420042 004200420042004200420042000000000000000000000000100010001F001000 0000FF7FFF03FF7FFF03100000000000000000000000FF7F0000000000000000 00000000FF7F0000000000000000000000000000000000420042000000000000 0000000000000000000000420042000000000000000000000000004200420000 00000000000000000042004200000000000000000000000010001F0010001F00 0000FF03FF7FFF03FF7F100000000000000000000000FF7F0000000000001863 00000000FF7F0000000000000000000000000000000000420000000000000000 0000000000000000000000000042000000000000000000000000004200001863 186318631863186300000042000000000000000000000000100010001F001000 0000FF7FFF03FF7FFF03100000000000000000000000FF7F0000000000001863 00000000FF7F0000000000000000000000000000000000420000000000000000 0000000000000000000000000042000000000000000000000000004200001863 18631863186318630000004200000000000000000000000010001F0010001F00 0000FF03FF7FFF03FF7F10000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000420000000000000000 0000000000000000000000000042000000000000000000000000004200001863 1863186318631863000000000000000000000000000000001000100010001000 100010001000100010001000000000000000000000000000FF7F000000000000 00000000FF7F0000000000000000000000000000000000420000000000000000 0000000000000000000000000042000000000000000000000000004200001863 1863186318631863000018630000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000420000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000420000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000002 0002000200020000000000000000000000000000000000000000FF7F00000000 000000000000FF7F000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000100010001000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000100010001000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000100010001000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000100010001000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000100010001000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000100010001000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000100010001000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000100010001000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000100010001000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000010001000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000001000 1000100010001000100010001000100010000000000000000000000000000000 0000000000000000000000000000000000000000000000000000100000000000 1000000000001000100000000000000000000000000000000000000000000000 1000100010001000100010001000100010000000000000000000000000001000 FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F10000000000000000000000000000000 0000000000000000000000000000000000000000000000000000100000000000 1000000010000000000010000000000000000000000000000000000000000000 1000FF7FFF7FFF7FFF7FFF7FFF7FFF7F10000000104200421042004210421000 FF7F000000000000000000000000FF7F10000000000000000000000000000000 0000000000000000000000000000000000000000000000000000100000000000 1000000010000000000010000000000000000000000000000000000000000000 1000FF7F00000000000000000000FF7F10000000004210420042104200421000 FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F10000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000010001000 1000000010000000000010000000000000000000000000000000000000000000 1000FF7FFF7FFF7FFF7FFF7FFF7FFF7F10000000104200421042004210421000 FF7F000000000000FF7F10001000100010000000000000000000000000000000 0000000000000000000010000000000000000000000000000000000000000000 10000000100010001000000000000000000000000000FF7FFF7FFF7FFF7FFF7F 1000FF7F00000000000000000000FF7F10000000004210420042104200421000 FF7FFF7FFF7FFF7FFF7F1000FF7F100000000000000010001000100010001000 0000000000000000000010000000000000000000000000000000000000000000 10000000100000000000000000000000000000000000FF7F0000000000000000 1000FF7FFF7FFF7FFF7FFF7FFF7FFF7F10000000104200421042004210421000 FF7FFF7FFF7FFF7FFF7F10001000000000000000000010001000100010000000 0000000000000000000000001000000000000000000000000000000000000000 00000000000000000000000000000000000000000000FF7FFF7FFF7FFF7FFF7F 1000FF7F00000000FF7F10001000100010000000004210420042104200421000 1000100010001000100010000000000000000000000010001000100000000000 0000000000000000000000001000000000000000000000000000000000000000 00000000000000000000000000000000000000000000FF7F0000000000000000 1000FF7FFF7FFF7FFF7F1000FF7F100000000000104200421042004210420042 1042004210420042104200420000000000000000000010001000000010000000 0000000000000000000000001000000000000000000000000000000000000000 00000000000000000000000000000000000000000000FF7FFF7FFF7FFF7FFF7F 1000FF7FFF7FFF7FFF7F10001000000000000000004210420000000000000000 0000000000000000104210420000000000000000000010000000000000001000 1000000000000000000010000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000FF7F00000000FF7F0000 1000100010001000100010000000000000000000104210420000000000000000 0000000000000000104200420000000000000000000000000000000000000000 0000100010001000100000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000FF7FFF7FFF7FFF7F0000 FF7F0000000000000000000000000000000000000042104200420000E07F0000 0000E07F00001042004210420000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000FF7FFF7FFF7FFF7F0000 000000000000000000000000000000000000000000000000000000000000E07F E07F000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000424D3E000000000000003E000000 2800000040000000500000000100010000000000800200000000000000000000 000000000000000000000000FFFFFF00FFFFB6E7FFFF0000FE49B76BFE3F0000 FE498427F81F0000FFFFB76BE00F0000FFFFCEE780070000C7C7FFFF00030000 C7C7C7C700010000C387C7C700000000C007C38700010000C007C00780010000 C007C007C0010000C007C007E0000000C007C007F0000000F39FC007F8030000 F39FF39FFC0F0000F39FF39FFE3F0000FFFFFF7E0000FFFFC001BFFF0000FFFF 8031F003000007C18031E003E00707C18031E003E00707C18001E003E0070101 8001E003E007000180012003E00700018FF1E002E00700018FF1E003E0078003 8FF1E003E007C1078FF1E003FFFFC1078FF1E003F81FE38F8FF5FFFFF81FE38F 8001BF7DF81FE38FFFFF7F7EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 8FFFFFFFFFFFFFFF8C03C007C007C0078FFFFFFFFFFFFFFFFFFFC03FF807F83F FFFFFFFFFFFFFFFF8FFFC007C007C0078C03FFFFFFFFFFFF8FFFC03FF807F01F FFFFFFFFFFFFFFFFFFFFC007C007C0078FFFFFFFFFFFFFFF8C03C03FF807F83F 8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EFFDFFFFFFFFE00FC7FFFFFFFFFFFFFFC3FBF00F81FFF83FE3F7F8C7E3FFF39F F1E7F8C7F1FFF39FF8CFF8C7F8FFF39FFC1FF80FFC7FF39FFE3FF8C7FE3FF39F FC1FF8C7FF1FF39FF8CFF8C7FF8FF39FE1E7F00FFF03E10FC3F3FFFFFFFFFFFF C7FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFFFFFC00FFFF F6CFFE008000FFFFF6B7FE000000FFFFF6B7FE000000FFFFF8B780000000FFF7 FE8F80000001C1F7FE3F80000003C3FBFF7F80000003C7FBFE3F80010003CBFB FEBF80030003DCF7FC9F80070FC3FF0FFDDF807F0003FFFFFDDF80FF8007FFFF FDDF81FFF87FFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 000000000000} end end pyparsing-2.0.3/examples/romanNumerals.py0000664000175000017500000000447612171425201017573 0ustar barrybarry# romanNumerals.py # # Copyright (c) 2006, Paul McGuire # from pyparsing import * def romanNumeralLiteral(numeralString, value): return Literal(numeralString).setParseAction(replaceWith(value)) one = romanNumeralLiteral("I",1) four = romanNumeralLiteral("IV",4) five = romanNumeralLiteral("V",5) nine = romanNumeralLiteral("IX",9) ten = romanNumeralLiteral("X",10) forty = romanNumeralLiteral("XL",40) fifty = romanNumeralLiteral("L",50) ninety = romanNumeralLiteral("XC",90) onehundred = romanNumeralLiteral("C",100) fourhundred = romanNumeralLiteral("CD",400) fivehundred = romanNumeralLiteral("D",500) ninehundred = romanNumeralLiteral("CM",900) onethousand = romanNumeralLiteral("M",1000) numeral = ( onethousand | ninehundred | fivehundred | fourhundred | onehundred | ninety | fifty | forty | ten | nine | five | four | one ).leaveWhitespace() romanNumeral = OneOrMore(numeral).setParseAction( lambda s,l,t : sum(t) ) # unit tests def makeRomanNumeral(n): def addDigit(n,limit,c,s): if n >= limit: n -= limit s += c return n,s ret = "" while n >= 1000: n,ret = addDigit(n,1000,"M",ret) while n >= 900: n,ret = addDigit(n, 900,"CM",ret) while n >= 500: n,ret = addDigit(n, 500,"D",ret) while n >= 400: n,ret = addDigit(n, 400,"CD",ret) while n >= 100: n,ret = addDigit(n, 100,"C",ret) while n >= 90: n,ret = addDigit(n, 90,"XC",ret) while n >= 50: n,ret = addDigit(n, 50,"L",ret) while n >= 40: n,ret = addDigit(n, 40,"XL",ret) while n >= 10: n,ret = addDigit(n, 10,"X",ret) while n >= 9: n,ret = addDigit(n, 9,"IX",ret) while n >= 5: n,ret = addDigit(n, 5,"V",ret) while n >= 4: n,ret = addDigit(n, 4,"IV",ret) while n >= 1: n,ret = addDigit(n, 1,"I",ret) return ret tests = " ".join([makeRomanNumeral(i) for i in range(1,5000+1)]) expected = 1 for t,s,e in romanNumeral.scanString(tests): if t[0] != expected: print("==>", end=' ') print(t,tests[s:e]) expected += 1 print() def test(rn): print(rn,romanNumeral.parseString(rn)) test("XVI") test("XXXIX") test("XIV") test("XIX") test("MCMLXXX") test("MMVI") pyparsing-2.0.3/examples/ebnf.py0000664000175000017500000001022712171425202015652 0ustar barrybarry# This module tries to implement ISO 14977 standard with pyparsing. # pyparsing version 1.1 or greater is required. # ISO 14977 standardize The Extended Backus-Naur Form(EBNF) syntax. # You can read a final draft version here: # http://www.cl.cam.ac.uk/~mgk25/iso-ebnf.html from pyparsing import * all_names = ''' integer meta_identifier terminal_string optional_sequence repeated_sequence grouped_sequence syntactic_primary syntactic_factor syntactic_term single_definition definitions_list syntax_rule syntax '''.split() integer = Word(nums) meta_identifier = Word(alphas, alphanums + '_') terminal_string = Suppress("'") + CharsNotIn("'") + Suppress("'") ^ \ Suppress('"') + CharsNotIn('"') + Suppress('"') definitions_list = Forward() optional_sequence = Suppress('[') + definitions_list + Suppress(']') repeated_sequence = Suppress('{') + definitions_list + Suppress('}') grouped_sequence = Suppress('(') + definitions_list + Suppress(')') syntactic_primary = optional_sequence ^ repeated_sequence ^ \ grouped_sequence ^ meta_identifier ^ terminal_string syntactic_factor = Optional(integer + Suppress('*')) + syntactic_primary syntactic_term = syntactic_factor + Optional(Suppress('-') + syntactic_factor) single_definition = delimitedList(syntactic_term, ',') definitions_list << delimitedList(single_definition, '|') syntax_rule = meta_identifier + Suppress('=') + definitions_list + \ Suppress(';') ebnfComment = ( "(*" + ZeroOrMore( CharsNotIn("*") | ( "*" + ~Literal(")") ) ) + "*)" ).streamline().setName("ebnfComment") syntax = OneOrMore(syntax_rule) syntax.ignore(ebnfComment) def do_integer(str, loc, toks): return int(toks[0]) def do_meta_identifier(str, loc, toks): if toks[0] in symbol_table: return symbol_table[toks[0]] else: forward_count.value += 1 symbol_table[toks[0]] = Forward() return symbol_table[toks[0]] def do_terminal_string(str, loc, toks): return Literal(toks[0]) def do_optional_sequence(str, loc, toks): return Optional(toks[0]) def do_repeated_sequence(str, loc, toks): return ZeroOrMore(toks[0]) def do_grouped_sequence(str, loc, toks): return Group(toks[0]) def do_syntactic_primary(str, loc, toks): return toks[0] def do_syntactic_factor(str, loc, toks): if len(toks) == 2: # integer * syntactic_primary return And([toks[1]] * toks[0]) else: # syntactic_primary return [ toks[0] ] def do_syntactic_term(str, loc, toks): if len(toks) == 2: # syntactic_factor - syntactic_factor return NotAny(toks[1]) + toks[0] else: # syntactic_factor return [ toks[0] ] def do_single_definition(str, loc, toks): toks = toks.asList() if len(toks) > 1: # syntactic_term , syntactic_term , ... return And(toks) else: # syntactic_term return [ toks[0] ] def do_definitions_list(str, loc, toks): toks = toks.asList() if len(toks) > 1: # single_definition | single_definition | ... return Or(toks) else: # single_definition return [ toks[0] ] def do_syntax_rule(str, loc, toks): # meta_identifier = definitions_list ; assert toks[0].expr is None, "Duplicate definition" forward_count.value -= 1 toks[0] << toks[1] return [ toks[0] ] def do_syntax(str, loc, toks): # syntax_rule syntax_rule ... return symbol_table symbol_table = {} class forward_count: pass forward_count.value = 0 for name in all_names: expr = vars()[name] action = vars()['do_' + name] expr.setName(name) expr.setParseAction(action) #~ expr.setDebug() def parse(ebnf, given_table={}): symbol_table.clear() symbol_table.update(given_table) forward_count.value = 0 table = syntax.parseString(ebnf)[0] assert forward_count.value == 0, "Missing definition" for name in table: expr = table[name] expr.setName(name) #~ expr.setDebug() return table pyparsing-2.0.3/examples/chemicalFormulas.py0000664000175000017500000000401612171425202020215 0ustar barrybarry# chemicalFormulas.py # # Copyright (c) 2003, Paul McGuire # from pyparsing import Word, Optional, OneOrMore, Group, ParseException, Regex from pyparsing import alphas atomicWeight = { "O" : 15.9994, "H" : 1.00794, "Na" : 22.9897, "Cl" : 35.4527, "C" : 12.0107 } def test( bnf, strg, fn=None ): try: print(strg,"->", bnf.parseString( strg ), end=' ') except ParseException as pe: print(pe) else: if fn != None: print(fn( bnf.parseString( strg ) )) else: print() digits = "0123456789" # Version 1 element = Regex("A[cglmrstu]|B[aehikr]?|C[adeflmorsu]?|D[bsy]|" "E[rsu]|F[emr]?|G[ade]|H[efgos]?|I[nr]?|Kr?|L[airu]|" "M[dgnot]|N[abdeiop]?|Os?|P[abdmortu]?|R[abefghnu]|" "S[bcegimnr]?|T[abcehilm]|U(u[bhopqst])?|V|W|Xe|Yb?|Z[nr]") element = Word( alphas.upper(), alphas.lower(), max=2) elementRef = Group( element + Optional( Word( digits ), default="1" ) ) formula = OneOrMore( elementRef ) fn = lambda elemList : sum( [ atomicWeight[elem]*int(qty) for elem,qty in elemList ] ) test( formula, "H2O", fn ) test( formula, "C6H5OH", fn ) test( formula, "NaCl", fn ) print() # Version 2 - access parsed items by field name elementRef = Group( element("symbol") + Optional( Word( digits ), default="1" )("qty") ) formula = OneOrMore( elementRef ) fn = lambda elemList : sum( [ atomicWeight[elem.symbol]*int(elem.qty) for elem in elemList ] ) test( formula, "H2O", fn ) test( formula, "C6H5OH", fn ) test( formula, "NaCl", fn ) print() # Version 3 - convert integers during parsing process integer = Word( digits ).setParseAction(lambda t:int(t[0])) elementRef = Group( element("symbol") + Optional( integer, default=1 )("qty") ) formula = OneOrMore( elementRef ) fn = lambda elemList : sum( [ atomicWeight[elem.symbol]*elem.qty for elem in elemList ] ) test( formula, "H2O", fn ) test( formula, "C6H5OH", fn ) test( formula, "NaCl", fn ) pyparsing-2.0.3/examples/greetingInKorean.py0000664000175000017500000000073712171425201020177 0ustar barrybarry# vim:fileencoding=utf-8 # # greetingInKorean.py # # Demonstration of the parsing module, on the prototypical "Hello, World!" example # from pyparsing import Word, srange koreanChars = srange(r"[\0xac00-\0xd7a3]") koreanWord = Word(koreanChars,min=2) # define grammar greet = koreanWord + "," + koreanWord + "!" # input string hello = '\uc548\ub155, \uc5ec\ub7ec\ubd84!' #"Hello, World!" in Korean # parse input string print(greet.parseString( hello )) pyparsing-2.0.3/examples/pymicko.py0000664000175000017500000016627312171425201016427 0ustar barrybarry#!/usr/bin/python # Python/pyparsing educational microC compiler v1.0 # Copyright (C) 2009 Zarko Zivanov # (largely based on flex/bison microC compiler by Zorica Suvajdzin, used with her permission; # current version can be found at http://www.acs.uns.ac.rs, under "Programski Prevodioci" [Serbian site]) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU 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 General Public License for more details. # # A copy of the GNU General Public License can be found at . from pyparsing import * from sys import stdin, stdout, stderr, argv, exit #defines debug level # 0 - no debug # 1 - print parsing results # 2 - print parsing results and symbol table # 3 - print parsing results only, without executing parse actions (grammar-only testing) DEBUG = 0 ########################################################################################## ########################################################################################## # About microC language and microC compiler # microC language and microC compiler are educational tools, and their goal is to show some basic principles # of writing a C language compiler. Compiler represents one (relatively simple) solution, not necessarily the best one. # This Python/pyparsing version is made using Python 2.6.4 and pyparsing 1.5.2 (and it may contain errors :) ) ########################################################################################## ########################################################################################## # Model of the used hypothetical processor # The reason behind using a hypothetical processor is to simplify code generation and to concentrate on the compiler itself. # This compiler can relatively easily be ported to x86, but one must know all the little details about which register # can be used for what, which registers are default for various operations, etc. # The hypothetical processor has 16 registers, called %0 to %15. Register %13 is used for the function return value (x86's eax), # %14 is the stack frame pointer (x86's ebp) and %15 is the stack pointer (x86's esp). All data-handling instructions can be # unsigned (suffix U), or signed (suffix S). These are ADD, SUB, MUL and DIV. These are three-address instructions, # the first two operands are input, the third one is output. Whether these operands are registers, memory or constant # is not relevant, all combinations are possible (except that output cannot be a constant). Constants are writen with a $ prefix (10-base only). # Conditional jumps are handled by JXXY instructions, where XX is LT, GT, LE, GE, EQ, NE (less than, greater than, less than or equal, etc.) # and Y is U or S (unsigned or signed, except for JEQ i JNE). Unconditional jump is JMP. The move instruction is MOV. # Function handling is done using CALL, RET, PUSH and POP (C style function calls). Static data is defined using the WORD directive # (example: variable: WORD 1), whose only argument defines the number of locations that are reserved. ########################################################################################## ########################################################################################## # Grammar of The microC Programming Language # (small subset of C made for compiler course at Faculty of Technical Sciences, Chair for Applied Computer Sciences, Novi Sad, Serbia) # Patterns: # letter # -> "_" | "a" | "A" | "b" | "B" | "c" | "C" | "d" | "D" | "e" | "E" | "f" # | "F" | "g" | "G" | "h" | "H" | "i" | "I" | "j" | "J" | "k" | "K" | "l" # | "L" | "m" | "M" | "n" | "N" | "o" | "O" | "p" | "P" | "q" | "Q" | "r" # | "R" | "s" | "S" | "t" | "T" | "u" | "U" | "v" | "V" | "w" | "W" | "x" # | "X" | "y" | "Y" | "z" | "Z" # digit # -> "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" # identifier # -> letter ( letter | digit )* # int_constant # -> digit + # unsigned_constant # -> digit + ( "u" | "U" ) # Productions: # program # -> variable_list function_list # -> function_list # variable_list # -> variable ";" # -> variable_list variable ";" # variable # -> type identifier # type # -> "int" # -> "unsigned" # function_list # -> function # -> function_list function # function # -> type identifier "(" parameters ")" body # parameters # -> # -> parameter_list # parameter_list # -> variable # -> parameter_list "," variable # body # -> "{" variable_list statement_list "}" # -> "{" statement_list "}" # statement_list # -> # -> statement_list statement # statement # -> assignement_statement # -> function_call_statement # -> if_statement # -> while_statement # -> return_statement # -> compound_statement # assignement_statement # -> identifier "=" num_exp ";" # num_exp # -> mul_exp # -> num_exp "+" mul_exp # -> num_exp "-" mul_exp # mul_exp # -> exp # -> mul_exp "*" exp # -> mul_exp "/" exp # exp # -> constant # -> identifier # -> function_call # -> "(" num_exp ")" # -> "+" exp # -> "-" exp # constant # -> int_constant # -> unsigned_constant # function_call # -> identifier "(" arguments ")" # arguments # -> # -> argument_list # argument_list # -> num_exp # -> argument_list "," num_exp # function_call_statement # -> function_call ";" # if_statement # -> "if" "(" log_exp ")" statement # -> "if" "(" log_exp ")" statement "else" statement # -> -> -> -> -> -> -> -> 2 # log_exp # -> and_exp # -> log_exp "||" and_exp # and_exp # -> rel_exp # -> and_exp "&&" rel_exp # rel_exp # -> num_exp "<" num_exp # -> num_exp ">" num_exp # -> num_exp "<=" num_exp # -> num_exp ">=" num_exp # -> num_exp "==" num_exp # -> num_exp "!=" num_exp # while_statement # -> "while" "(" log_exp ")" statement # return_statement # -> "return" num_exp ";" # compound_statement # -> "{" statement_list "}" # Comment: /* a comment */ ########################################################################################## ########################################################################################## class Enumerate(dict): """C enum emulation (original by Scott David Daniels)""" def __init__(self, names): for number, name in enumerate(names.split()): setattr(self, name, number) self[number] = name class SharedData(object): """Data used in all three main classes""" #Possible kinds of symbol table entries KINDS = Enumerate("NO_KIND WORKING_REGISTER GLOBAL_VAR FUNCTION PARAMETER LOCAL_VAR CONSTANT") #Supported types of functions and variables TYPES = Enumerate("NO_TYPE INT UNSIGNED") #bit size of variables TYPE_BIT_SIZE = 16 #min/max values of constants MIN_INT = -2 ** (TYPE_BIT_SIZE - 1) MAX_INT = 2 ** (TYPE_BIT_SIZE - 1) - 1 MAX_UNSIGNED = 2 ** TYPE_BIT_SIZE - 1 #available working registers (the last one is the register for function's return value!) REGISTERS = "%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12 %13".split() #register for function's return value FUNCTION_REGISTER = len(REGISTERS) - 1 #the index of last working register LAST_WORKING_REGISTER = len(REGISTERS) - 2 #list of relational operators RELATIONAL_OPERATORS = "< > <= >= == !=".split() def __init__(self): #index of the currently parsed function self.functon_index = 0 #name of the currently parsed function self.functon_name = 0 #number of parameters of the currently parsed function self.function_params = 0 #number of local variables of the currently parsed function self.function_vars = 0 ########################################################################################## ########################################################################################## class ExceptionSharedData(object): """Class for exception handling data""" def __init__(self): #position in currently parsed text self.location = 0 #currently parsed text self.text = "" def setpos(self, location, text): """Helper function for setting curently parsed text and position""" self.location = location self.text = text exshared = ExceptionSharedData() class SemanticException(Exception): """Exception for semantic errors found during parsing, similar to ParseException. Introduced because ParseException is used internally in pyparsing and custom messages got lost and replaced by pyparsing's generic errors. """ def __init__(self, message, print_location=True): super(SemanticException,self).__init__() self._message = message self.location = exshared.location self.print_location = print_location if exshared.location != None: self.line = lineno(exshared.location, exshared.text) self.col = col(exshared.location, exshared.text) self.text = line(exshared.location, exshared.text) else: self.line = self.col = self.text = None def _get_message(self): return self._message def _set_message(self, message): self._message = message message = property(_get_message, _set_message) def __str__(self): """String representation of the semantic error""" msg = "Error" if self.print_location and (self.line != None): msg += " at line %d, col %d" % (self.line, self.col) msg += ": %s" % self.message if self.print_location and (self.line != None): msg += "\n%s" % self.text return msg ########################################################################################## ########################################################################################## class SymbolTableEntry(object): """Class which represents one symbol table entry.""" def __init__(self, sname = "", skind = 0, stype = 0, sattr = None, sattr_name = "None"): """Initialization of symbol table entry. sname - symbol name skind - symbol kind stype - symbol type sattr - symbol attribute sattr_name - symbol attribute name (used only for table display) """ self.name = sname self.kind = skind self.type = stype self.attribute = sattr self.attribute_name = sattr_name self.param_types = [] def set_attribute(self, name, value): """Sets attribute's name and value""" self.attribute_name = name self.attribute = value def attribute_str(self): """Returns attribute string (used only for table display)""" return "{0}={1}".format(self.attribute_name, self.attribute) if self.attribute != None else "None" class SymbolTable(object): """Class for symbol table of microC program""" def __init__(self, shared): """Initialization of the symbol table""" self.table = [] self.lable_len = 0 #put working registers in the symbol table for reg in range(SharedData.FUNCTION_REGISTER+1): self.insert_symbol(SharedData.REGISTERS[reg], SharedData.KINDS.WORKING_REGISTER, SharedData.TYPES.NO_TYPE) #shared data self.shared = shared def error(self, text=""): """Symbol table error exception. It should happen only if index is out of range while accessing symbol table. This exeption is not handled by the compiler, so as to allow traceback printing """ if text == "": raise Exception("Symbol table index out of range") else: raise Exception("Symbol table error: %s" % text) def display(self): """Displays the symbol table content""" #Finding the maximum length for each column sym_name = "Symbol name" sym_len = max(max(len(i.name) for i in self.table),len(sym_name)) kind_name = "Kind" kind_len = max(max(len(SharedData.KINDS[i.kind]) for i in self.table),len(kind_name)) type_name = "Type" type_len = max(max(len(SharedData.TYPES[i.type]) for i in self.table),len(type_name)) attr_name = "Attribute" attr_len = max(max(len(i.attribute_str()) for i in self.table),len(attr_name)) #print table header print("{0:3s} | {1:^{2}s} | {3:^{4}s} | {5:^{6}s} | {7:^{8}} | {9:s}".format(" No", sym_name, sym_len, kind_name, kind_len, type_name, type_len, attr_name, attr_len, "Parameters")) print("-----------------------------" + "-" * (sym_len + kind_len + type_len + attr_len)) #print symbol table for i,sym in enumerate(self.table): parameters = "" for p in sym.param_types: if parameters == "": parameters = "{0}".format(SharedData.TYPES[p]) else: parameters += ", {0}".format(SharedData.TYPES[p]) print("{0:3d} | {1:^{2}s} | {3:^{4}s} | {5:^{6}s} | {7:^{8}} | ({9})".format(i, sym.name, sym_len, SharedData.KINDS[sym.kind], kind_len, SharedData.TYPES[sym.type], type_len, sym.attribute_str(), attr_len, parameters)) def insert_symbol(self, sname, skind, stype): """Inserts new symbol at the end of the symbol table. Returns symbol index sname - symbol name skind - symbol kind stype - symbol type """ self.table.append(SymbolTableEntry(sname, skind, stype)) self.table_len = len(self.table) return self.table_len-1 def clear_symbols(self, index): """Clears all symbols begining with the index to the end of table""" try: del self.table[index:] except Exception: self.error() self.table_len = len(self.table) def lookup_symbol(self, sname, skind=list(SharedData.KINDS.keys()), stype=list(SharedData.TYPES.keys())): """Searches for symbol, from the end to the begining. Returns symbol index or None sname - symbol name skind - symbol kind (one kind, list of kinds, or None) deafult: any kind stype - symbol type (or None) default: any type """ skind = skind if isinstance(skind, list) else [skind] stype = stype if isinstance(stype, list) else [stype] for i, sym in [[x, self.table[x]] for x in range(len(self.table) - 1, SharedData.LAST_WORKING_REGISTER, -1)]: if (sym.name == sname) and (sym.kind in skind) and (sym.type in stype): return i return None def insert_id(self, sname, skind, skinds, stype): """Inserts a new identifier at the end of the symbol table, if possible. Returns symbol index, or raises an exception if the symbol alredy exists sname - symbol name skind - symbol kind skinds - symbol kinds to check for stype - symbol type """ index = self.lookup_symbol(sname, skinds) if index == None: index = self.insert_symbol(sname, skind, stype) return index else: raise SemanticException("Redefinition of '%s'" % sname) def insert_global_var(self, vname, vtype): "Inserts a new global variable" return self.insert_id(vname, SharedData.KINDS.GLOBAL_VAR, [SharedData.KINDS.GLOBAL_VAR, SharedData.KINDS.FUNCTION], vtype) def insert_local_var(self, vname, vtype, position): "Inserts a new local variable" index = self.insert_id(vname, SharedData.KINDS.LOCAL_VAR, [SharedData.KINDS.LOCAL_VAR, SharedData.KINDS.PARAMETER], vtype) self.table[index].attribute = position def insert_parameter(self, pname, ptype): "Inserts a new parameter" index = self.insert_id(pname, SharedData.KINDS.PARAMETER, SharedData.KINDS.PARAMETER, ptype) #set parameter's attribute to it's ordinal number self.table[index].set_attribute("Index", self.shared.function_params) #set parameter's type in param_types list of a function self.table[self.shared.function_index].param_types.append(ptype) return index def insert_function(self, fname, ftype): "Inserts a new function" index = self.insert_id(fname, SharedData.KINDS.FUNCTION, [SharedData.KINDS.GLOBAL_VAR, SharedData.KINDS.FUNCTION], ftype) self.table[index].set_attribute("Params",0) return index def insert_constant(self, cname, ctype): """Inserts a constant (or returns index if the constant already exists) Additionally, checks for range. """ index = self.lookup_symbol(cname, stype=ctype) if index == None: num = int(cname) if ctype == SharedData.TYPES.INT: if (num < SharedData.MIN_INT) or (num > SharedData.MAX_INT): raise SemanticException("Integer constant '%s' out of range" % cname) elif ctype == SharedData.TYPES.UNSIGNED: if (num < 0) or (num > SharedData.MAX_UNSIGNED): raise SemanticException("Unsigned constant '%s' out of range" % cname) index = self.insert_symbol(cname, SharedData.KINDS.CONSTANT, ctype) return index def same_types(self, index1, index2): """Returns True if both symbol table elements are of the same type""" try: same = self.table[index1].type == self.table[index2].type != SharedData.TYPES.NO_TYPE except Exception: self.error() return same def same_type_as_argument(self, index, function_index, argument_number): """Returns True if index and function's argument are of the same type index - index in symbol table function_index - function's index in symbol table argument_number - # of function's argument """ try: same = self.table[function_index].param_types[argument_number] == self.table[index].type except Exception: self.error() return same def get_attribute(self, index): try: return self.table[index].attribute except Exception: self.error() def set_attribute(self, index, value): try: self.table[index].attribute = value except Exception: self.error() def get_name(self, index): try: return self.table[index].name except Exception: self.error() def get_kind(self, index): try: return self.table[index].kind except Exception: self.error() def get_type(self, index): try: return self.table[index].type except Exception: self.error() def set_type(self, index, stype): try: self.table[index].type = stype except Exception: self.error() ########################################################################################## ########################################################################################## class CodeGenerator(object): """Class for code generation methods.""" #dictionary of relational operators RELATIONAL_DICT = dict([op,i] for i, op in enumerate(SharedData.RELATIONAL_OPERATORS)) #conditional jumps for relational operators CONDITIONAL_JUMPS = ["JLTS", "JGTS", "JLES", "JGES", "JEQ ", "JNE ", "JLTU", "JGTU", "JLEU", "JGEU", "JEQ ", "JNE "] #opposite conditional jumps for relational operators OPPOSITE_JUMPS = ["JGES", "JLES", "JGTS", "JLTS", "JNE ", "JEQ ", "JGEU", "JLEU", "JGTU", "JLTU", "JNE ", "JEQ "] #supported operations OPERATIONS = {"+" : "ADD", "-" : "SUB", "*" : "MUL", "/" : "DIV"} #suffixes for signed and unsigned operations (if no type is specified, unsigned will be assumed) OPSIGNS = {SharedData.TYPES.NO_TYPE : "U", SharedData.TYPES.INT : "S", SharedData.TYPES.UNSIGNED : "U"} #text at start of data segment DATA_START_TEXT = "#DATA" #text at start of code segment CODE_START_TEXT = "#CODE" def __init__(self, shared, symtab): #generated code self.code = "" #prefix for internal labels self.internal = "@" #suffix for label definition self.definition = ":" #list of free working registers self.free_registers = list(range(SharedData.FUNCTION_REGISTER, -1, -1)) #list of used working registers self.used_registers = [] #list of used registers needed when function call is inside of a function call self.used_registers_stack = [] #shared data self.shared = shared #symbol table self.symtab = symtab def error(self, text): """Compiler error exception. It should happen only if something is wrong with compiler. This exeption is not handled by the compiler, so as to allow traceback printing """ raise Exception("Compiler error: %s" % text) def take_register(self, rtype = SharedData.TYPES.NO_TYPE): """Reserves one working register and sets its type""" if len(self.free_registers) == 0: self.error("no more free registers") reg = self.free_registers.pop() self.used_registers.append(reg) self.symtab.set_type(reg, rtype) return reg def take_function_register(self, rtype = SharedData.TYPES.NO_TYPE): """Reserves register for function return value and sets its type""" reg = SharedData.FUNCTION_REGISTER if reg not in self.free_registers: self.error("function register already taken") self.free_registers.remove(reg) self.used_registers.append(reg) self.symtab.set_type(reg, rtype) return reg def free_register(self, reg): """Releases working register""" if reg not in self.used_registers: self.error("register %s is not taken" % self.REGISTERS[reg]) self.used_registers.remove(reg) self.free_registers.append(reg) self.free_registers.sort(reverse = True) def free_if_register(self, index): """If index is a working register, free it, otherwise just return (helper function)""" if (index < 0) or (index > SharedData.FUNCTION_REGISTER): return else: self.free_register(index) def label(self, name, internal=False, definition=False): """Generates label name (helper function) name - label name internal - boolean value, adds "@" prefix to label definition - boolean value, adds ":" suffix to label """ return "{0}{1}{2}".format(self.internal if internal else "", name, self.definition if definition else "") def symbol(self, index): """Generates symbol name from index""" #if index is actually a string, just return it if isinstance(index, str): return index elif (index < 0) or (index >= self.symtab.table_len): self.error("symbol table index out of range") sym = self.symtab.table[index] #local variables are located at negative offset from frame pointer register if sym.kind == SharedData.KINDS.LOCAL_VAR: return "-{0}(%14)".format(sym.attribute * 4 + 4) #parameters are located at positive offset from frame pointer register elif sym.kind == SharedData.KINDS.PARAMETER: return "{0}(%14)".format(8 + sym.attribute * 4) elif sym.kind == SharedData.KINDS.CONSTANT: return "${0}".format(sym.name) else: return "{0}".format(sym.name) def save_used_registers(self): """Pushes all used working registers before function call""" used = self.used_registers[:] del self.used_registers[:] self.used_registers_stack.append(used[:]) used.sort() for reg in used: self.newline_text("PUSH\t%s" % SharedData.REGISTERS[reg], True) self.free_registers.extend(used) self.free_registers.sort(reverse = True) def restore_used_registers(self): """Pops all used working registers after function call""" used = self.used_registers_stack.pop() self.used_registers = used[:] used.sort(reverse = True) for reg in used: self.newline_text("POP \t%s" % SharedData.REGISTERS[reg], True) self.free_registers.remove(reg) def text(self, text): """Inserts text into generated code""" self.code += text def prepare_data_segment(self): """Inserts text at the start of data segment""" self.text(self.DATA_START_TEXT) def prepare_code_segment(self): """Inserts text at the start of code segment""" self.newline_text(self.CODE_START_TEXT) def newline(self, indent=False): """Inserts a newline, optionally with indentation.""" self.text("\n") if indent: self.text("\t\t\t") def newline_text(self, text, indent = False): """Inserts a newline and text, optionally with indentation (helper function)""" self.newline(indent) self.text(text) def newline_label(self, name, internal=False, definition=False): """Inserts a newline and a label (helper function) name - label name internal - boolean value, adds "@" prefix to label definition - boolean value, adds ":" suffix to label """ self.newline_text(self.label("{0}{1}{2}".format("@" if internal else "", name, ":" if definition else ""))) def global_var(self, name): """Inserts a new static (global) variable definition""" self.newline_label(name, False, True) self.newline_text("WORD\t1", True) def arithmetic_mnemonic(self, op_name, op_type): """Generates an arithmetic instruction mnemonic""" return self.OPERATIONS[op_name] + self.OPSIGNS[op_type] def arithmetic(self, operation, operand1, operand2, operand3 = None): """Generates an arithmetic instruction operation - one of supporetd operations operandX - index in symbol table or text representation of operand First two operands are input, third one is output """ if isinstance(operand1, int): output_type = self.symtab.get_type(operand1) self.free_if_register(operand1) else: output_type = None if isinstance(operand2, int): output_type = self.symtab.get_type(operand2) if output_type == None else output_type self.free_if_register(operand2) else: output_type = SharedData.TYPES.NO_TYPE if output_type == None else output_type #if operand3 is not defined, reserve one free register for it output = self.take_register(output_type) if operand3 == None else operand3 mnemonic = self.arithmetic_mnemonic(operation, output_type) self.newline_text("{0}\t{1},{2},{3}".format(mnemonic, self.symbol(operand1), self.symbol(operand2), self.symbol(output)), True) return output def relop_code(self, relop, operands_type): """Returns code for relational operator relop - relational operator operands_type - int or unsigned """ code = self.RELATIONAL_DICT[relop] offset = 0 if operands_type == SharedData.TYPES.INT else len(SharedData.RELATIONAL_OPERATORS) return code + offset def jump(self, relcode, opposite, label): """Generates a jump instruction relcode - relational operator code opposite - generate normal or opposite jump label - jump label """ jump = self.OPPOSITE_JUMPS[relcode] if opposite else self.CONDITIONAL_JUMPS[relcode] self.newline_text("{0}\t{1}".format(jump, label), True) def unconditional_jump(self, label): """Generates an unconditional jump instruction label - jump label """ self.newline_text("JMP \t{0}".format(label), True) def move(self,operand1, operand2): """Generates a move instruction If the output operand (opernad2) is a working register, sets it's type operandX - index in symbol table or text representation of operand """ if isinstance(operand1, int): output_type = self.symtab.get_type(operand1) self.free_if_register(operand1) else: output_type = SharedData.TYPES.NO_TYPE self.newline_text("MOV \t{0},{1}".format(self.symbol(operand1), self.symbol(operand2)), True) if isinstance(operand2, int): if self.symtab.get_kind(operand2) == SharedData.KINDS.WORKING_REGISTER: self.symtab.set_type(operand2, output_type) def push(self, operand): """Generates a push operation""" self.newline_text("PUSH\t%s" % self.symbol(operand), True) def pop(self, operand): """Generates a pop instruction""" self.newline_text("POP \t%s" % self.symbol(operand), True) def compare(self, operand1, operand2): """Generates a compare instruction operandX - index in symbol table """ typ = self.symtab.get_type(operand1) self.free_if_register(operand1) self.free_if_register(operand2) self.newline_text("CMP{0}\t{1},{2}".format(self.OPSIGNS[typ], self.symbol(operand1), self.symbol(operand2)), True) def function_begin(self): """Inserts function name label and function frame initialization""" self.newline_label(self.shared.function_name, False, True) self.push("%14") self.move("%15", "%14") def function_body(self): """Inserts a local variable initialization and body label""" if self.shared.function_vars > 0: const = self.symtab.insert_constant("{0}".format(self.shared.function_vars * 4), SharedData.TYPES.UNSIGNED) self.arithmetic("-", "%15", const, "%15") self.newline_label(self.shared.function_name + "_body", True, True) def function_end(self): """Inserts an exit label and function return instructions""" self.newline_label(self.shared.function_name + "_exit", True, True) self.move("%14", "%15") self.pop("%14") self.newline_text("RET", True) def function_call(self, function, arguments): """Generates code for a function call function - function index in symbol table arguments - list of arguments (indexes in symbol table) """ #push each argument to stack for arg in arguments: self.push(self.symbol(arg)) self.free_if_register(arg) self.newline_text("CALL\t"+self.symtab.get_name(function), True) args = self.symtab.get_attribute(function) #generates stack cleanup if function has arguments if args > 0: args_space = self.symtab.insert_constant("{0}".format(args * 4), SharedData.TYPES.UNSIGNED) self.arithmetic("+", "%15", args_space, "%15") ########################################################################################## ########################################################################################## class MicroC(object): """Class for microC parser/compiler""" def __init__(self): #Definitions of terminal symbols for microC programming language self.tId = Word(alphas+"_",alphanums+"_") self.tInteger = Word(nums).setParseAction(lambda x : [x[0], SharedData.TYPES.INT]) self.tUnsigned = Regex(r"[0-9]+[uU]").setParseAction(lambda x : [x[0][:-1], SharedData.TYPES.UNSIGNED]) self.tConstant = (self.tUnsigned | self.tInteger).setParseAction(self.constant_action) self.tType = Keyword("int").setParseAction(lambda x : SharedData.TYPES.INT) | \ Keyword("unsigned").setParseAction(lambda x : SharedData.TYPES.UNSIGNED) self.tRelOp = oneOf(SharedData.RELATIONAL_OPERATORS) self.tMulOp = oneOf("* /") self.tAddOp = oneOf("+ -") #Definitions of rules for global variables self.rGlobalVariable = (self.tType("type") + self.tId("name") + FollowedBy(";")).setParseAction(self.global_variable_action) self.rGlobalVariableList = ZeroOrMore(self.rGlobalVariable + Suppress(";")) #Definitions of rules for numeric expressions self.rExp = Forward() self.rMulExp = Forward() self.rNumExp = Forward() self.rArguments = delimitedList(self.rNumExp("exp").setParseAction(self.argument_action)) self.rFunctionCall = ((self.tId("name") + FollowedBy("(")).setParseAction(self.function_call_prepare_action) + Suppress("(") + Optional(self.rArguments)("args") + Suppress(")")).setParseAction(self.function_call_action) self.rExp << (self.rFunctionCall | self.tConstant | self.tId("name").setParseAction(self.lookup_id_action) | Group(Suppress("(") + self.rNumExp + Suppress(")")) | Group("+" + self.rExp) | Group("-" + self.rExp)).setParseAction(lambda x : x[0]) self.rMulExp << ((self.rExp + ZeroOrMore(self.tMulOp + self.rExp))).setParseAction(self.mulexp_action) self.rNumExp << (self.rMulExp + ZeroOrMore(self.tAddOp + self.rMulExp)).setParseAction(self.numexp_action) #Definitions of rules for logical expressions (these are without parenthesis support) self.rAndExp = Forward() self.rLogExp = Forward() self.rRelExp = (self.rNumExp + self.tRelOp + self.rNumExp).setParseAction(self.relexp_action) self.rAndExp << (self.rRelExp("exp") + ZeroOrMore(Literal("&&").setParseAction(self.andexp_action) + self.rRelExp("exp")).setParseAction(lambda x : self.relexp_code)) self.rLogExp << (self.rAndExp("exp") + ZeroOrMore(Literal("||").setParseAction(self.logexp_action) + self.rAndExp("exp")).setParseAction(lambda x : self.andexp_code)) #Definitions of rules for statements self.rStatement = Forward() self.rStatementList = Forward() self.rReturnStatement = (Keyword("return") + self.rNumExp("exp") + Suppress(";")).setParseAction(self.return_action) self.rAssignmentStatement = (self.tId("var") + Suppress("=") + self.rNumExp("exp") + Suppress(";")).setParseAction(self.assignment_action) self.rFunctionCallStatement = self.rFunctionCall + Suppress(";") self.rIfStatement = ( (Keyword("if") + FollowedBy("(")).setParseAction(self.if_begin_action) + (Suppress("(") + self.rLogExp + Suppress(")")).setParseAction(self.if_body_action) + (self.rStatement + Empty()).setParseAction(self.if_else_action) + Optional(Keyword("else") + self.rStatement)).setParseAction(self.if_end_action) self.rWhileStatement = ( (Keyword("while") + FollowedBy("(")).setParseAction(self.while_begin_action) + (Suppress("(") + self.rLogExp + Suppress(")")).setParseAction(self.while_body_action) + self.rStatement).setParseAction(self.while_end_action) self.rCompoundStatement = Group(Suppress("{") + self.rStatementList + Suppress("}")) self.rStatement << (self.rReturnStatement | self.rIfStatement | self.rWhileStatement | self.rFunctionCallStatement | self.rAssignmentStatement | self.rCompoundStatement) self.rStatementList << ZeroOrMore(self.rStatement) self.rLocalVariable = (self.tType("type") + self.tId("name") + FollowedBy(";")).setParseAction(self.local_variable_action) self.rLocalVariableList = ZeroOrMore(self.rLocalVariable + Suppress(";")) self.rFunctionBody = Suppress("{") + Optional(self.rLocalVariableList).setParseAction(self.function_body_action) + \ self.rStatementList + Suppress("}") self.rParameter = (self.tType("type") + self.tId("name")).setParseAction(self.parameter_action) self.rParameterList = delimitedList(self.rParameter) self.rFunction = ( (self.tType("type") + self.tId("name")).setParseAction(self.function_begin_action) + Group(Suppress("(") + Optional(self.rParameterList)("params") + Suppress(")") + self.rFunctionBody)).setParseAction(self.function_end_action) self.rFunctionList = OneOrMore(self.rFunction) self.rProgram = (Empty().setParseAction(self.data_begin_action) + self.rGlobalVariableList + Empty().setParseAction(self.code_begin_action) + self.rFunctionList).setParseAction(self.program_end_action) #shared data self.shared = SharedData() #symbol table self.symtab = SymbolTable(self.shared) #code generator self.codegen = CodeGenerator(self.shared, self.symtab) #index of the current function call self.function_call_index = -1 #stack for the nested function calls self.function_call_stack = [] #arguments of the current function call self.function_arguments = [] #stack for arguments of the nested function calls self.function_arguments_stack = [] #number of arguments for the curent function call self.function_arguments_number = -1 #stack for the number of arguments for the nested function calls self.function_arguments_number_stack = [] #last relational expression self.relexp_code = None #last and expression self.andexp_code = None #label number for "false" internal labels self.false_label_number = -1 #label number for all other internal labels self.label_number = None #label stack for nested statements self.label_stack = [] def warning(self, message, print_location=True): """Displays warning message. Uses exshared for current location of parsing""" msg = "Warning" if print_location and (exshared.location != None): wline = lineno(exshared.location, exshared.text) wcol = col(exshared.location, exshared.text) wtext = line(exshared.location, exshared.text) msg += " at line %d, col %d" % (wline, wcol) msg += ": %s" % message if print_location and (exshared.location != None): msg += "\n%s" % wtext print(msg) def data_begin_action(self): """Inserts text at start of data segment""" self.codegen.prepare_data_segment() def code_begin_action(self): """Inserts text at start of code segment""" self.codegen.prepare_code_segment() def global_variable_action(self, text, loc, var): """Code executed after recognising a global variable""" exshared.setpos(loc, text) if DEBUG > 0: print("GLOBAL_VAR:",var) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return index = self.symtab.insert_global_var(var.name, var.type) self.codegen.global_var(var.name) return index def local_variable_action(self, text, loc, var): """Code executed after recognising a local variable""" exshared.setpos(loc, text) if DEBUG > 0: print("LOCAL_VAR:",var, var.name, var.type) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return index = self.symtab.insert_local_var(var.name, var.type, self.shared.function_vars) self.shared.function_vars += 1 return index def parameter_action(self, text, loc, par): """Code executed after recognising a parameter""" exshared.setpos(loc, text) if DEBUG > 0: print("PARAM:",par) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return index = self.symtab.insert_parameter(par.name, par.type) self.shared.function_params += 1 return index def constant_action(self, text, loc, const): """Code executed after recognising a constant""" exshared.setpos(loc, text) if DEBUG > 0: print("CONST:",const) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return return self.symtab.insert_constant(const[0], const[1]) def function_begin_action(self, text, loc, fun): """Code executed after recognising a function definition (type and function name)""" exshared.setpos(loc, text) if DEBUG > 0: print("FUN_BEGIN:",fun) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return self.shared.function_index = self.symtab.insert_function(fun.name, fun.type) self.shared.function_name = fun.name self.shared.function_params = 0 self.shared.function_vars = 0 self.codegen.function_begin(); def function_body_action(self, text, loc, fun): """Code executed after recognising the beginning of function's body""" exshared.setpos(loc, text) if DEBUG > 0: print("FUN_BODY:",fun) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return self.codegen.function_body() def function_end_action(self, text, loc, fun): """Code executed at the end of function definition""" if DEBUG > 0: print("FUN_END:",fun) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return #set function's attribute to number of function parameters self.symtab.set_attribute(self.shared.function_index, self.shared.function_params) #clear local function symbols (but leave function name) self.symtab.clear_symbols(self.shared.function_index + 1) self.codegen.function_end() def return_action(self, text, loc, ret): """Code executed after recognising a return statement""" exshared.setpos(loc, text) if DEBUG > 0: print("RETURN:",ret) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return if not self.symtab.same_types(self.shared.function_index, ret.exp[0]): raise SemanticException("Incompatible type in return") #set register for function's return value to expression value reg = self.codegen.take_function_register() self.codegen.move(ret.exp[0], reg) #after return statement, register for function's return value is available again self.codegen.free_register(reg) #jump to function's exit self.codegen.unconditional_jump(self.codegen.label(self.shared.function_name+"_exit", True)) def lookup_id_action(self, text, loc, var): """Code executed after recognising an identificator in expression""" exshared.setpos(loc, text) if DEBUG > 0: print("EXP_VAR:",var) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return var_index = self.symtab.lookup_symbol(var.name, [SharedData.KINDS.GLOBAL_VAR, SharedData.KINDS.PARAMETER, SharedData.KINDS.LOCAL_VAR]) if var_index == None: raise SemanticException("'%s' undefined" % var.name) return var_index def assignment_action(self, text, loc, assign): """Code executed after recognising an assignment statement""" exshared.setpos(loc, text) if DEBUG > 0: print("ASSIGN:",assign) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return var_index = self.symtab.lookup_symbol(assign.var, [SharedData.KINDS.GLOBAL_VAR, SharedData.KINDS.PARAMETER, SharedData.KINDS.LOCAL_VAR]) if var_index == None: raise SemanticException("Undefined lvalue '%s' in assignment" % assign.var) if not self.symtab.same_types(var_index, assign.exp[0]): raise SemanticException("Incompatible types in assignment") self.codegen.move(assign.exp[0], var_index) def mulexp_action(self, text, loc, mul): """Code executed after recognising a mulexp expression (something *|/ something)""" exshared.setpos(loc, text) if DEBUG > 0: print("MUL_EXP:",mul) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return #iterate through all multiplications/divisions m = list(mul) while len(m) > 1: if not self.symtab.same_types(m[0], m[2]): raise SemanticException("Invalid opernads to binary '%s'" % m[1]) reg = self.codegen.arithmetic(m[1], m[0], m[2]) #replace first calculation with it's result m[0:3] = [reg] return m[0] def numexp_action(self, text, loc, num): """Code executed after recognising a numexp expression (something +|- something)""" exshared.setpos(loc, text) if DEBUG > 0: print("NUM_EXP:",num) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return #iterate through all additions/substractions n = list(num) while len(n) > 1: if not self.symtab.same_types(n[0], n[2]): raise SemanticException("Invalid opernads to binary '%s'" % n[1]) reg = self.codegen.arithmetic(n[1], n[0], n[2]) #replace first calculation with it's result n[0:3] = [reg] return n[0] def function_call_prepare_action(self, text, loc, fun): """Code executed after recognising a function call (type and function name)""" exshared.setpos(loc, text) if DEBUG > 0: print("FUN_PREP:",fun) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return index = self.symtab.lookup_symbol(fun.name, SharedData.KINDS.FUNCTION) if index == None: raise SemanticException("'%s' is not a function" % fun.name) #save any previous function call data (for nested function calls) self.function_call_stack.append(self.function_call_index) self.function_call_index = index self.function_arguments_stack.append(self.function_arguments[:]) del self.function_arguments[:] self.codegen.save_used_registers() def argument_action(self, text, loc, arg): """Code executed after recognising each of function's arguments""" exshared.setpos(loc, text) if DEBUG > 0: print("ARGUMENT:",arg.exp) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return arg_ordinal = len(self.function_arguments) #check argument's type if not self.symtab.same_type_as_argument(arg.exp, self.function_call_index, arg_ordinal): raise SemanticException("Incompatible type for argument %d in '%s'" % (arg_ordinal + 1, self.symtab.get_name(self.function_call_index))) self.function_arguments.append(arg.exp) def function_call_action(self, text, loc, fun): """Code executed after recognising the whole function call""" exshared.setpos(loc, text) if DEBUG > 0: print("FUN_CALL:",fun) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return #check number of arguments if len(self.function_arguments) != self.symtab.get_attribute(self.function_call_index): raise SemanticException("Wrong number of arguments for function '%s'" % fun.name) #arguments should be pushed to stack in reverse order self.function_arguments.reverse() self.codegen.function_call(self.function_call_index, self.function_arguments) self.codegen.restore_used_registers() return_type = self.symtab.get_type(self.function_call_index) #restore previous function call data self.function_call_index = self.function_call_stack.pop() self.function_arguments = self.function_arguments_stack.pop() register = self.codegen.take_register(return_type) #move result to a new free register, to allow the next function call self.codegen.move(self.codegen.take_function_register(return_type), register) return register def relexp_action(self, text, loc, arg): """Code executed after recognising a relexp expression (something relop something)""" if DEBUG > 0: print("REL_EXP:",arg) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return exshared.setpos(loc, text) if not self.symtab.same_types(arg[0], arg[2]): raise SemanticException("Invalid operands for operator '{0}'".format(arg[1])) self.codegen.compare(arg[0], arg[2]) #return relational operator's code self.relexp_code = self.codegen.relop_code(arg[1], self.symtab.get_type(arg[0])) return self.relexp_code def andexp_action(self, text, loc, arg): """Code executed after recognising a andexp expression (something and something)""" exshared.setpos(loc, text) if DEBUG > 0: print("AND+EXP:",arg) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return label = self.codegen.label("false{0}".format(self.false_label_number), True, False) self.codegen.jump(self.relexp_code, True, label) self.andexp_code = self.relexp_code return self.andexp_code def logexp_action(self, text, loc, arg): """Code executed after recognising logexp expression (something or something)""" exshared.setpos(loc, text) if DEBUG > 0: print("LOG_EXP:",arg) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return label = self.codegen.label("true{0}".format(self.label_number), True, False) self.codegen.jump(self.relexp_code, False, label) self.codegen.newline_label("false{0}".format(self.false_label_number), True, True) self.false_label_number += 1 def if_begin_action(self, text, loc, arg): """Code executed after recognising an if statement (if keyword)""" exshared.setpos(loc, text) if DEBUG > 0: print("IF_BEGIN:",arg) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return self.false_label_number += 1 self.label_number = self.false_label_number self.codegen.newline_label("if{0}".format(self.label_number), True, True) def if_body_action(self, text, loc, arg): """Code executed after recognising if statement's body""" exshared.setpos(loc, text) if DEBUG > 0: print("IF_BODY:",arg) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return #generate conditional jump (based on last compare) label = self.codegen.label("false{0}".format(self.false_label_number), True, False) self.codegen.jump(self.relexp_code, True, label) #generate 'true' label (executes if condition is satisfied) self.codegen.newline_label("true{0}".format(self.label_number), True, True) #save label numbers (needed for nested if/while statements) self.label_stack.append(self.false_label_number) self.label_stack.append(self.label_number) def if_else_action(self, text, loc, arg): """Code executed after recognising if statement's else body""" exshared.setpos(loc, text) if DEBUG > 0: print("IF_ELSE:",arg) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return #jump to exit after all statements for true condition are executed self.label_number = self.label_stack.pop() label = self.codegen.label("exit{0}".format(self.label_number), True, False) self.codegen.unconditional_jump(label) #generate final 'false' label (executes if condition isn't satisfied) self.codegen.newline_label("false{0}".format(self.label_stack.pop()), True, True) self.label_stack.append(self.label_number) def if_end_action(self, text, loc, arg): """Code executed after recognising a whole if statement""" exshared.setpos(loc, text) if DEBUG > 0: print("IF_END:",arg) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return self.codegen.newline_label("exit{0}".format(self.label_stack.pop()), True, True) def while_begin_action(self, text, loc, arg): """Code executed after recognising a while statement (while keyword)""" exshared.setpos(loc, text) if DEBUG > 0: print("WHILE_BEGIN:",arg) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return self.false_label_number += 1 self.label_number = self.false_label_number self.codegen.newline_label("while{0}".format(self.label_number), True, True) def while_body_action(self, text, loc, arg): """Code executed after recognising while statement's body""" exshared.setpos(loc, text) if DEBUG > 0: print("WHILE_BODY:",arg) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return #generate conditional jump (based on last compare) label = self.codegen.label("false{0}".format(self.false_label_number), True, False) self.codegen.jump(self.relexp_code, True, label) #generate 'true' label (executes if condition is satisfied) self.codegen.newline_label("true{0}".format(self.label_number), True, True) self.label_stack.append(self.false_label_number) self.label_stack.append(self.label_number) def while_end_action(self, text, loc, arg): """Code executed after recognising a whole while statement""" exshared.setpos(loc, text) if DEBUG > 0: print("WHILE_END:",arg) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return #jump to condition checking after while statement body self.label_number = self.label_stack.pop() label = self.codegen.label("while{0}".format(self.label_number), True, False) self.codegen.unconditional_jump(label) #generate final 'false' label and exit label self.codegen.newline_label("false{0}".format(self.label_stack.pop()), True, True) self.codegen.newline_label("exit{0}".format(self.label_number), True, True) def program_end_action(self, text, loc, arg): """Checks if there is a 'main' function and the type of 'main' function""" exshared.setpos(loc, text) if DEBUG > 0: print("PROGRAM_END:",arg) if DEBUG == 2: self.symtab.display() if DEBUG > 2: return index = self.symtab.lookup_symbol("main",SharedData.KINDS.FUNCTION) if index == None: raise SemanticException("Undefined reference to 'main'", False) elif self.symtab.get_type(index) != SharedData.TYPES.INT: self.warning("Return type of 'main' is not int", False) def parse_text(self,text): """Parse string (helper function)""" try: return self.rProgram.ignore(cStyleComment).parseString(text, parseAll=True) except SemanticException as err: print(err) exit(3) except ParseException as err: print(err) exit(3) def parse_file(self,filename): """Parse file (helper function)""" try: return self.rProgram.ignore(cStyleComment).parseFile(filename, parseAll=True) except SemanticException as err: print(err) exit(3) except ParseException as err: print(err) exit(3) ########################################################################################## ########################################################################################## if 0: #main program mc = MicroC() output_file = "output.asm" if len(argv) == 1: input_file = stdin elif len(argv) == 2: input_file = argv[1] elif len(argv) == 3: input_file = argv[1] output_file = argv[2] else: usage = """Usage: {0} [input_file [output_file]] If output file is omitted, output.asm is used If input file is omitted, stdin is used""".format(argv[0]) print(usage) exit(1) try: parse = stdin if input_file == stdin else open(input_file,'r') except Exception: print("Input file '%s' open error" % input_file) exit(2) mc.parse_file(parse) #if you want to see the final symbol table, uncomment next line #mc.symtab.display() try: out = open(output_file, 'w') out.write(mc.codegen.code) out.close except Exception: print("Output file '%s' open error" % output_file) exit(2) ########################################################################################## ########################################################################################## if __name__ == "__main__": test_program_example = """ int a; int b; int c; unsigned d; int fun1(int x, unsigned y) { return 123; } int fun2(int a) { return 1 + a * fun1(a, 456u); } int main(int x, int y) { int w; unsigned z; if (9 > 8 && 2 < 3 || 6 != 5 && a <= b && c < x || w >= y) { a = b + 1; if (x == y) while (d < 4u) x = x * w; else while (a + b < c - y && x > 3 || y < 2) if (z > d) a = a - 4; else b = a * b * c * x / y; } else c = 4; a = fun1(x,d) + fun2(fun1(fun2(w + 3 * 2) + 2 * c, 2u)); return 2; } """ mc = MicroC() mc.parse_text(test_program_example) print(mc.codegen.code)pyparsing-2.0.3/examples/mozilla.ics0000664000175000017500000000136012171425201016532 0ustar barrybarryBEGIN:VCALENDAR VERSION :2.0 PRODID :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN METHOD :PUBLISH BEGIN:VEVENT UID :153ed0e0-1dd2-11b2-9d71-96da104537a4 SUMMARY :Test event DESCRIPTION :Some notes LOCATION :Somewhere over the rainbow CATEGORIES :Personal URL :http://personal.amec.fi STATUS :CONFIRMED CLASS :PRIVATE X ;MEMBER=AlarmEmailAddress :petri.savolainen@iki.fi X-MOZILLA-RECUR-DEFAULT-UNITS :months RRULE :FREQ=MONTHLY;UNTIL=20040914;INTERVAL=1 EXDATE :20040714T000000 DTSTART ;VALUE=DATE :20040714 DTEND ;VALUE=DATE :20040815 DTSTAMP :20040714T141219Z LAST-MODIFIED :20040714T141457Z BEGIN:VALARM TRIGGER ;VALUE=DURATION :PT15M END:VALARM END:VEVENT END:VCALENDAR pyparsing-2.0.3/examples/searchparser.py0000664000175000017500000002476112171425202017432 0ustar barrybarry"""Search query parser version 2006-03-09 This search query parser uses the excellent Pyparsing module (http://pyparsing.sourceforge.net/) to parse search queries by users. It handles: * 'and', 'or' and implicit 'and' operators; * parentheses; * quoted strings; * wildcards at the end of a search term (help*); Requirements: * Python * Pyparsing If you run this script, it will perform a number of tests. To use is as a module, you should use inheritance on the SearchQueryParser class and overwrite the Get... methods. The ParserTest class gives a very simple example of how this could work. ------------------------------------------------------------------------------- Copyright (c) 2006, Estrate, the Netherlands All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Estrate nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. CONTRIBUTORS: - Steven Mooij - Rudolph Froger - Paul McGuire TODO: - add more docs - ask someone to check my English texts - add more kinds of wildcards ('*' at the beginning and '*' inside a word)? """ from pyparsing import Word, alphanums, Keyword, Group, Combine, Forward, Suppress, Optional, OneOrMore, oneOf from sets import Set class SearchQueryParser: def __init__(self): self._methods = { 'and': self.evaluateAnd, 'or': self.evaluateOr, 'not': self.evaluateNot, 'parenthesis': self.evaluateParenthesis, 'quotes': self.evaluateQuotes, 'word': self.evaluateWord, 'wordwildcard': self.evaluateWordWildcard, } self._parser = self.parser() def parser(self): """ This function returns a parser. The grammar should be like most full text search engines (Google, Tsearch, Lucene). Grammar: - a query consists of alphanumeric words, with an optional '*' wildcard at the end of a word - a sequence of words between quotes is a literal string - words can be used together by using operators ('and' or 'or') - words with operators can be grouped with parenthesis - a word or group of words can be preceded by a 'not' operator - the 'and' operator precedes an 'or' operator - if an operator is missing, use an 'and' operator """ operatorOr = Forward() operatorWord = Group(Combine(Word(alphanums) + Suppress('*'))).setResultsName('wordwildcard') | \ Group(Word(alphanums)).setResultsName('word') operatorQuotesContent = Forward() operatorQuotesContent << ( (operatorWord + operatorQuotesContent) | operatorWord ) operatorQuotes = Group( Suppress('"') + operatorQuotesContent + Suppress('"') ).setResultsName("quotes") | operatorWord operatorParenthesis = Group( (Suppress("(") + operatorOr + Suppress(")")) ).setResultsName("parenthesis") | operatorQuotes operatorNot = Forward() operatorNot << (Group( Suppress(Keyword("not", caseless=True)) + operatorNot ).setResultsName("not") | operatorParenthesis) operatorAnd = Forward() operatorAnd << (Group( operatorNot + Suppress(Keyword("and", caseless=True)) + operatorAnd ).setResultsName("and") | Group( operatorNot + OneOrMore(~oneOf("and or") + operatorAnd) ).setResultsName("and") | operatorNot) operatorOr << (Group( operatorAnd + Suppress(Keyword("or", caseless=True)) + operatorOr ).setResultsName("or") | operatorAnd) return operatorOr.parseString def evaluateAnd(self, argument): return self.evaluate(argument[0]).intersection(self.evaluate(argument[1])) def evaluateOr(self, argument): return self.evaluate(argument[0]).union(self.evaluate(argument[1])) def evaluateNot(self, argument): return self.GetNot(self.evaluate(argument[0])) def evaluateParenthesis(self, argument): return self.evaluate(argument[0]) def evaluateQuotes(self, argument): """Evaluate quoted strings First is does an 'and' on the indidual search terms, then it asks the function GetQuoted to only return the subset of ID's that contain the literal string. """ r = Set() search_terms = [] for item in argument: search_terms.append(item[0]) if len(r) == 0: r = self.evaluate(item) else: r = r.intersection(self.evaluate(item)) return self.GetQuotes(' '.join(search_terms), r) def evaluateWord(self, argument): return self.GetWord(argument[0]) def evaluateWordWildcard(self, argument): return self.GetWordWildcard(argument[0]) def evaluate(self, argument): return self._methods[argument.getName()](argument) def Parse(self, query): #print self._parser(query)[0] return self.evaluate(self._parser(query)[0]) def GetWord(self, word): return Set() def GetWordWildcard(self, word): return Set() def GetQuotes(self, search_string, tmp_result): return Set() def GetNot(self, not_set): return Set().difference(not_set) class ParserTest(SearchQueryParser): """Tests the parser with some search queries tests containts a dictionary with tests and expected results. """ tests = { 'help': Set([1, 2, 4, 5]), 'help or hulp': Set([1, 2, 3, 4, 5]), 'help and hulp': Set([2]), 'help hulp': Set([2]), 'help and hulp or hilp': Set([2, 3, 4]), 'help or hulp and hilp': Set([1, 2, 3, 4, 5]), 'help or hulp or hilp or halp': Set([1, 2, 3, 4, 5, 6]), '(help or hulp) and (hilp or halp)': Set([3, 4, 5]), 'help and (hilp or halp)': Set([4, 5]), '(help and (hilp or halp)) or hulp': Set([2, 3, 4, 5]), 'not help': Set([3, 6, 7, 8]), 'not hulp and halp': Set([5, 6]), 'not (help and halp)': Set([1, 2, 3, 4, 6, 7, 8]), '"help me please"': Set([2]), '"help me please" or hulp': Set([2, 3]), '"help me please" or (hulp and halp)': Set([2]), 'help*': Set([1, 2, 4, 5, 8]), 'help or hulp*': Set([1, 2, 3, 4, 5]), 'help* and hulp': Set([2]), 'help and hulp* or hilp': Set([2, 3, 4]), 'help* or hulp or hilp or halp': Set([1, 2, 3, 4, 5, 6, 8]), '(help or hulp*) and (hilp* or halp)': Set([3, 4, 5]), 'help* and (hilp* or halp*)': Set([4, 5]), '(help and (hilp* or halp)) or hulp*': Set([2, 3, 4, 5]), 'not help* and halp': Set([6]), 'not (help* and helpe*)': Set([1, 2, 3, 4, 5, 6, 7]), '"help* me please"': Set([2]), '"help* me* please" or hulp*': Set([2, 3]), '"help me please*" or (hulp and halp)': Set([2]), '"help me please" not (hulp and halp)': Set([2]), '"help me please" hulp': Set([2]), 'help and hilp and not holp': Set([4]), 'help hilp not holp': Set([4]), 'help hilp and not holp': Set([4]), } docs = { 1: 'help', 2: 'help me please hulp', 3: 'hulp hilp', 4: 'help hilp', 5: 'halp thinks he needs help', 6: 'he needs halp', 7: 'nothing', 8: 'helper', } index = { 'help': Set((1, 2, 4, 5)), 'me': Set((2,)), 'please': Set((2,)), 'hulp': Set((2, 3,)), 'hilp': Set((3, 4,)), 'halp': Set((5, 6,)), 'thinks': Set((5,)), 'he': Set((5, 6,)), 'needs': Set((5, 6,)), 'nothing': Set((7,)), 'helper': Set((8,)), } def GetWord(self, word): if (word in self.index): return self.index[word] else: return Set() def GetWordWildcard(self, word): result = Set() for item in list(self.index.keys()): if word == item[0:len(word)]: result = result.union(self.index[item]) return result def GetQuotes(self, search_string, tmp_result): result = Set() for item in tmp_result: if self.docs[item].count(search_string): result.add(item) return result def GetNot(self, not_set): all = Set(list(self.docs.keys())) return all.difference(not_set) def Test(self): all_ok = True for item in list(self.tests.keys()): print(item) r = self.Parse(item) e = self.tests[item] print('Result: %s' % r) print('Expect: %s' % e) if e == r: print('Test OK') else: all_ok = False print('>>>>>>>>>>>>>>>>>>>>>>Test ERROR<<<<<<<<<<<<<<<<<<<<<') print('') return all_ok if __name__=='__main__': if ParserTest().Test(): print('All tests OK') else: print('One or more tests FAILED') pyparsing-2.0.3/examples/idlParse.py0000664000175000017500000001762212171425202016511 0ustar barrybarry# # idlparse.py # # an example of using the parsing module to be able to process a subset of the CORBA IDL grammar # # Copyright (c) 2003, Paul McGuire # from pyparsing import Literal, CaselessLiteral, Word, Upcase, OneOrMore, ZeroOrMore, \ Forward, NotAny, delimitedList, oneOf, Group, Optional, Combine, alphas, nums, restOfLine, cStyleComment, \ alphanums, printables, empty, quotedString, ParseException, ParseResults, Keyword, Regex import pprint #~ import tree2image bnf = None def CORBA_IDL_BNF(): global bnf if not bnf: # punctuation colon = Literal(":") lbrace = Literal("{") rbrace = Literal("}") lbrack = Literal("[") rbrack = Literal("]") lparen = Literal("(") rparen = Literal(")") equals = Literal("=") comma = Literal(",") dot = Literal(".") slash = Literal("/") bslash = Literal("\\") star = Literal("*") semi = Literal(";") langle = Literal("<") rangle = Literal(">") # keywords any_ = Keyword("any") attribute_ = Keyword("attribute") boolean_ = Keyword("boolean") case_ = Keyword("case") char_ = Keyword("char") const_ = Keyword("const") context_ = Keyword("context") default_ = Keyword("default") double_ = Keyword("double") enum_ = Keyword("enum") exception_ = Keyword("exception") false_ = Keyword("FALSE") fixed_ = Keyword("fixed") float_ = Keyword("float") inout_ = Keyword("inout") interface_ = Keyword("interface") in_ = Keyword("in") long_ = Keyword("long") module_ = Keyword("module") object_ = Keyword("Object") octet_ = Keyword("octet") oneway_ = Keyword("oneway") out_ = Keyword("out") raises_ = Keyword("raises") readonly_ = Keyword("readonly") sequence_ = Keyword("sequence") short_ = Keyword("short") string_ = Keyword("string") struct_ = Keyword("struct") switch_ = Keyword("switch") true_ = Keyword("TRUE") typedef_ = Keyword("typedef") unsigned_ = Keyword("unsigned") union_ = Keyword("union") void_ = Keyword("void") wchar_ = Keyword("wchar") wstring_ = Keyword("wstring") identifier = Word( alphas, alphanums + "_" ).setName("identifier") #~ real = Combine( Word(nums+"+-", nums) + dot + Optional( Word(nums) ) #~ + Optional( CaselessLiteral("E") + Word(nums+"+-",nums) ) ) real = Regex(r"[+-]?\d+\.\d*([Ee][+-]?\d+)?").setName("real") #~ integer = ( Combine( CaselessLiteral("0x") + Word( nums+"abcdefABCDEF" ) ) | #~ Word( nums+"+-", nums ) ).setName("int") integer = Regex(r"0x[0-9a-fA-F]+|[+-]?\d+").setName("int") udTypeName = delimitedList( identifier, "::", combine=True ).setName("udType") # have to use longest match for type, in case a user-defined type name starts with a keyword type, like "stringSeq" or "longArray" typeName = ( any_ ^ boolean_ ^ char_ ^ double_ ^ fixed_ ^ float_ ^ long_ ^ octet_ ^ short_ ^ string_ ^ wchar_ ^ wstring_ ^ udTypeName ).setName("type") sequenceDef = Forward().setName("seq") sequenceDef << Group( sequence_ + langle + ( sequenceDef | typeName ) + rangle ) typeDef = sequenceDef | ( typeName + Optional( lbrack + integer + rbrack ) ) typedefDef = Group( typedef_ + typeDef + identifier + semi ).setName("typedef") moduleDef = Forward() constDef = Group( const_ + typeDef + identifier + equals + ( real | integer | quotedString ) + semi ) #| quotedString ) exceptionItem = Group( typeDef + identifier + semi ) exceptionDef = ( exception_ + identifier + lbrace + ZeroOrMore( exceptionItem ) + rbrace + semi ) attributeDef = Optional( readonly_ ) + attribute_ + typeDef + identifier + semi paramlist = delimitedList( Group( ( inout_ | in_ | out_ ) + typeName + identifier ) ).setName( "paramlist" ) operationDef = ( ( void_ ^ typeDef ) + identifier + lparen + Optional( paramlist ) + rparen + \ Optional( raises_ + lparen + Group( delimitedList( typeName ) ) + rparen ) + semi ) interfaceItem = ( constDef | exceptionDef | attributeDef | operationDef ) interfaceDef = Group( interface_ + identifier + Optional( colon + delimitedList( typeName ) ) + lbrace + \ ZeroOrMore( interfaceItem ) + rbrace + semi ).setName("opnDef") moduleItem = ( interfaceDef | exceptionDef | constDef | typedefDef | moduleDef ) moduleDef << module_ + identifier + lbrace + ZeroOrMore( moduleItem ) + rbrace + semi bnf = ( moduleDef | OneOrMore( moduleItem ) ) singleLineComment = "//" + restOfLine bnf.ignore( singleLineComment ) bnf.ignore( cStyleComment ) return bnf testnum = 1 def test( strng ): global testnum print(strng) try: bnf = CORBA_IDL_BNF() tokens = bnf.parseString( strng ) print("tokens = ") pprint.pprint( tokens.asList() ) imgname = "idlParse%02d.bmp" % testnum testnum += 1 #~ tree2image.str2image( str(tokens.asList()), imgname ) except ParseException as err: print(err.line) print(" "*(err.column-1) + "^") print(err) print() if __name__ == "__main__": test( """ /* * a block comment * */ typedef string[10] tenStrings; typedef sequence stringSeq; typedef sequence< sequence > stringSeqSeq; interface QoSAdmin { stringSeq method1( in string arg1, inout long arg2 ); stringSeqSeq method2( in string arg1, inout long arg2, inout long arg3); string method3(); }; """ ) test( """ /* * a block comment * */ typedef string[10] tenStrings; typedef /** ** *** **** * * a block comment * */ sequence /*comment inside an And */ stringSeq; /* */ /**/ /***/ /****/ typedef sequence< sequence > stringSeqSeq; interface QoSAdmin { stringSeq method1( in string arg1, inout long arg2 ); stringSeqSeq method2( in string arg1, inout long arg2, inout long arg3); string method3(); }; """ ) test( r""" const string test="Test String\n"; const long a = 0; const long b = -100; const float c = 3.14159; const long d = 0x007f7f7f; exception TestException { string msg; sequence dataStrings; }; interface TestInterface { void method1( in string arg1, inout long arg2 ); }; """ ) test( """ module Test1 { exception TestException { string msg; ]; interface TestInterface { void method1( in string arg1, inout long arg2 ) raises ( TestException ); }; }; """ ) test( """ module Test1 { exception TestException { string msg; }; }; """ ) pyparsing-2.0.3/examples/linenoExample.py0000664000175000017500000000277312171425201017546 0ustar barrybarry# # linenoExample.py # # an example of using the location value returned by pyparsing to # extract the line and column number of the location of the matched text, # or to extract the entire line of text. # # Copyright (c) 2006, Paul McGuire # from pyparsing import * data = """Now is the time for all good men to come to the aid of their country.""" # demonstrate use of lineno, line, and col in a parse action def reportLongWords(st,locn,toks): word = toks[0] if len(word) > 3: print("Found '%s' on line %d at column %d" % (word, lineno(locn,st), col(locn,st))) print("The full line of text was:") print("'%s'" % line(locn,st)) print((" "*col(locn,st))+" ^") print() wd = Word(alphas).setParseAction( reportLongWords ) OneOrMore(wd).parseString(data) # demonstrate returning an object from a parse action, containing more information # than just the matching token text class Token(object): def __init__(self, st, locn, tokString): self.tokenString = tokString self.locn = locn self.sourceLine = line(locn,st) self.lineNo = lineno(locn,st) self.col = col(locn,st) def __str__(self): return "%(tokenString)s (line: %(lineNo)d, col: %(col)d)" % self.__dict__ def createTokenObject(st,locn,toks): return Token(st,locn, toks[0]) wd = Word(alphas).setParseAction( createTokenObject ) for tokenObj in OneOrMore(wd).parseString(data): print(tokenObj) pyparsing-2.0.3/examples/nested.py0000664000175000017500000000114112171425201016214 0ustar barrybarry# # nested.py # Copyright, 2007 - Paul McGuire # # Simple example of using nestedExpr to define expressions using # paired delimiters for grouping lists and sublists # from pyparsing import * import pprint data = """ { { item1 "item with } in it" } { {item2a item2b } {item3} } } """ # use {}'s for nested lists nestedItems = nestedExpr("{", "}") print(( (nestedItems+stringEnd).parseString(data).asList() )) # use default delimiters of ()'s mathExpr = nestedExpr() print(( mathExpr.parseString( "((( ax + by)*C) *(Z | (E^F) & D))") )) pyparsing-2.0.3/examples/getNTPserversNew.py0000664000175000017500000000243712171425201020170 0ustar barrybarry# getNTPserversNew.py # # Demonstration of the parsing module, implementing a HTML page scanner, # to extract a list of NTP time servers from the NIST web site. # # Copyright 2004-2010, by Paul McGuire # September, 2010 - updated to more current use of setResultsName, new NIST URL # from pyparsing import (Word, Combine, Suppress, SkipTo, nums, makeHTMLTags, delimitedList, alphas, alphanums) import urllib.request, urllib.parse, urllib.error integer = Word(nums) ipAddress = Combine( integer + "." + integer + "." + integer + "." + integer ) hostname = delimitedList(Word(alphas,alphanums+"-_"),".",combine=True) tdStart,tdEnd = makeHTMLTags("td") timeServerPattern = (tdStart + hostname("hostname") + tdEnd + tdStart + ipAddress("ipAddr") + tdEnd + tdStart + SkipTo(tdEnd)("loc") + tdEnd) # get list of time servers nistTimeServerURL = "http://tf.nist.gov/tf-cgi/servers.cgi#" serverListPage = urllib.request.urlopen( nistTimeServerURL ) serverListHTML = serverListPage.read() serverListPage.close() addrs = {} for srvr,startloc,endloc in timeServerPattern.scanString( serverListHTML ): print("%s (%s) - %s" % (srvr.ipAddr, srvr.hostname.strip(), srvr.loc.strip())) addrs[srvr.ipAddr] = srvr.loc pyparsing-2.0.3/examples/__init__.py0000664000175000017500000000000012217252471016472 0ustar barrybarrypyparsing-2.0.3/examples/partial_gene_match.py0000664000175000017500000000635612171425201020555 0ustar barrybarry# parital_gene_match.py # # Example showing how to create a customized pyparsing Token, in this case, # one that is very much like Literal, but which tolerates up to 'n' character # mismatches from pyparsing import * import urllib.request, urllib.parse, urllib.error # read in a bunch of genomic data datafile = urllib.request.urlopen("http://toxodb.org/common/downloads/release-6.0/Tgondii/TgondiiApicoplastORFsNAs_ToxoDB-6.0.fasta") fastasrc = datafile.read() datafile.close() """ Sample header: >NC_001799-6-2978-2778 | organism=Toxoplasma_gondii_RH | location=NC_001799:2778-2978(-) | length=201 """ integer = Word(nums).setParseAction(lambda t:int(t[0])) genebit = Group(">" + Word(alphanums.upper()+"-_") + "|" + Word(printables)("id") + SkipTo("length=", include=True) + integer("genelen") + LineEnd() + Combine(OneOrMore(Word("ACGTN")),adjacent=False)("gene")) # read gene data from .fasta file - takes just a few seconds genedata = OneOrMore(genebit).parseString(fastasrc) class CloseMatch(Token): """A special subclass of Token that does *close* matches. For each close match of the given string, a tuple is returned giving the found close match, and a list of mismatch positions.""" def __init__(self, seq, maxMismatches=1): super(CloseMatch,self).__init__() self.name = seq self.sequence = seq self.maxMismatches = maxMismatches self.errmsg = "Expected " + self.sequence self.mayIndexError = False self.mayReturnEmpty = False def parseImpl( self, instring, loc, doActions=True ): start = loc instrlen = len(instring) maxloc = start + len(self.sequence) if maxloc <= instrlen: seq = self.sequence seqloc = 0 mismatches = [] throwException = False done = False while loc < maxloc and not done: if instring[loc] != seq[seqloc]: mismatches.append(seqloc) if len(mismatches) > self.maxMismatches: throwException = True done = True loc += 1 seqloc += 1 else: throwException = True if throwException: exc = self.myException exc.loc = loc exc.pstr = instring raise exc return loc, (instring[start:loc],mismatches) # using the genedata extracted above, look for close matches of a gene sequence searchseq = CloseMatch("TTAAATCTAGAAGAT", 3) for g in genedata: print("%s (%d)" % (g.id, g.genelen)) print("-"*24) for t,startLoc,endLoc in searchseq.scanString(g.gene, overlap=True): matched, mismatches = t[0] print("MATCH:", searchseq.sequence) print("FOUND:", matched) if mismatches: print(" ", ''.join(' ' if i not in mismatches else '*' for i,c in enumerate(searchseq.sequence))) else: print("") print("at location", startLoc) print() print() pyparsing-2.0.3/examples/greetingInGreek.py0000664000175000017500000000066212171425201020012 0ustar barrybarry# vim:fileencoding=utf-8 # # greetingInGreek.py # # Demonstration of the parsing module, on the prototypical "Hello, World!" example # from pyparsing import Word # define grammar alphas = ''.join(chr(x) for x in range(0x386, 0x3ce)) greet = Word(alphas) + ',' + Word(alphas) + '!' # input string hello = "Καλημέρα, κόσμε!".decode('utf-8') # parse input string print(greet.parseString( hello )) pyparsing-2.0.3/examples/position.py0000664000175000017500000000425112053623312016605 0ustar barrybarryfrom pyparsing import * text = """Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum""" # find all words beginning with a vowel vowels = "aeiouAEIOU" initialVowelWord = Word(vowels,alphas) # Unfortunately, searchString will advance character by character through # the input text, so it will detect that the initial "Lorem" is not an # initialVowelWord, but then it will test "orem" and think that it is. So # we need to add a do-nothing term that will match the words that start with # consonants, but we will just throw them away when we match them. The key is # that, in having been matched, the parser will skip over them entirely when # looking for initialVowelWords. consonants = ''.join(c for c in alphas if c not in vowels) initialConsWord = Word(consonants, alphas).suppress() # using scanString to locate where tokens are matched for t,start,end in (initialConsWord|initialVowelWord).scanString(text): if t: print(start,':', t[0]) # add parse action to annotate the parsed tokens with their location in the # input string def addLocnToTokens(s,l,t): t['locn'] = l t['word'] = t[0] initialVowelWord.setParseAction(addLocnToTokens) for ivowelInfo in (initialConsWord | initialVowelWord).searchString(text): if not ivowelInfo: continue print(ivowelInfo.locn, ':', ivowelInfo.word) # alternative - add an Empty that will save the current location def location(name): return Empty().setParseAction(lambda s,l,t: t.__setitem__(name,l)) locateInitialVowels = location("locn") + initialVowelWord("word") # search through the input text for ivowelInfo in (initialConsWord | locateInitialVowels).searchString(text): if not ivowelInfo: continue print(ivowelInfo.locn, ':', ivowelInfo.word) pyparsing-2.0.3/examples/pythonGrammarParser.py0000664000175000017500000002004612171425202020745 0ustar barrybarry# pythonGrammarParser.py # # Copyright, 2006, by Paul McGuire # from pyparsing import * # should probably read this from the Grammar file provided with the Python source, but # this just skips that step and inlines the bnf text directly - this grammar was taken from # Python 2.4.1 # grammar = """ # Grammar for Python # Note: Changing the grammar specified in this file will most likely # require corresponding changes in the parser module # (../Modules/parsermodule.c). If you can't make the changes to # that module yourself, please co-ordinate the required changes # with someone who can; ask around on python-dev for help. Fred # Drake will probably be listening there. # Commands for Kees Blom's railroad program #diagram:token NAME #diagram:token NUMBER #diagram:token STRING #diagram:token NEWLINE #diagram:token ENDMARKER #diagram:token INDENT #diagram:output\input python.bla #diagram:token DEDENT #diagram:output\textwidth 20.04cm\oddsidemargin 0.0cm\evensidemargin 0.0cm #diagram:rules # Start symbols for the grammar: # single_input is a single interactive statement; # file_input is a module or sequence of commands read from an input file; # eval_input is the input for the eval() and input() functions. # NB: compound_stmt in single_input is followed by extra NEWLINE! single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE file_input: (NEWLINE | stmt)* ENDMARKER eval_input: testlist NEWLINE* ENDMARKER decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE decorators: decorator+ funcdef: [decorators] 'def' NAME parameters ':' suite parameters: '(' [varargslist] ')' varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [','] fpdef: NAME | '(' fplist ')' fplist: fpdef (',' fpdef)* [','] stmt: simple_stmt | compound_stmt simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt | import_stmt | global_stmt | exec_stmt | assert_stmt expr_stmt: testlist (augassign testlist | ('=' testlist)*) augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=' | '**=' | '//=' # For normal assignments, additional restrictions enforced by the interpreter print_stmt: 'print' ( [ test (',' test)* [','] ] | '>>' test [ (',' test)+ [','] ] ) del_stmt: 'del' exprlist pass_stmt: 'pass' flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt break_stmt: 'break' continue_stmt: 'continue' return_stmt: 'return' [testlist] yield_stmt: 'yield' testlist raise_stmt: 'raise' [test [',' test [',' test]]] import_stmt: import_name | import_from import_name: 'import' dotted_as_names import_from: 'from' dotted_name 'import' ('*' | '(' import_as_names ')' | import_as_names) import_as_name: NAME [NAME NAME] dotted_as_name: dotted_name [NAME NAME] import_as_names: import_as_name (',' import_as_name)* [','] dotted_as_names: dotted_as_name (',' dotted_as_name)* dotted_name: NAME ('.' NAME)* global_stmt: 'global' NAME (',' NAME)* exec_stmt: 'exec' expr ['in' test [',' test]] assert_stmt: 'assert' test [',' test] #35 compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] while_stmt: 'while' test ':' suite ['else' ':' suite] for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] try_stmt: ('try' ':' suite (except_clause ':' suite)+ #diagram:break ['else' ':' suite] | 'try' ':' suite 'finally' ':' suite) # NB compile.c makes sure that the default except clause is last except_clause: 'except' [test [',' test]] suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT test: and_test ('or' and_test)* | lambdef and_test: not_test ('and' not_test)* not_test: 'not' not_test | comparison comparison: expr (comp_op expr)* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not' expr: xor_expr ('|' xor_expr)* xor_expr: and_expr ('^' and_expr)* and_expr: shift_expr ('&' shift_expr)* shift_expr: arith_expr (('<<'|'>>') arith_expr)* arith_expr: term (('+'|'-') term)* term: factor (('*'|'/'|'%'|'//') factor)* factor: ('+'|'-'|'~') factor | power power: atom trailer* ['**' factor] atom: '(' [testlist_gexp] ')' | '[' [listmaker] ']' | '{' [dictmaker] '}' | '`' testlist1 '`' | NAME | NUMBER | STRING+ listmaker: test ( list_for | (',' test)* [','] ) testlist_gexp: test ( gen_for | (',' test)* [','] ) lambdef: 'lambda' [varargslist] ':' test trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME subscriptlist: subscript (',' subscript)* [','] subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop] sliceop: ':' [test] exprlist: expr (',' expr)* [','] testlist: test (',' test)* [','] testlist_safe: test [(',' test)+ [',']] dictmaker: test ':' test (',' test ':' test)* [','] classdef: 'class' NAME ['(' testlist ')'] ':' suite arglist: (argument ',')* (argument [',']| '*' test [',' '**' test] | '**' test) argument: [test '='] test [gen_for] # Really [keyword '='] test list_iter: list_for | list_if list_for: 'for' exprlist 'in' testlist_safe [list_iter] list_if: 'if' test [list_iter] gen_iter: gen_for | gen_if gen_for: 'for' exprlist 'in' test [gen_iter] gen_if: 'if' test [gen_iter] testlist1: test (',' test)* # not used in grammar, but may appear in "node" passed from Parser to Compiler encoding_decl: NAME """ class SemanticGroup(object): def __init__(self,contents): self.contents = contents while self.contents[-1].__class__ == self.__class__: self.contents = self.contents[:-1] + self.contents[-1].contents def __str__(self): return "%s(%s)" % (self.label, " ".join([isinstance(c,str) and c or str(c) for c in self.contents]) ) class OrList(SemanticGroup): label = "OR" pass class AndList(SemanticGroup): label = "AND" pass class OptionalGroup(SemanticGroup): label = "OPT" pass class Atom(SemanticGroup): def __init__(self,contents): if len(contents) > 1: self.rep = contents[1] else: self.rep = "" if isinstance(contents,str): self.contents = contents else: self.contents = contents[0] def __str__(self): return "%s%s" % (self.rep, self.contents) def makeGroupObject(cls): def groupAction(s,l,t): try: return cls(t[0].asList()) except: return cls(t) return groupAction # bnf punctuation LPAREN = Suppress("(") RPAREN = Suppress(")") LBRACK = Suppress("[") RBRACK = Suppress("]") COLON = Suppress(":") ALT_OP = Suppress("|") # bnf grammar ident = Word(alphanums+"_") bnfToken = Word(alphanums+"_") + ~FollowedBy(":") repSymbol = oneOf("* +") bnfExpr = Forward() optionalTerm = Group(LBRACK + bnfExpr + RBRACK).setParseAction(makeGroupObject(OptionalGroup)) bnfTerm = ( (bnfToken | quotedString | optionalTerm | ( LPAREN + bnfExpr + RPAREN )) + Optional(repSymbol) ).setParseAction(makeGroupObject(Atom)) andList = Group(bnfTerm + OneOrMore(bnfTerm)).setParseAction(makeGroupObject(AndList)) bnfFactor = andList | bnfTerm orList = Group( bnfFactor + OneOrMore( ALT_OP + bnfFactor ) ).setParseAction(makeGroupObject(OrList)) bnfExpr << ( orList | bnfFactor ) bnfLine = ident + COLON + bnfExpr bnfComment = "#" + restOfLine # build return tokens as a dictionary bnf = Dict(OneOrMore(Group(bnfLine))) bnf.ignore(bnfComment) # bnf is defined, parse the grammar text bnfDefs = bnf.parseString(grammar) # correct answer is 78 expected = 78 assert len(bnfDefs) == expected, \ "Error, found %d BNF defns, expected %d" % (len(bnfDefs), expected) # list out defns in order they were parsed (to verify accuracy of parsing) for k,v in bnfDefs: print(k,"=",v) print() # list out parsed grammar defns (demonstrates dictionary access to parsed tokens) for k in list(bnfDefs.keys()): print(k,"=",bnfDefs[k]) pyparsing-2.0.3/examples/readJson.py0000664000175000017500000036137312171425201016517 0ustar barrybarry #~ url = "http://cmsdoc.cern.ch/cms/test/aprom/phedex/dev/gowri/datasvc/tbedi/requestDetails" #~ params = {'format':'json'} #~ import urllib #~ eparams = urllib.urlencode(params) #~ import urllib2 #~ request = urllib2.Request(url,eparams) #~ response = urllib2.urlopen(request) #~ s = response.read() #~ response.close() #~ print s s = """ {"phedex":{"request":[{"last_update":"1188037561", "numofapproved":"1", "id":"7425"}, {"last_update":"1188751826", "numofapproved":"1", "id":"8041"}, {"last_update":"1190116795", "numofapproved":"1", "id":"9281"}, {"last_update":"1190248781", "numofapproved":"1", "id":"9521"}, {"last_update":"1192615612", "numofapproved":"1", "id":"12821"}, {"last_update":"1192729887", "numofapproved":"1", "id":"13121"}, {"last_update":"1193152971", "numofapproved":"1", "id":"13501"}, {"last_update":"1194022054", "numofapproved":"1", "id":"14782"}, {"last_update":"1194429365", "numofapproved":"1", "id":"15081"}, {"last_update":"1195069848", "numofapproved":"1", "id":"16661"}, {"last_update":"1178403225", "numofapproved":"1", "id":"1281"}, {"last_update":"1179239056", "numofapproved":"1", "id":"1387"}, {"last_update":"1179842205", "numofapproved":"1", "id":"1665"}, {"last_update":"1179842040", "numofapproved":"1", "id":"1661"}, {"last_update":"1179935333", "numofapproved":"1", "id":"1741"}, {"last_update":"1183151195", "numofapproved":"1", "id":"3841"}, {"last_update":"1187031531", "numofapproved":"1", "id":"6601"}, {"last_update":"1188820478", "numofapproved":"1", "id":"8121"}, {"last_update":"1190652719", "numofapproved":"1", "id":"9983"}, {"last_update":"1192628950", "numofapproved":"1", "id":"12841"}, {"last_update":"1193075426", "numofapproved":"1", "id":"13341"}, {"last_update":"1194214609", "numofapproved":"1", "id":"14882"}, {"last_update":"1194387864", "numofapproved":"1", "id":"15062"}, {"last_update":"1195134504", "numofapproved":"1", "id":"16741"}, {"last_update":"1182431453", "numofapproved":"1", "id":"3421"}, {"last_update":"1183448188", "numofapproved":"1", "id":"4061"}, {"last_update":"1184588081", "numofapproved":"1", "id":"4908"}, {"last_update":"1184681258", "numofapproved":"1", "id":"4913"}, {"last_update":"1188039048", "numofapproved":"1", "id":"7426"}, {"last_update":"1192699041", "numofapproved":"1", "id":"12982"}, {"last_update":"1193219685", "numofapproved":"1", "id":"13529"}, {"last_update":"1193401408", "numofapproved":"1", "id":"14081"}, {"last_update":"1194454724", "numofapproved":"1", "id":"15201"}, {"last_update":"1194937690", "numofapproved":"1", "id":"16044"}, {"last_update":"1194947125", "numofapproved":"1", "id":"16103"}, {"last_update":"1195134890", "numofapproved":"1", "id":"16761"}, {"last_update":"1195486898", "numofapproved":"1", "id":"17301"}, {"last_update":"1195497774", "numofapproved":"1", "id":"17341"}, {"last_update":"1184744080", "numofapproved":"1", "id":"4941"}, {"last_update":"1186558911", "numofapproved":"1", "id":"6321"}, {"last_update":"1189524520", "numofapproved":"1", "id":"8802"}, {"last_update":"1192683178", "numofapproved":"1", "id":"12921"}, {"last_update":"1193260655", "numofapproved":"1", "id":"13530"}, {"last_update":"1194280038", "numofapproved":"1", "id":"15002"}, {"last_update":"1182077478", "numofapproved":"1", "id":"3162"}, {"last_update":"1183386650", "numofapproved":"1", "id":"3961"}, {"last_update":"1192063369", "numofapproved":"1", "id":"12182"}, {"last_update":"1181931262", "numofapproved":"1", "id":"3101"}, {"last_update":"1178648271", "numofapproved":"1", "id":"1308"}, {"last_update":"1179239923", "numofapproved":"1", "id":"1405"}, {"last_update":"1184370745", "numofapproved":"1", "id":"4861"}, {"last_update":"1185280568", "numofapproved":"1", "id":"5302"}, {"last_update":"1187875115", "numofapproved":"1", "id":"7344"}, {"last_update":"1189140441", "numofapproved":"1", "id":"8541"}, {"last_update":"1189180903", "numofapproved":"1", "id":"8661"}, {"last_update":"1189767643", "numofapproved":"1", "id":"9001"}, {"last_update":"1190726167", "numofapproved":"1", "id":"10101"}, {"last_update":"1190972990", "numofapproved":"1", "id":"10661"}, {"last_update":"1190990720", "numofapproved":"1", "id":"10712"}, {"last_update":"1192004838", "numofapproved":"1", "id":"12021"}, {"last_update":"1192612211", "numofapproved":"1", "id":"12803"}, {"last_update":"1194441407", "numofapproved":"1", "id":"15103"}, {"last_update":"1194792356", "numofapproved":"1", "id":"15681"}, {"last_update":"1194860650", "numofapproved":"1", "id":"15801"}, {"last_update":"1194877395", "numofapproved":"1", "id":"15881"}, {"last_update":"1194950552", "numofapproved":"1", "id":"16124"}, {"last_update":"1194992714", "numofapproved":"1", "id":"16421"}, {"last_update":"1195054500", "numofapproved":"1", "id":"16581"}, {"last_update":"1195228524", "numofapproved":"1", "id":"17001"}, {"last_update":"1195469382", "numofapproved":"1", "id":"17161"}, {"last_update":"1178035947", "numofapproved":"1", "id":"1202"}, {"last_update":"1178869668", "numofapproved":"1", "id":"1356"}, {"last_update":"1183563268", "numofapproved":"1", "id":"4201"}, {"last_update":"1185314677", "numofapproved":"1", "id":"5361"}, {"last_update":"1188467567", "numofapproved":"1", "id":"7781"}, {"last_update":"1190011821", "numofapproved":"1", "id":"9202"}, {"last_update":"1190206214", "numofapproved":"1", "id":"9481"}, {"last_update":"1190973037", "numofapproved":"1", "id":"10663"}, {"last_update":"1190819127", "numofapproved":"1", "id":"10342"}, {"last_update":"1192154959", "numofapproved":"1", "id":"12381"}, {"last_update":"1192634509", "numofapproved":"1", "id":"12862"}, {"last_update":"1194004677", "numofapproved":"1", "id":"14722"}, {"last_update":"1195548191", "numofapproved":"1", "id":"17501"}, {"last_update":"1195548953", "numofapproved":"1", "id":"17502"}, {"last_update":"1195559809", "numofapproved":"1", "id":"17541"}, {"last_update":"1177589103", "numofapproved":"1", "id":"1044"}, {"last_update":"1183416879", "numofapproved":"1", "id":"4041"}, {"last_update":"1186646977", "numofapproved":"1", "id":"6342"}, {"last_update":"1189656586", "numofapproved":"1", "id":"8902"}, {"last_update":"1190150645", "numofapproved":"1", "id":"9421"}, {"last_update":"1190409040", "numofapproved":"1", "id":"9741"}, {"last_update":"1190973011", "numofapproved":"1", "id":"10662"}, {"last_update":"1190993896", "numofapproved":"1", "id":"10761"}, {"last_update":"1193973610", "numofapproved":"1", "id":"14661"}, {"last_update":"1193973848", "numofapproved":"1", "id":"14664"}, {"last_update":"1194539978", "numofapproved":"1", "id":"15381"}, {"last_update":"1194947356", "numofapproved":"1", "id":"16105"}, {"last_update":"1195399589", "numofapproved":"1", "id":"17101"}, {"last_update":"1195464953", "numofapproved":"1", "id":"17141"}, {"last_update":"1171962221", "numofapproved":"1", "id":"109"}, {"last_update":"1173113812", "numofapproved":"1", "id":"247"}, {"last_update":"1173975435", "numofapproved":"1", "id":"343"}, {"last_update":"1174050971", "numofapproved":"1", "id":"353"}, {"last_update":"1174301484", "numofapproved":"1", "id":"393"}, {"last_update":"1172565853", "numofapproved":"1", "id":"208"}, {"last_update":"1172593328", "numofapproved":"1", "id":"215"}, {"last_update":"1175267391", "numofapproved":"1", "id":"565"}, {"last_update":"1171379845", "numofapproved":"1", "id":"25"}, {"last_update":"1171477466", "numofapproved":"1", "id":"53"}, {"last_update":"1171799296", "numofapproved":"1", "id":"77"}, {"last_update":"1172671474", "numofapproved":"1", "id":"223"}, {"last_update":"1174301354", "numofapproved":"1", "id":"388"}, {"last_update":"1174899552", "numofapproved":"1", "id":"511"}, {"last_update":"1174899458", "numofapproved":"1", "id":"505"}, {"last_update":"1175502936", "numofapproved":"1", "id":"604"}, {"last_update":"1175613825", "numofapproved":"1", "id":"665"}, {"last_update":"1175776232", "numofapproved":"1", "id":"673"}, {"last_update":"1171621302", "numofapproved":"1", "id":"68"}, {"last_update":"1171904738", "numofapproved":"1", "id":"98"}, {"last_update":"1171968012", "numofapproved":"1", "id":"115"}, {"last_update":"1172145037", "numofapproved":"1", "id":"168"}, {"last_update":"1172246599", "numofapproved":"1", "id":"185"}, {"last_update":"1173886280", "numofapproved":"1", "id":"318"}, {"last_update":"1174562010", "numofapproved":"1", "id":"423"}, {"last_update":"1176308974", "numofapproved":"1", "id":"884"}, {"last_update":"1176482150", "numofapproved":"1", "id":"943"}, {"last_update":"1176702424", "numofapproved":"1", "id":"1001"}, {"last_update":"1176748776", "numofapproved":"1", "id":"984"}, {"last_update":"1172669745", "numofapproved":"1", "id":"222"}, {"last_update":"1174899538", "numofapproved":"1", "id":"510"}, {"last_update":"1174899143", "numofapproved":"1", "id":"493"}, {"last_update":"1174899043", "numofapproved":"1", "id":"488"}, {"last_update":"1175711780", "numofapproved":"1", "id":"667"}, {"last_update":"1175712851", "numofapproved":"1", "id":"705"}, {"last_update":"1176296548", "numofapproved":"1", "id":"841"}, {"last_update":"1175862269", "numofapproved":"1", "id":"781"}, {"last_update":"1171483107", "numofapproved":"1", "id":"54"}, {"last_update":"1171645737", "numofapproved":"1", "id":"71"}, {"last_update":"1172253423", "numofapproved":"1", "id":"188"}, {"last_update":"1173888726", "numofapproved":"1", "id":"321"}, {"last_update":"1173975649", "numofapproved":"1", "id":"346"}, {"last_update":"1174299379", "numofapproved":"1", "id":"363"}, {"last_update":"1174301359", "numofapproved":"1", "id":"389"}, {"last_update":"1174301073", "numofapproved":"1", "id":"379"}, {"last_update":"1174300650", "numofapproved":"1", "id":"371"}, {"last_update":"1171485069", "numofapproved":"1", "id":"55"}, {"last_update":"1171799178", "numofapproved":"1", "id":"73"}, {"last_update":"1171896809", "numofapproved":"1", "id":"95"}, {"last_update":"1172672959", "numofapproved":"1", "id":"224"}, {"last_update":"1172693619", "numofapproved":"1", "id":"230"}, {"last_update":"1173207656", "numofapproved":"1", "id":"253"}, {"last_update":"1174059533", "numofapproved":"1", "id":"356"}, {"last_update":"1174300538", "numofapproved":"1", "id":"368"}, {"last_update":"1176137457", "numofapproved":"1", "id":"807"}, {"last_update":"1173728124", "numofapproved":"1", "id":"305"}, {"last_update":"1172507633", "numofapproved":"1", "id":"198"}, {"last_update":"1174301173", "numofapproved":"1", "id":"383"}, {"last_update":"1174899102", "numofapproved":"1", "id":"491"}, {"last_update":"1174301362", "numofapproved":"1", "id":"390"}, {"last_update":"1175254095", "numofapproved":"1", "id":"561"}, {"last_update":"1174037250", "numofapproved":"1", "id":"348"}, {"last_update":"1175865081", "numofapproved":"1", "id":"782"}, {"last_update":"1177591942", "numofapproved":"1", "id":"1046"}, {"last_update":"1177989191", "numofapproved":"1", "id":"1201"}, {"last_update":"1178743279", "numofapproved":"1", "id":"1323"}, {"last_update":"1178876587", "numofapproved":"1", "id":"1357"}, {"last_update":"1179239620", "numofapproved":"1", "id":"1401"}, {"last_update":"1180725458", "numofapproved":"1", "id":"2141"}, {"last_update":"1181205209", "numofapproved":"1", "id":"2421"}, {"last_update":"1181575615", "numofapproved":"1", "id":"2761"}, {"last_update":"1182184775", "numofapproved":"1", "id":"3201"}, {"last_update":"1182963728", "numofapproved":"1", "id":"3661"}, {"last_update":"1178727735", "numofapproved":"1", "id":"1349"}, {"last_update":"1182497720", "numofapproved":"1", "id":"3441"}, {"last_update":"1184381847", "numofapproved":"1", "id":"4881"}, {"last_update":"1184568423", "numofapproved":"1", "id":"4904"}, {"last_update":"1185364813", "numofapproved":"1", "id":"5421"}, {"last_update":"1188043594", "numofapproved":"1", "id":"7441"}, {"last_update":"1188675287", "numofapproved":"1", "id":"7981"}, {"last_update":"1188741594", "numofapproved":"1", "id":"8021"}, {"last_update":"1189144234", "numofapproved":"1", "id":"8561"}, {"last_update":"1189170150", "numofapproved":"1", "id":"8641"}, {"last_update":"1189501508", "numofapproved":"1", "id":"8761"}, {"last_update":"1189811918", "numofapproved":"1", "id":"9041"}, {"last_update":"1189812095", "numofapproved":"1", "id":"9042"}, {"last_update":"1177591716", "numofapproved":"1", "id":"1045"}, {"last_update":"1178040595", "numofapproved":"1", "id":"1203"}, {"last_update":"1182437936", "numofapproved":"1", "id":"3423"}, {"last_update":"1190480042", "numofapproved":"1", "id":"9781"}, {"last_update":"1190821494", "numofapproved":"1", "id":"10361"}, {"last_update":"1190959672", "numofapproved":"1", "id":"10602"}, {"last_update":"1190964023", "numofapproved":"1", "id":"10621"}, {"last_update":"1190991147", "numofapproved":"1", "id":"10721"}, {"last_update":"1190992132", "numofapproved":"1", "id":"10741"}, {"last_update":"1190990410", "numofapproved":"1", "id":"10706"}, {"last_update":"1181667132", "numofapproved":"1", "id":"2861"}, {"last_update":"1183746653", "numofapproved":"1", "id":"4321"}, {"last_update":"1191184539", "numofapproved":"1", "id":"10861"}, {"last_update":"1191490599", "numofapproved":"1", "id":"11261"}, {"last_update":"1191834884", "numofapproved":"1", "id":"11801"}, {"last_update":"1191834899", "numofapproved":"1", "id":"11802"}, {"last_update":"1191940759", "numofapproved":"1", "id":"11961"}, {"last_update":"1179971250", "numofapproved":"1", "id":"1643"}, {"last_update":"1181663618", "numofapproved":"1", "id":"2841"}, {"last_update":"1181932994", "numofapproved":"1", "id":"3102"}, {"last_update":"1182420732", "numofapproved":"1", "id":"3382"}, {"last_update":"1192118127", "numofapproved":"1", "id":"12281"}, {"last_update":"1192222036", "numofapproved":"1", "id":"12481"}, {"last_update":"1192155814", "numofapproved":"1", "id":"12364"}, {"last_update":"1192563924", "numofapproved":"1", "id":"12761"}, {"last_update":"1193124530", "numofapproved":"1", "id":"13441"}, {"last_update":"1193345545", "numofapproved":"1", "id":"13921"}, {"last_update":"1193396927", "numofapproved":"1", "id":"14041"}, {"last_update":"1180015411", "numofapproved":"1", "id":"1651"}, {"last_update":"1180107815", "numofapproved":"1", "id":"1658"}, {"last_update":"1186050394", "numofapproved":"1", "id":"6021"}, {"last_update":"1188519417", "numofapproved":"1", "id":"7841"}, {"last_update":"1193222002", "numofapproved":"1", "id":"13541"}, {"last_update":"1193965081", "numofapproved":"1", "id":"14641"}, {"last_update":"1193660582", "numofapproved":"1", "id":"14381"}, {"last_update":"1194088240", "numofapproved":"1", "id":"14821"}, {"last_update":"1194110475", "numofapproved":"1", "id":"14841"}, {"last_update":"1194246367", "numofapproved":"1", "id":"14902"}, {"last_update":"1194464283", "numofapproved":"1", "id":"15221"}, {"last_update":"1194622250", "numofapproved":"1", "id":"15461"}, {"last_update":"1194635632", "numofapproved":"1", "id":"15601"}, {"last_update":"1179147506", "numofapproved":"1", "id":"1382"}, {"last_update":"1179240025", "numofapproved":"1", "id":"1388"}, {"last_update":"1179748089", "numofapproved":"1", "id":"1561"}, {"last_update":"1179868997", "numofapproved":"1", "id":"1681"}, {"last_update":"1183019667", "numofapproved":"1", "id":"3702"}, {"last_update":"1184531598", "numofapproved":"1", "id":"4902"}, {"last_update":"1187294472", "numofapproved":"1", "id":"6841"}, {"last_update":"1189521494", "numofapproved":"1", "id":"8801"}, {"last_update":"1192726867", "numofapproved":"1", "id":"13081"}, {"last_update":"1193049178", "numofapproved":"1", "id":"13301"}, {"last_update":"1193387050", "numofapproved":"1", "id":"13947"}, {"last_update":"1194277280", "numofapproved":"1", "id":"14981"}, {"last_update":"1179150720", "numofapproved":"1", "id":"1383"}, {"last_update":"1179842104", "numofapproved":"1", "id":"1663"}, {"last_update":"1183766887", "numofapproved":"1", "id":"4341"}, {"last_update":"1185542132", "numofapproved":"1", "id":"5682"}, {"last_update":"1186737114", "numofapproved":"1", "id":"6382"}, {"last_update":"1187015679", "numofapproved":"1", "id":"6521"}, {"last_update":"1190326980", "numofapproved":"1", "id":"9641"}, {"last_update":"1191595711", "numofapproved":"1", "id":"11622"}, {"last_update":"1192106288", "numofapproved":"1", "id":"12221"}, {"last_update":"1192454432", "numofapproved":"1", "id":"12622"}, {"last_update":"1194339640", "numofapproved":"1", "id":"15021"}, {"last_update":"1177758209", "numofapproved":"1", "id":"1181"}, {"last_update":"1179842392", "numofapproved":"1", "id":"1669"}, {"last_update":"1179872870", "numofapproved":"1", "id":"1682"}, {"last_update":"1181233887", "numofapproved":"1", "id":"2541"}, {"last_update":"1182349297", "numofapproved":"1", "id":"3342"}, {"last_update":"1182375421", "numofapproved":"1", "id":"3350"}, {"last_update":"1183485259", "numofapproved":"1", "id":"4081"}, {"last_update":"1184319308", "numofapproved":"1", "id":"4821"}, {"last_update":"1187626648", "numofapproved":"1", "id":"6981"}, {"last_update":"1193153090", "numofapproved":"1", "id":"13502"}, {"last_update":"1194366368", "numofapproved":"1", "id":"15041"}, {"last_update":"1194617018", "numofapproved":"1", "id":"15421"}, {"last_update":"1195230640", "numofapproved":"1", "id":"17021"}, {"last_update":"1179908379", "numofapproved":"1", "id":"1701"}, {"last_update":"1188049228", "numofapproved":"1", "id":"7427"}, {"last_update":"1177581166", "numofapproved":"1", "id":"1061"}, {"last_update":"1187160654", "numofapproved":"1", "id":"6661"}, {"last_update":"1192983992", "numofapproved":"1", "id":"13222"}, {"last_update":"1193388978", "numofapproved":"1", "id":"13954"}, {"last_update":"1194617112", "numofapproved":"1", "id":"15422"}, {"last_update":"1195398876", "numofapproved":"1", "id":"17081"}, {"last_update":"1184262511", "numofapproved":"1", "id":"4801"}, {"last_update":"1192112284", "numofapproved":"1", "id":"12241"}, {"last_update":"1193082767", "numofapproved":"1", "id":"13401"}, {"last_update":"1193179243", "numofapproved":"1", "id":"13526"}, {"last_update":"1178142915", "numofapproved":"1", "id":"1206"}, {"last_update":"1178648333", "numofapproved":"1", "id":"1310"}, {"last_update":"1179279626", "numofapproved":"1", "id":"1391"}, {"last_update":"1182882268", "numofapproved":"1", "id":"3584"}, {"last_update":"1183128448", "numofapproved":"1", "id":"3823"}, {"last_update":"1183377394", "numofapproved":"1", "id":"3941"}, {"last_update":"1188582729", "numofapproved":"1", "id":"7902"}, {"last_update":"1189695063", "numofapproved":"1", "id":"8962"}, {"last_update":"1192001165", "numofapproved":"1", "id":"12001"}, {"last_update":"1192155647", "numofapproved":"1", "id":"12363"}, {"last_update":"1193418304", "numofapproved":"1", "id":"14202"}, {"last_update":"1193632105", "numofapproved":"1", "id":"14341"}, {"last_update":"1194011106", "numofapproved":"1", "id":"14741"}, {"last_update":"1194818628", "numofapproved":"1", "id":"15701"}, {"last_update":"1194875153", "numofapproved":"1", "id":"15861"}, {"last_update":"1194727029", "numofapproved":"1", "id":"15665"}, {"last_update":"1194950210", "numofapproved":"1", "id":"16122"}, {"last_update":"1194976681", "numofapproved":"1", "id":"16241"}, {"last_update":"1194979189", "numofapproved":"1", "id":"16281"}, {"last_update":"1194962224", "numofapproved":"1", "id":"16201"}, {"last_update":"1195046085", "numofapproved":"1", "id":"16481"}, {"last_update":"1195399919", "numofapproved":"1", "id":"17102"}, {"last_update":"1183113736", "numofapproved":"1", "id":"3782"}, {"last_update":"1183114202", "numofapproved":"1", "id":"3783"}, {"last_update":"1189017904", "numofapproved":"1", "id":"8441"}, {"last_update":"1189694944", "numofapproved":"1", "id":"8961"}, {"last_update":"1190766842", "numofapproved":"1", "id":"10181"}, {"last_update":"1190973066", "numofapproved":"1", "id":"10665"}, {"last_update":"1190990264", "numofapproved":"1", "id":"10702"}, {"last_update":"1193043204", "numofapproved":"1", "id":"13281"}, {"last_update":"1194627082", "numofapproved":"1", "id":"15561"}, {"last_update":"1194894589", "numofapproved":"1", "id":"15941"}, {"last_update":"1195485915", "numofapproved":"1", "id":"17281"}, {"last_update":"1195485806", "numofapproved":"1", "id":"17261"}, {"last_update":"1195498836", "numofapproved":"1", "id":"17361"}, {"last_update":"1195514951", "numofapproved":"1", "id":"17421"}, {"last_update":"1183722351", "numofapproved":"1", "id":"4261"}, {"last_update":"1184218083", "numofapproved":"1", "id":"4682"}, {"last_update":"1186848968", "numofapproved":"1", "id":"6441"}, {"last_update":"1187023846", "numofapproved":"1", "id":"6561"}, {"last_update":"1187870812", "numofapproved":"1", "id":"7342"}, {"last_update":"1188657717", "numofapproved":"1", "id":"7961"}, {"last_update":"1190541897", "numofapproved":"1", "id":"9841"}, {"last_update":"1190629135", "numofapproved":"1", "id":"9922"}, {"last_update":"1191226530", "numofapproved":"1", "id":"10922"}, {"last_update":"1191505214", "numofapproved":"1", "id":"11321"}, {"last_update":"1192304524", "numofapproved":"1", "id":"12541"}, {"last_update":"1193948730", "numofapproved":"1", "id":"14601"}, {"last_update":"1194073812", "numofapproved":"1", "id":"14801"}, {"last_update":"1194387224", "numofapproved":"1", "id":"14892"}, {"last_update":"1194464384", "numofapproved":"1", "id":"15223"}, {"last_update":"1194726799", "numofapproved":"1", "id":"15663"}, {"last_update":"1171969969", "numofapproved":"1", "id":"119"}, {"last_update":"1174444717", "numofapproved":"1", "id":"405"}, {"last_update":"1174899431", "numofapproved":"1", "id":"504"}, {"last_update":"1174899204", "numofapproved":"1", "id":"496"}, {"last_update":"1174925591", "numofapproved":"1", "id":"530"}, {"last_update":"1176902523", "numofapproved":"1", "id":"1008"}, {"last_update":"1172765523", "numofapproved":"1", "id":"232"}, {"last_update":"1173315950", "numofapproved":"1", "id":"260"}, {"last_update":"1174899524", "numofapproved":"1", "id":"509"}, {"last_update":"1174300691", "numofapproved":"1", "id":"373"}, {"last_update":"1175502917", "numofapproved":"1", "id":"625"}, {"last_update":"1175601578", "numofapproved":"1", "id":"662"}, {"last_update":"1175608600", "numofapproved":"1", "id":"684"}, {"last_update":"1176755309", "numofapproved":"1", "id":"985"}, {"last_update":"1171386411", "numofapproved":"1", "id":"45"}, {"last_update":"1171800366", "numofapproved":"1", "id":"81"}, {"last_update":"1172847417", "numofapproved":"1", "id":"241"}, {"last_update":"1174734904", "numofapproved":"1", "id":"462"}, {"last_update":"1174735234", "numofapproved":"1", "id":"469"}, {"last_update":"1174735074", "numofapproved":"1", "id":"465"}, {"last_update":"1175267646", "numofapproved":"1", "id":"566"}, {"last_update":"1176331857", "numofapproved":"1", "id":"888"}, {"last_update":"1176387926", "numofapproved":"1", "id":"890"}, {"last_update":"1176458401", "numofapproved":"1", "id":"904"}, {"last_update":"1173088626", "numofapproved":"1", "id":"244"}, {"last_update":"1173109009", "numofapproved":"1", "id":"246"}, {"last_update":"1173671557", "numofapproved":"1", "id":"284"}, {"last_update":"1174927658", "numofapproved":"1", "id":"532"}, {"last_update":"1175592399", "numofapproved":"1", "id":"661"}, {"last_update":"1176480402", "numofapproved":"1", "id":"941"}, {"last_update":"1176561564", "numofapproved":"1", "id":"945"}, {"last_update":"1172218707", "numofapproved":"1", "id":"180"}, {"last_update":"1172771475", "numofapproved":"1", "id":"233"}, {"last_update":"1173267863", "numofapproved":"1", "id":"257"}, {"last_update":"1176493803", "numofapproved":"1", "id":"963"}, {"last_update":"1171449646", "numofapproved":"1", "id":"49"}, {"last_update":"1171471549", "numofapproved":"1", "id":"51"}, {"last_update":"1171800487", "numofapproved":"1", "id":"88"}, {"last_update":"1171800431", "numofapproved":"1", "id":"85"}, {"last_update":"1175502995", "numofapproved":"1", "id":"627"}, {"last_update":"1175712797", "numofapproved":"1", "id":"704"}, {"last_update":"1171122384", "numofapproved":"1", "id":"3"}, {"last_update":"1171380774", "numofapproved":"1", "id":"26"}, {"last_update":"1171904757", "numofapproved":"1", "id":"99"}, {"last_update":"1174300705", "numofapproved":"1", "id":"374"}, {"last_update":"1174924802", "numofapproved":"1", "id":"526"}, {"last_update":"1175935441", "numofapproved":"1", "id":"801"}, {"last_update":"1175610915", "numofapproved":"1", "id":"686"}, {"last_update":"1171977081", "numofapproved":"1", "id":"125"}, {"last_update":"1173165324", "numofapproved":"1", "id":"249"}, {"last_update":"1173888337", "numofapproved":"1", "id":"319"}, {"last_update":"1173889473", "numofapproved":"1", "id":"331"}, {"last_update":"1172180902", "numofapproved":"1", "id":"175"}, {"last_update":"1174058063", "numofapproved":"1", "id":"354"}, {"last_update":"1174300674", "numofapproved":"1", "id":"372"}, {"last_update":"1171886332", "numofapproved":"1", "id":"93"}, {"last_update":"1176731068", "numofapproved":"1", "id":"1003"}, {"last_update":"1178645848", "numofapproved":"1", "id":"1306"}, {"last_update":"1178706683", "numofapproved":"1", "id":"1321"}, {"last_update":"1179240076", "numofapproved":"1", "id":"1406"}, {"last_update":"1180380411", "numofapproved":"1", "id":"1862"}, {"last_update":"1180683561", "numofapproved":"1", "id":"2041"}, {"last_update":"1181229731", "numofapproved":"1", "id":"2521"}, {"last_update":"1182210982", "numofapproved":"1", "id":"3203"}, {"last_update":"1182421105", "numofapproved":"1", "id":"3401"}, {"last_update":"1182199404", "numofapproved":"1", "id":"3202"}, {"last_update":"1182258596", "numofapproved":"1", "id":"3241"}, {"last_update":"1183556842", "numofapproved":"1", "id":"4161"}, {"last_update":"1184146825", "numofapproved":"1", "id":"4601"}, {"last_update":"1184771229", "numofapproved":"1", "id":"4981"}, {"last_update":"1185355415", "numofapproved":"1", "id":"5401"}, {"last_update":"1185377130", "numofapproved":"1", "id":"5481"}, {"last_update":"1185483994", "numofapproved":"1", "id":"5621"}, {"last_update":"1186496707", "numofapproved":"1", "id":"6261"}, {"last_update":"1187704347", "numofapproved":"1", "id":"7001"}, {"last_update":"1187758331", "numofapproved":"1", "id":"7101"}, {"last_update":"1187765716", "numofapproved":"1", "id":"7161"}, {"last_update":"1188284185", "numofapproved":"1", "id":"7581"}, {"last_update":"1188463286", "numofapproved":"1", "id":"7761"}, {"last_update":"1189012058", "numofapproved":"1", "id":"8421"}, {"last_update":"1189814265", "numofapproved":"1", "id":"9061"}, {"last_update":"1180880867", "numofapproved":"1", "id":"2161"}, {"last_update":"1181218244", "numofapproved":"1", "id":"2463"}, {"last_update":"1183515137", "numofapproved":"1", "id":"4141"}, {"last_update":"1183515248", "numofapproved":"1", "id":"4142"}, {"last_update":"1188311100", "numofapproved":"1", "id":"7641"}, {"last_update":"1190011501", "numofapproved":"1", "id":"9201"}, {"last_update":"1190012299", "numofapproved":"1", "id":"9221"}, {"last_update":"1190149196", "numofapproved":"1", "id":"9382"}, {"last_update":"1190202046", "numofapproved":"1", "id":"9461"}, {"last_update":"1190626607", "numofapproved":"1", "id":"9881"}, {"last_update":"1190632230", "numofapproved":"1", "id":"9941"}, {"last_update":"1190660429", "numofapproved":"1", "id":"10002"}, {"last_update":"1190819102", "numofapproved":"1", "id":"10341"}, {"last_update":"1190824319", "numofapproved":"1", "id":"10382"}, {"last_update":"1190825791", "numofapproved":"1", "id":"10402"}, {"last_update":"1190847397", "numofapproved":"1", "id":"10421"}, {"last_update":"1190876679", "numofapproved":"1", "id":"10441"}, {"last_update":"1190918894", "numofapproved":"1", "id":"10541"}, {"last_update":"1190924961", "numofapproved":"1", "id":"10582"}, {"last_update":"1190991179", "numofapproved":"1", "id":"10723"}, {"last_update":"1190663960", "numofapproved":"1", "id":"10042"}, {"last_update":"1191222270", "numofapproved":"1", "id":"10881"}, {"last_update":"1178869580", "numofapproved":"1", "id":"1355"}, {"last_update":"1180054057", "numofapproved":"1", "id":"1655"}, {"last_update":"1180428815", "numofapproved":"1", "id":"1881"}, {"last_update":"1183369278", "numofapproved":"1", "id":"3901"}, {"last_update":"1185018445", "numofapproved":"1", "id":"5163"}, {"last_update":"1185201628", "numofapproved":"1", "id":"5221"}, {"last_update":"1189345395", "numofapproved":"1", "id":"8741"}, {"last_update":"1191406141", "numofapproved":"1", "id":"11041"}, {"last_update":"1191410914", "numofapproved":"1", "id":"11067"}, {"last_update":"1191558362", "numofapproved":"1", "id":"11461"}, {"last_update":"1191584539", "numofapproved":"1", "id":"11541"}, {"last_update":"1191584660", "numofapproved":"1", "id":"11542"}, {"last_update":"1191599491", "numofapproved":"1", "id":"11661"}, {"last_update":"1191813292", "numofapproved":"1", "id":"11781"}, {"last_update":"1191856553", "numofapproved":"1", "id":"11842"}, {"last_update":"1191861142", "numofapproved":"1", "id":"11862"}, {"last_update":"1177509523", "numofapproved":"1", "id":"1041"}, {"last_update":"1190627650", "numofapproved":"1", "id":"9901"}, {"last_update":"1192034749", "numofapproved":"1", "id":"12141"}, {"last_update":"1192165574", "numofapproved":"1", "id":"12401"}, {"last_update":"1192431750", "numofapproved":"1", "id":"12581"}, {"last_update":"1192536591", "numofapproved":"1", "id":"12721"}, {"last_update":"1193035428", "numofapproved":"1", "id":"13261"}, {"last_update":"1193239266", "numofapproved":"1", "id":"13581"}, {"last_update":"1193314455", "numofapproved":"1", "id":"13841"}, {"last_update":"1193333733", "numofapproved":"1", "id":"13901"}, {"last_update":"1193389116", "numofapproved":"1", "id":"14001"}, {"last_update":"1184970339", "numofapproved":"1", "id":"5121"}, {"last_update":"1190892760", "numofapproved":"1", "id":"10481"}, {"last_update":"1192823398", "numofapproved":"1", "id":"13182"}, {"last_update":"1193911671", "numofapproved":"1", "id":"14541"}, {"last_update":"1193916761", "numofapproved":"1", "id":"14543"}, {"last_update":"1194212665", "numofapproved":"1", "id":"14881"}, {"last_update":"1194248205", "numofapproved":"1", "id":"14921"}, {"last_update":"1194513600", "numofapproved":"1", "id":"15110"}, {"last_update":"1194539704", "numofapproved":"1", "id":"15361"}, {"last_update":"1194569643", "numofapproved":"1", "id":"15112"}, {"last_update":"1194619794", "numofapproved":"1", "id":"15441"}, {"last_update":"1194623621", "numofapproved":"1", "id":"15501"}, {"last_update":"1194624477", "numofapproved":"1", "id":"15521"}, {"last_update":"1194635685", "numofapproved":"1", "id":"15602"}, {"last_update":"1179311539", "numofapproved":"1", "id":"1393"}, {"last_update":"1179672561", "numofapproved":"1", "id":"1521"}, {"last_update":"1180712413", "numofapproved":"1", "id":"2101"}, {"last_update":"1181646264", "numofapproved":"1", "id":"2821"}, {"last_update":"1181807696", "numofapproved":"1", "id":"2921"}, {"last_update":"1181824523", "numofapproved":"1", "id":"2942"}, {"last_update":"1181835089", "numofapproved":"1", "id":"2981"}, {"last_update":"1182000147", "numofapproved":"1", "id":"3141"}, {"last_update":"1182952133", "numofapproved":"1", "id":"3641"}, {"last_update":"1188811518", "numofapproved":"1", "id":"8101"}, {"last_update":"1188975549", "numofapproved":"1", "id":"8321"}, {"last_update":"1190122760", "numofapproved":"1", "id":"9301"}, {"last_update":"1190124712", "numofapproved":"1", "id":"9321"}, {"last_update":"1194526560", "numofapproved":"1", "id":"15281"}, {"last_update":"1195149112", "numofapproved":"1", "id":"16821"}, {"last_update":"1179823256", "numofapproved":"1", "id":"1602"}, {"last_update":"1186332011", "numofapproved":"1", "id":"6165"}, {"last_update":"1187263451", "numofapproved":"1", "id":"6781"}, {"last_update":"1190312346", "numofapproved":"1", "id":"9621"}, {"last_update":"1193178728", "numofapproved":"1", "id":"13525"}, {"last_update":"1193908534", "numofapproved":"1", "id":"14524"}, {"last_update":"1194279992", "numofapproved":"1", "id":"15001"}, {"last_update":"1194947169", "numofapproved":"1", "id":"16104"}, {"last_update":"1195139978", "numofapproved":"1", "id":"16801"}, {"last_update":"1195152323", "numofapproved":"1", "id":"16841"}, {"last_update":"1188086146", "numofapproved":"1", "id":"7428"}, {"last_update":"1192143475", "numofapproved":"1", "id":"12341"}, {"last_update":"1192529949", "numofapproved":"1", "id":"12664"}, {"last_update":"1192721072", "numofapproved":"1", "id":"13041"}, {"last_update":"1193844156", "numofapproved":"1", "id":"14501"}, {"last_update":"1177597683", "numofapproved":"1", "id":"1063"}, {"last_update":"1180975406", "numofapproved":"1", "id":"2184"}, {"last_update":"1184681435", "numofapproved":"1", "id":"4914"}, {"last_update":"1187596457", "numofapproved":"1", "id":"6922"}, {"last_update":"1190661113", "numofapproved":"1", "id":"10003"}, {"last_update":"1192721357", "numofapproved":"1", "id":"13042"}, {"last_update":"1193130120", "numofapproved":"1", "id":"13461"}, {"last_update":"1193388868", "numofapproved":"1", "id":"13953"}, {"last_update":"1194861534", "numofapproved":"1", "id":"15821"}, {"last_update":"1182357592", "numofapproved":"1", "id":"3345"}, {"last_update":"1183722862", "numofapproved":"1", "id":"4262"}, {"last_update":"1186066354", "numofapproved":"1", "id":"6041"}, {"last_update":"1192698982", "numofapproved":"1", "id":"12981"}, {"last_update":"1181237191", "numofapproved":"1", "id":"2561"}, {"last_update":"1184569090", "numofapproved":"1", "id":"4906"}, {"last_update":"1185397555", "numofapproved":"1", "id":"5501"}, {"last_update":"1185541935", "numofapproved":"1", "id":"5681"}, {"last_update":"1193385832", "numofapproved":"1", "id":"13941"}, {"last_update":"1185482424", "numofapproved":"1", "id":"5581"}, {"last_update":"1195508796", "numofapproved":"1", "id":"17401"}, {"last_update":"1178718386", "numofapproved":"1", "id":"1347"}, {"last_update":"1178788813", "numofapproved":"1", "id":"1351"}, {"last_update":"1178877332", "numofapproved":"1", "id":"1358"}, {"last_update":"1183208679", "numofapproved":"1", "id":"3861"}, {"last_update":"1187885439", "numofapproved":"1", "id":"7347"}, {"last_update":"1188985190", "numofapproved":"1", "id":"8341"}, {"last_update":"1189687132", "numofapproved":"1", "id":"8941"}, {"last_update":"1189864330", "numofapproved":"1", "id":"9121"}, {"last_update":"1190990605", "numofapproved":"1", "id":"10709"}, {"last_update":"1192634449", "numofapproved":"1", "id":"12861"}, {"last_update":"1194723756", "numofapproved":"1", "id":"15641"}, {"last_update":"1194792428", "numofapproved":"1", "id":"15682"}, {"last_update":"1194725734", "numofapproved":"1", "id":"15661"}, {"last_update":"1194945618", "numofapproved":"1", "id":"16061"}, {"last_update":"1194946006", "numofapproved":"1", "id":"16081"}, {"last_update":"1194949774", "numofapproved":"1", "id":"16121"}, {"last_update":"1194950925", "numofapproved":"1", "id":"16126"}, {"last_update":"1194979238", "numofapproved":"1", "id":"16282"}, {"last_update":"1195051013", "numofapproved":"1", "id":"16543"}, {"last_update":"1195050956", "numofapproved":"1", "id":"16542"}, {"last_update":"1195047036", "numofapproved":"1", "id":"16501"}, {"last_update":"1195221919", "numofapproved":"1", "id":"16942"}, {"last_update":"1178035892", "numofapproved":"1", "id":"1221"}, {"last_update":"1178570265", "numofapproved":"1", "id":"1302"}, {"last_update":"1178811921", "numofapproved":"1", "id":"1354"}, {"last_update":"1182344326", "numofapproved":"1", "id":"3321"}, {"last_update":"1184999048", "numofapproved":"1", "id":"5141"}, {"last_update":"1188994511", "numofapproved":"1", "id":"8361"}, {"last_update":"1189161726", "numofapproved":"1", "id":"8601"}, {"last_update":"1190500875", "numofapproved":"1", "id":"9803"}, {"last_update":"1190817424", "numofapproved":"1", "id":"10321"}, {"last_update":"1191327796", "numofapproved":"1", "id":"11001"}, {"last_update":"1191410544", "numofapproved":"1", "id":"11062"}, {"last_update":"1192009739", "numofapproved":"1", "id":"12062"}, {"last_update":"1193973669", "numofapproved":"1", "id":"14662"}, {"last_update":"1194035149", "numofapproved":"1", "id":"14783"}, {"last_update":"1194465519", "numofapproved":"1", "id":"15106"}, {"last_update":"1194464336", "numofapproved":"1", "id":"15222"}, {"last_update":"1194861398", "numofapproved":"1", "id":"15802"}, {"last_update":"1194950791", "numofapproved":"1", "id":"16125"}, {"last_update":"1195501394", "numofapproved":"1", "id":"17381"}, {"last_update":"1195546583", "numofapproved":"1", "id":"17461"}, {"last_update":"1177607652", "numofapproved":"1", "id":"1048"}, {"last_update":"1182349136", "numofapproved":"1", "id":"3322"}, {"last_update":"1184217665", "numofapproved":"1", "id":"4681"}, {"last_update":"1185510733", "numofapproved":"1", "id":"5641"}, {"last_update":"1187875988", "numofapproved":"1", "id":"7345"}, {"last_update":"1188384227", "numofapproved":"1", "id":"7701"}, {"last_update":"1188935650", "numofapproved":"1", "id":"8261"}, {"last_update":"1188951982", "numofapproved":"1", "id":"8301"}, {"last_update":"1190391010", "numofapproved":"1", "id":"9701"}, {"last_update":"1191169581", "numofapproved":"1", "id":"10841"}, {"last_update":"1194435269", "numofapproved":"1", "id":"15101"}, {"last_update":"1171800457", "numofapproved":"1", "id":"86"}, {"last_update":"1171968036", "numofapproved":"1", "id":"116"}, {"last_update":"1171984640", "numofapproved":"1", "id":"129"}, {"last_update":"1171987101", "numofapproved":"1", "id":"130"}, {"last_update":"1172588327", "numofapproved":"1", "id":"213"}, {"last_update":"1173736730", "numofapproved":"1", "id":"306"}, {"last_update":"1174735009", "numofapproved":"1", "id":"463"}, {"last_update":"1172314484", "numofapproved":"1", "id":"192"}, {"last_update":"1172580739", "numofapproved":"1", "id":"212"}, {"last_update":"1173889335", "numofapproved":"1", "id":"328"}, {"last_update":"1171799339", "numofapproved":"1", "id":"79"}, {"last_update":"1171882669", "numofapproved":"1", "id":"91"}, {"last_update":"1172561300", "numofapproved":"1", "id":"207"}, {"last_update":"1172565919", "numofapproved":"1", "id":"209"}, {"last_update":"1172600401", "numofapproved":"1", "id":"217"}, {"last_update":"1174040553", "numofapproved":"1", "id":"350"}, {"last_update":"1174300376", "numofapproved":"1", "id":"365"}, {"last_update":"1171800419", "numofapproved":"1", "id":"84"}, {"last_update":"1171800471", "numofapproved":"1", "id":"87"}, {"last_update":"1171904826", "numofapproved":"1", "id":"102"}, {"last_update":"1171962248", "numofapproved":"1", "id":"110"}, {"last_update":"1171968056", "numofapproved":"1", "id":"117"}, {"last_update":"1172180757", "numofapproved":"1", "id":"174"}, {"last_update":"1172249286", "numofapproved":"1", "id":"186"}, {"last_update":"1172331355", "numofapproved":"1", "id":"194"}, {"last_update":"1172838799", "numofapproved":"1", "id":"235"}, {"last_update":"1173839361", "numofapproved":"1", "id":"316"}, {"last_update":"1176141087", "numofapproved":"1", "id":"809"}, {"last_update":"1176293168", "numofapproved":"1", "id":"827"}, {"last_update":"1176314927", "numofapproved":"1", "id":"887"}, {"last_update":"1172147490", "numofapproved":"1", "id":"169"}, {"last_update":"1172673371", "numofapproved":"1", "id":"225"}, {"last_update":"1175021309", "numofapproved":"1", "id":"539"}, {"last_update":"1175719394", "numofapproved":"1", "id":"708"}, {"last_update":"1175797177", "numofapproved":"1", "id":"741"}, {"last_update":"1175797204", "numofapproved":"1", "id":"761"}, {"last_update":"1173888948", "numofapproved":"1", "id":"323"}, {"last_update":"1171050355", "numofapproved":"1", "id":"1"}, {"last_update":"1171904868", "numofapproved":"1", "id":"104"}, {"last_update":"1174301476", "numofapproved":"1", "id":"392"}, {"last_update":"1174396679", "numofapproved":"1", "id":"401"}, {"last_update":"1174735025", "numofapproved":"1", "id":"464"}, {"last_update":"1171894147", "numofapproved":"1", "id":"94"}, {"last_update":"1172226240", "numofapproved":"1", "id":"181"}, {"last_update":"1172442130", "numofapproved":"1", "id":"195"}, {"last_update":"1174300588", "numofapproved":"1", "id":"370"}, {"last_update":"1174899082", "numofapproved":"1", "id":"490"}, {"last_update":"1174899309", "numofapproved":"1", "id":"501"}, {"last_update":"1173724444", "numofapproved":"1", "id":"304"}, {"last_update":"1176314883", "numofapproved":"1", "id":"886"}, {"last_update":"1173284377", "numofapproved":"1", "id":"259"}, {"last_update":"1172244974", "numofapproved":"1", "id":"184"}, {"last_update":"1173825356", "numofapproved":"1", "id":"315"}, {"last_update":"1174898980", "numofapproved":"1", "id":"485"}, {"last_update":"1175713133", "numofapproved":"1", "id":"706"}, {"last_update":"1175872869", "numofapproved":"1", "id":"784"}, {"last_update":"1174301161", "numofapproved":"1", "id":"380"}, {"last_update":"1176710519", "numofapproved":"1", "id":"1002"}, {"last_update":"1176776871", "numofapproved":"1", "id":"1006"}, {"last_update":"1176383102", "numofapproved":"1", "id":"901"}, {"last_update":"1176391153", "numofapproved":"1", "id":"902"}, {"last_update":"1176562039", "numofapproved":"1", "id":"946"}, {"last_update":"1175713172", "numofapproved":"1", "id":"668"}, {"last_update":"1178045208", "numofapproved":"1", "id":"1204"}, {"last_update":"1178648231", "numofapproved":"1", "id":"1307"}, {"last_update":"1178876638", "numofapproved":"1", "id":"1362"}, {"last_update":"1181120419", "numofapproved":"1", "id":"2341"}, {"last_update":"1181217997", "numofapproved":"1", "id":"2462"}, {"last_update":"1181292688", "numofapproved":"1", "id":"2622"}, {"last_update":"1182246090", "numofapproved":"1", "id":"3205"}, {"last_update":"1182982710", "numofapproved":"1", "id":"3681"}, {"last_update":"1177496084", "numofapproved":"1", "id":"1021"}, {"last_update":"1177496190", "numofapproved":"1", "id":"1022"}, {"last_update":"1178310654", "numofapproved":"1", "id":"1261"}, {"last_update":"1182861963", "numofapproved":"1", "id":"3582"}, {"last_update":"1183392466", "numofapproved":"1", "id":"3981"}, {"last_update":"1183971409", "numofapproved":"1", "id":"4404"}, {"last_update":"1183984082", "numofapproved":"1", "id":"4421"}, {"last_update":"1184101764", "numofapproved":"1", "id":"4581"}, {"last_update":"1185805036", "numofapproved":"1", "id":"5821"}, {"last_update":"1186071563", "numofapproved":"1", "id":"6061"}, {"last_update":"1186331614", "numofapproved":"1", "id":"6221"}, {"last_update":"1187103429", "numofapproved":"1", "id":"6623"}, {"last_update":"1187359405", "numofapproved":"1", "id":"6901"}, {"last_update":"1187764462", "numofapproved":"1", "id":"7121"}, {"last_update":"1187765742", "numofapproved":"1", "id":"7181"}, {"last_update":"1187821663", "numofapproved":"1", "id":"7281"}, {"last_update":"1187851593", "numofapproved":"1", "id":"7301"}, {"last_update":"1188829369", "numofapproved":"1", "id":"8141"}, {"last_update":"1189006834", "numofapproved":"1", "id":"8401"}, {"last_update":"1189656411", "numofapproved":"1", "id":"8901"}, {"last_update":"1181824325", "numofapproved":"1", "id":"2961"}, {"last_update":"1184699326", "numofapproved":"1", "id":"4922"}, {"last_update":"1185981618", "numofapproved":"1", "id":"5981"}, {"last_update":"1186476979", "numofapproved":"1", "id":"6169"}, {"last_update":"1186501212", "numofapproved":"1", "id":"6301"}, {"last_update":"1187111728", "numofapproved":"1", "id":"6624"}, {"last_update":"1187275194", "numofapproved":"1", "id":"6821"}, {"last_update":"1190232587", "numofapproved":"1", "id":"9501"}, {"last_update":"1190379779", "numofapproved":"1", "id":"9661"}, {"last_update":"1190500551", "numofapproved":"1", "id":"9801"}, {"last_update":"1190555711", "numofapproved":"1", "id":"9861"}, {"last_update":"1190664200", "numofapproved":"1", "id":"10061"}, {"last_update":"1190662067", "numofapproved":"1", "id":"10021"}, {"last_update":"1190887692", "numofapproved":"1", "id":"10461"}, {"last_update":"1190887880", "numofapproved":"1", "id":"10462"}, {"last_update":"1190924576", "numofapproved":"1", "id":"10581"}, {"last_update":"1190990748", "numofapproved":"1", "id":"10713"}, {"last_update":"1190990297", "numofapproved":"1", "id":"10703"}, {"last_update":"1182792178", "numofapproved":"1", "id":"3541"}, {"last_update":"1189505682", "numofapproved":"1", "id":"8781"}, {"last_update":"1191410630", "numofapproved":"1", "id":"11081"}, {"last_update":"1191431148", "numofapproved":"1", "id":"11141"}, {"last_update":"1191446393", "numofapproved":"1", "id":"11181"}, {"last_update":"1191559326", "numofapproved":"1", "id":"11481"}, {"last_update":"1191860159", "numofapproved":"1", "id":"11861"}, {"last_update":"1191933842", "numofapproved":"1", "id":"11901"}, {"last_update":"1181765760", "numofapproved":"1", "id":"2901"}, {"last_update":"1187098770", "numofapproved":"1", "id":"6622"}, {"last_update":"1192155125", "numofapproved":"1", "id":"12382"}, {"last_update":"1192449036", "numofapproved":"1", "id":"12601"}, {"last_update":"1192604489", "numofapproved":"1", "id":"12781"}, {"last_update":"1193265229", "numofapproved":"1", "id":"13681"}, {"last_update":"1193304550", "numofapproved":"1", "id":"13781"}, {"last_update":"1193401945", "numofapproved":"1", "id":"14101"}, {"last_update":"1193305327", "numofapproved":"1", "id":"13801"}, {"last_update":"1179912412", "numofapproved":"1", "id":"1722"}, {"last_update":"1188295203", "numofapproved":"1", "id":"7621"}, {"last_update":"1188580008", "numofapproved":"1", "id":"7881"}, {"last_update":"1189115708", "numofapproved":"1", "id":"8521"}, {"last_update":"1193864375", "numofapproved":"1", "id":"14522"}, {"last_update":"1193973963", "numofapproved":"1", "id":"14666"}, {"last_update":"1194003054", "numofapproved":"1", "id":"14701"}, {"last_update":"1194262755", "numofapproved":"1", "id":"14885"}, {"last_update":"1194262860", "numofapproved":"1", "id":"14886"}, {"last_update":"1194366475", "numofapproved":"1", "id":"15042"}, {"last_update":"1194505568", "numofapproved":"1", "id":"15108"}, {"last_update":"1194507434", "numofapproved":"1", "id":"15109"}, {"last_update":"1194625505", "numofapproved":"1", "id":"15542"}, {"last_update":"1194635569", "numofapproved":"1", "id":"15583"}, {"last_update":"1179319405", "numofapproved":"1", "id":"1394"}, {"last_update":"1179409867", "numofapproved":"1", "id":"1441"}, {"last_update":"1179431647", "numofapproved":"1", "id":"1481"}, {"last_update":"1179842302", "numofapproved":"1", "id":"1667"}, {"last_update":"1180710254", "numofapproved":"1", "id":"2081"}, {"last_update":"1181855583", "numofapproved":"1", "id":"3041"}, {"last_update":"1182100211", "numofapproved":"1", "id":"3182"}, {"last_update":"1183377220", "numofapproved":"1", "id":"3921"}, {"last_update":"1184677615", "numofapproved":"1", "id":"4910"}, {"last_update":"1184679060", "numofapproved":"1", "id":"4911"}, {"last_update":"1184679348", "numofapproved":"1", "id":"4912"}, {"last_update":"1184749371", "numofapproved":"1", "id":"4943"}, {"last_update":"1186734180", "numofapproved":"1", "id":"6381"}, {"last_update":"1187012463", "numofapproved":"1", "id":"6501"}, {"last_update":"1187209404", "numofapproved":"1", "id":"6741"}, {"last_update":"1192687257", "numofapproved":"1", "id":"12941"}, {"last_update":"1193385868", "numofapproved":"1", "id":"13942"}, {"last_update":"1193386346", "numofapproved":"1", "id":"13943"}, {"last_update":"1194937571", "numofapproved":"1", "id":"16042"}, {"last_update":"1194855975", "numofapproved":"1", "id":"15761"}, {"last_update":"1194960221", "numofapproved":"1", "id":"16161"}, {"last_update":"1184058679", "numofapproved":"1", "id":"4541"}, {"last_update":"1185865315", "numofapproved":"1", "id":"5842"}, {"last_update":"1187178780", "numofapproved":"1", "id":"6681"}, {"last_update":"1194884625", "numofapproved":"1", "id":"15921"}, {"last_update":"1195134032", "numofapproved":"1", "id":"16721"}, {"last_update":"1195164570", "numofapproved":"1", "id":"16901"}, {"last_update":"1182336429", "numofapproved":"1", "id":"3301"}, {"last_update":"1182415670", "numofapproved":"1", "id":"3353"}, {"last_update":"1184575801", "numofapproved":"1", "id":"4907"}, {"last_update":"1185483718", "numofapproved":"1", "id":"5601"}, {"last_update":"1186402874", "numofapproved":"1", "id":"6166"}, {"last_update":"1186750969", "numofapproved":"1", "id":"6383"}, {"last_update":"1192725360", "numofapproved":"1", "id":"13061"}, {"last_update":"1193314911", "numofapproved":"1", "id":"13822"}, {"last_update":"1183448275", "numofapproved":"1", "id":"4062"}, {"last_update":"1187321039", "numofapproved":"1", "id":"6861"}, {"last_update":"1188287578", "numofapproved":"1", "id":"7601"}, {"last_update":"1194464420", "numofapproved":"1", "id":"15224"}, {"last_update":"1195139641", "numofapproved":"1", "id":"16781"}, {"last_update":"1186147124", "numofapproved":"1", "id":"6107"}, {"last_update":"1188821750", "numofapproved":"1", "id":"8122"}, {"last_update":"1192531864", "numofapproved":"1", "id":"12665"}, {"last_update":"1192984220", "numofapproved":"1", "id":"13223"}, {"last_update":"1195225246", "numofapproved":"1", "id":"16982"}, {"last_update":"1182410787", "numofapproved":"1", "id":"3351"}, {"last_update":"1184531419", "numofapproved":"1", "id":"4901"}, {"last_update":"1188801472", "numofapproved":"1", "id":"8081"}, {"last_update":"1192524288", "numofapproved":"1", "id":"12661"}, {"last_update":"1180950691", "numofapproved":"1", "id":"2181"}, {"last_update":"1184016732", "numofapproved":"1", "id":"4501"}, {"last_update":"1186074085", "numofapproved":"1", "id":"6081"}, {"last_update":"1194937650", "numofapproved":"1", "id":"16043"}, {"last_update":"1182937178", "numofapproved":"1", "id":"3623"}, {"last_update":"1191419601", "numofapproved":"1", "id":"11101"}, {"last_update":"1191856562", "numofapproved":"1", "id":"11843"}, {"last_update":"1192525042", "numofapproved":"1", "id":"12681"}, {"last_update":"1194625494", "numofapproved":"1", "id":"15541"}, {"last_update":"1194982850", "numofapproved":"1", "id":"16361"}, {"last_update":"1194989219", "numofapproved":"1", "id":"16401"}, {"last_update":"1195066723", "numofapproved":"1", "id":"16641"}, {"last_update":"1183971226", "numofapproved":"1", "id":"4403"}, {"last_update":"1185526866", "numofapproved":"1", "id":"5661"}, {"last_update":"1185741495", "numofapproved":"1", "id":"5741"}, {"last_update":"1185905429", "numofapproved":"1", "id":"5881"}, {"last_update":"1186137969", "numofapproved":"1", "id":"6104"}, {"last_update":"1189267536", "numofapproved":"1", "id":"8701"}, {"last_update":"1190115042", "numofapproved":"1", "id":"9261"}, {"last_update":"1190664258", "numofapproved":"1", "id":"10062"}, {"last_update":"1190774949", "numofapproved":"1", "id":"10201"}, {"last_update":"1190965042", "numofapproved":"1", "id":"10641"}, {"last_update":"1191493379", "numofapproved":"1", "id":"11301"}, {"last_update":"1191578051", "numofapproved":"1", "id":"11501"}, {"last_update":"1192188840", "numofapproved":"1", "id":"12421"}, {"last_update":"1194000252", "numofapproved":"1", "id":"14682"}, {"last_update":"1194622556", "numofapproved":"1", "id":"15462"}, {"last_update":"1194981068", "numofapproved":"1", "id":"16341"}, {"last_update":"1185795733", "numofapproved":"1", "id":"5782"}, {"last_update":"1186646854", "numofapproved":"1", "id":"6341"}, {"last_update":"1187087291", "numofapproved":"1", "id":"6621"}, {"last_update":"1187951800", "numofapproved":"1", "id":"7401"}, {"last_update":"1189170373", "numofapproved":"1", "id":"8642"}, {"last_update":"1191007934", "numofapproved":"1", "id":"10781"}, {"last_update":"1190985695", "numofapproved":"1", "id":"10681"}, {"last_update":"1192009758", "numofapproved":"1", "id":"12063"}, {"last_update":"1193062543", "numofapproved":"1", "id":"13321"}, {"last_update":"1194950304", "numofapproved":"1", "id":"16123"}, {"last_update":"1171882085", "numofapproved":"1", "id":"90"}, {"last_update":"1171962264", "numofapproved":"1", "id":"111"}, {"last_update":"1172646556", "numofapproved":"1", "id":"219"}, {"last_update":"1174040139", "numofapproved":"1", "id":"349"}, {"last_update":"1174059263", "numofapproved":"1", "id":"355"}, {"last_update":"1174899063", "numofapproved":"1", "id":"489"}, {"last_update":"1173797557", "numofapproved":"1", "id":"310"}, {"last_update":"1174735191", "numofapproved":"1", "id":"468"}, {"last_update":"1174899259", "numofapproved":"1", "id":"499"}, {"last_update":"1174899354", "numofapproved":"1", "id":"502"}, {"last_update":"1175254120", "numofapproved":"1", "id":"562"}, {"last_update":"1171126391", "numofapproved":"1", "id":"4"}, {"last_update":"1171800381", "numofapproved":"1", "id":"82"}, {"last_update":"1171799224", "numofapproved":"1", "id":"75"}, {"last_update":"1171972550", "numofapproved":"1", "id":"123"}, {"last_update":"1174301165", "numofapproved":"1", "id":"381"}, {"last_update":"1171904847", "numofapproved":"1", "id":"103"}, {"last_update":"1172260956", "numofapproved":"1", "id":"190"}, {"last_update":"1172803368", "numofapproved":"1", "id":"234"}, {"last_update":"1173199576", "numofapproved":"1", "id":"250"}, {"last_update":"1173206201", "numofapproved":"1", "id":"252"}, {"last_update":"1175258941", "numofapproved":"1", "id":"563"}, {"last_update":"1176232231", "numofapproved":"1", "id":"825"}, {"last_update":"1176475088", "numofapproved":"1", "id":"921"}, {"last_update":"1172082181", "numofapproved":"1", "id":"166"}, {"last_update":"1172595205", "numofapproved":"1", "id":"216"}, {"last_update":"1174898892", "numofapproved":"1", "id":"481"}, {"last_update":"1174899696", "numofapproved":"1", "id":"518"}, {"last_update":"1174924777", "numofapproved":"1", "id":"525"}, {"last_update":"1175598588", "numofapproved":"1", "id":"682"}, {"last_update":"1175602572", "numofapproved":"1", "id":"683"}, {"last_update":"1175707879", "numofapproved":"1", "id":"666"}, {"last_update":"1175710528", "numofapproved":"1", "id":"703"}, {"last_update":"1175715728", "numofapproved":"1", "id":"707"}, {"last_update":"1176137267", "numofapproved":"1", "id":"806"}, {"last_update":"1176306491", "numofapproved":"1", "id":"883"}, {"last_update":"1172069972", "numofapproved":"1", "id":"134"}, {"last_update":"1173889144", "numofapproved":"1", "id":"324"}, {"last_update":"1175502804", "numofapproved":"1", "id":"623"}, {"last_update":"1175772530", "numofapproved":"1", "id":"711"}, {"last_update":"1176297526", "numofapproved":"1", "id":"861"}, {"last_update":"1171445818", "numofapproved":"1", "id":"47"}, {"last_update":"1171884505", "numofapproved":"1", "id":"92"}, {"last_update":"1172250708", "numofapproved":"1", "id":"187"}, {"last_update":"1173749631", "numofapproved":"1", "id":"307"}, {"last_update":"1173889164", "numofapproved":"1", "id":"325"}, {"last_update":"1174301168", "numofapproved":"1", "id":"382"}, {"last_update":"1171904807", "numofapproved":"1", "id":"101"}, {"last_update":"1171970405", "numofapproved":"1", "id":"120"}, {"last_update":"1172218677", "numofapproved":"1", "id":"179"}, {"last_update":"1173125028", "numofapproved":"1", "id":"248"}, {"last_update":"1171978122", "numofapproved":"1", "id":"126"}, {"last_update":"1172676736", "numofapproved":"1", "id":"226"}, {"last_update":"1173975473", "numofapproved":"1", "id":"344"}, {"last_update":"1172072582", "numofapproved":"1", "id":"165"}, {"last_update":"1173888774", "numofapproved":"1", "id":"322"}, {"last_update":"1174560347", "numofapproved":"1", "id":"422"}, {"last_update":"1174899242", "numofapproved":"1", "id":"498"}, {"last_update":"1174735110", "numofapproved":"1", "id":"466"}, {"last_update":"1176735630", "numofapproved":"1", "id":"1004"}, {"last_update":"1175725931", "numofapproved":"1", "id":"670"}, {"last_update":"1176498072", "numofapproved":"1", "id":"944"}, {"last_update":"1178264233", "numofapproved":"1", "id":"1241"}, {"last_update":"1178746727", "numofapproved":"1", "id":"1350"}, {"last_update":"1178798992", "numofapproved":"1", "id":"1352"}, {"last_update":"1180011647", "numofapproved":"1", "id":"1649"}, {"last_update":"1180430823", "numofapproved":"1", "id":"1901"}, {"last_update":"1180649952", "numofapproved":"1", "id":"2021"}, {"last_update":"1180966506", "numofapproved":"1", "id":"2183"}, {"last_update":"1180987142", "numofapproved":"1", "id":"2241"}, {"last_update":"1181127788", "numofapproved":"1", "id":"2322"}, {"last_update":"1181217668", "numofapproved":"1", "id":"2461"}, {"last_update":"1182789542", "numofapproved":"1", "id":"3522"}, {"last_update":"1182851714", "numofapproved":"1", "id":"3581"}, {"last_update":"1179268837", "numofapproved":"1", "id":"1407"}, {"last_update":"1179999486", "numofapproved":"1", "id":"1645"}, {"last_update":"1180019568", "numofapproved":"1", "id":"1653"}, {"last_update":"1180082061", "numofapproved":"1", "id":"1821"}, {"last_update":"1184181871", "numofapproved":"1", "id":"4642"}, {"last_update":"1184251955", "numofapproved":"1", "id":"4741"}, {"last_update":"1184346893", "numofapproved":"1", "id":"4841"}, {"last_update":"1184773981", "numofapproved":"1", "id":"5001"}, {"last_update":"1185272905", "numofapproved":"1", "id":"5281"}, {"last_update":"1185484083", "numofapproved":"1", "id":"5622"}, {"last_update":"1185897961", "numofapproved":"1", "id":"5861"}, {"last_update":"1186951708", "numofapproved":"1", "id":"6462"}, {"last_update":"1187596311", "numofapproved":"1", "id":"6941"}, {"last_update":"1187766852", "numofapproved":"1", "id":"7201"}, {"last_update":"1188158133", "numofapproved":"1", "id":"7481"}, {"last_update":"1188233835", "numofapproved":"1", "id":"7501"}, {"last_update":"1188269273", "numofapproved":"1", "id":"7561"}, {"last_update":"1177672684", "numofapproved":"1", "id":"1141"}, {"last_update":"1178042016", "numofapproved":"1", "id":"1222"}, {"last_update":"1181646022", "numofapproved":"1", "id":"2801"}, {"last_update":"1181853920", "numofapproved":"1", "id":"3021"}, {"last_update":"1183715836", "numofapproved":"1", "id":"4241"}, {"last_update":"1183726859", "numofapproved":"1", "id":"4281"}, {"last_update":"1189860355", "numofapproved":"1", "id":"9101"}, {"last_update":"1189871747", "numofapproved":"1", "id":"9141"}, {"last_update":"1190380660", "numofapproved":"1", "id":"9681"}, {"last_update":"1190510808", "numofapproved":"1", "id":"9821"}, {"last_update":"1190542013", "numofapproved":"1", "id":"9843"}, {"last_update":"1190665412", "numofapproved":"1", "id":"10081"}, {"last_update":"1190299519", "numofapproved":"1", "id":"9601"}, {"last_update":"1191410594", "numofapproved":"1", "id":"11063"}, {"last_update":"1191505786", "numofapproved":"1", "id":"11341"}, {"last_update":"1191583652", "numofapproved":"1", "id":"11522"}, {"last_update":"1191599712", "numofapproved":"1", "id":"11681"}, {"last_update":"1191602931", "numofapproved":"1", "id":"11721"}, {"last_update":"1191762572", "numofapproved":"1", "id":"11761"}, {"last_update":"1191856256", "numofapproved":"1", "id":"11841"}, {"last_update":"1191937041", "numofapproved":"1", "id":"11921"}, {"last_update":"1179325639", "numofapproved":"1", "id":"1409"}, {"last_update":"1179912165", "numofapproved":"1", "id":"1721"}, {"last_update":"1181119430", "numofapproved":"1", "id":"2321"}, {"last_update":"1184696743", "numofapproved":"1", "id":"4921"}, {"last_update":"1192154847", "numofapproved":"1", "id":"12361"}, {"last_update":"1192237071", "numofapproved":"1", "id":"12501"}, {"last_update":"1178637394", "numofapproved":"1", "id":"1304"}, {"last_update":"1178716778", "numofapproved":"1", "id":"1344"}, {"last_update":"1182937057", "numofapproved":"1", "id":"3622"}, {"last_update":"1183113642", "numofapproved":"1", "id":"3781"}, {"last_update":"1183995467", "numofapproved":"1", "id":"4461"}, {"last_update":"1184223331", "numofapproved":"1", "id":"4721"}, {"last_update":"1190990692", "numofapproved":"1", "id":"10711"}, {"last_update":"1193269310", "numofapproved":"1", "id":"13761"}, {"last_update":"1193735756", "numofapproved":"1", "id":"14441"}, {"last_update":"1194635738", "numofapproved":"1", "id":"15603"}, {"last_update":"1194901721", "numofapproved":"1", "id":"15961"}, {"last_update":"1194949951", "numofapproved":"1", "id":"16141"}, {"last_update":"1194960695", "numofapproved":"1", "id":"16182"}, {"last_update":"1194973974", "numofapproved":"1", "id":"16221"}, {"last_update":"1194946810", "numofapproved":"1", "id":"16102"}, {"last_update":"1194977452", "numofapproved":"1", "id":"16261"}, {"last_update":"1195040385", "numofapproved":"1", "id":"16461"}, {"last_update":"1195053483", "numofapproved":"1", "id":"16561"}, {"last_update":"1195053518", "numofapproved":"1", "id":"16562"}, {"last_update":"1195218698", "numofapproved":"1", "id":"16921"}, {"last_update":"1195225049", "numofapproved":"1", "id":"16961"}, {"last_update":"1195164270", "numofapproved":"1", "id":"16881"}, {"last_update":"1195080947", "numofapproved":"1", "id":"16681"}, {"last_update":"1195469884", "numofapproved":"1", "id":"17181"}, {"last_update":"1185314804", "numofapproved":"1", "id":"5381"}, {"last_update":"1188401767", "numofapproved":"1", "id":"7721"}, {"last_update":"1190286841", "numofapproved":"1", "id":"9582"}, {"last_update":"1190733096", "numofapproved":"1", "id":"10141"}, {"last_update":"1190847451", "numofapproved":"1", "id":"10422"}, {"last_update":"1190990526", "numofapproved":"1", "id":"10707"}, {"last_update":"1192009711", "numofapproved":"1", "id":"12061"}, {"last_update":"1192155478", "numofapproved":"1", "id":"12362"}, {"last_update":"1192468382", "numofapproved":"1", "id":"12641"}, {"last_update":"1193332032", "numofapproved":"1", "id":"13881"}, {"last_update":"1195497290", "numofapproved":"1", "id":"17321"}, {"last_update":"1195519935", "numofapproved":"1", "id":"17441"}, {"last_update":"1195549826", "numofapproved":"1", "id":"17521"}, {"last_update":"1177668131", "numofapproved":"1", "id":"1101"}, {"last_update":"1186835348", "numofapproved":"1", "id":"6421"}, {"last_update":"1191057903", "numofapproved":"1", "id":"10802"}, {"last_update":"1193973906", "numofapproved":"1", "id":"14665"}, {"last_update":"1171904780", "numofapproved":"1", "id":"100"}, {"last_update":"1172677750", "numofapproved":"1", "id":"227"}, {"last_update":"1172686704", "numofapproved":"1", "id":"229"}, {"last_update":"1173101684", "numofapproved":"1", "id":"245"}, {"last_update":"1173466151", "numofapproved":"1", "id":"282"}, {"last_update":"1174301263", "numofapproved":"1", "id":"386"}, {"last_update":"1174302366", "numofapproved":"1", "id":"399"}, {"last_update":"1174501294", "numofapproved":"1", "id":"421"}, {"last_update":"1174899635", "numofapproved":"1", "id":"515"}, {"last_update":"1174924556", "numofapproved":"1", "id":"523"}, {"last_update":"1175141200", "numofapproved":"1", "id":"541"}, {"last_update":"1171799271", "numofapproved":"1", "id":"76"}, {"last_update":"1171900163", "numofapproved":"1", "id":"97"}, {"last_update":"1174301267", "numofapproved":"1", "id":"387"}, {"last_update":"1174735156", "numofapproved":"1", "id":"467"}, {"last_update":"1174899569", "numofapproved":"1", "id":"512"}, {"last_update":"1174926970", "numofapproved":"1", "id":"531"}, {"last_update":"1175502757", "numofapproved":"1", "id":"602"}, {"last_update":"1175603425", "numofapproved":"1", "id":"663"}, {"last_update":"1176194967", "numofapproved":"1", "id":"822"}, {"last_update":"1171800398", "numofapproved":"1", "id":"83"}, {"last_update":"1171968376", "numofapproved":"1", "id":"118"}, {"last_update":"1172070063", "numofapproved":"1", "id":"135"}, {"last_update":"1173821159", "numofapproved":"1", "id":"314"}, {"last_update":"1176559052", "numofapproved":"1", "id":"964"}, {"last_update":"1171299245", "numofapproved":"1", "id":"23"}, {"last_update":"1171535160", "numofapproved":"1", "id":"57"}, {"last_update":"1171564542", "numofapproved":"1", "id":"65"}, {"last_update":"1172646592", "numofapproved":"1", "id":"220"}, {"last_update":"1174899489", "numofapproved":"1", "id":"507"}, {"last_update":"1174924890", "numofapproved":"1", "id":"528"}, {"last_update":"1175687005", "numofapproved":"1", "id":"701"}, {"last_update":"1176132888", "numofapproved":"1", "id":"805"}, {"last_update":"1171286610", "numofapproved":"1", "id":"21"}, {"last_update":"1172184441", "numofapproved":"1", "id":"176"}, {"last_update":"1172187221", "numofapproved":"1", "id":"178"}, {"last_update":"1173386668", "numofapproved":"1", "id":"261"}, {"last_update":"1173809115", "numofapproved":"1", "id":"312"}, {"last_update":"1175609126", "numofapproved":"1", "id":"685"}, {"last_update":"1175791369", "numofapproved":"1", "id":"712"}, {"last_update":"1176480434", "numofapproved":"1", "id":"942"}, {"last_update":"1171503567", "numofapproved":"1", "id":"56"}, {"last_update":"1171799204", "numofapproved":"1", "id":"74"}, {"last_update":"1172236765", "numofapproved":"1", "id":"183"}, {"last_update":"1175598013", "numofapproved":"1", "id":"681"}, {"last_update":"1175610956", "numofapproved":"1", "id":"687"}, {"last_update":"1175725436", "numofapproved":"1", "id":"710"}, {"last_update":"1171905052", "numofapproved":"1", "id":"105"}, {"last_update":"1172268920", "numofapproved":"1", "id":"191"}, {"last_update":"1173264110", "numofapproved":"1", "id":"256"}, {"last_update":"1173889179", "numofapproved":"1", "id":"326"}, {"last_update":"1174301066", "numofapproved":"1", "id":"378"}, {"last_update":"1174300399", "numofapproved":"1", "id":"366"}, {"last_update":"1174387980", "numofapproved":"1", "id":"400"}, {"last_update":"1176823766", "numofapproved":"1", "id":"1007"}, {"last_update":"1171970585", "numofapproved":"1", "id":"122"}, {"last_update":"1172071500", "numofapproved":"1", "id":"145"}, {"last_update":"1172580279", "numofapproved":"1", "id":"211"}, {"last_update":"1172658493", "numofapproved":"1", "id":"221"}, {"last_update":"1174301611", "numofapproved":"1", "id":"397"}, {"last_update":"1176900132", "numofapproved":"1", "id":"989"}, {"last_update":"1171965754", "numofapproved":"1", "id":"114"}, {"last_update":"1173797482", "numofapproved":"1", "id":"309"}, {"last_update":"1174300513", "numofapproved":"1", "id":"367"}, {"last_update":"1174301493", "numofapproved":"1", "id":"395"}, {"last_update":"1174899124", "numofapproved":"1", "id":"492"}, {"last_update":"1174899677", "numofapproved":"1", "id":"517"}, {"last_update":"1174924235", "numofapproved":"1", "id":"522"}, {"last_update":"1174925568", "numofapproved":"1", "id":"529"}, {"last_update":"1174933088", "numofapproved":"1", "id":"533"}, {"last_update":"1174933338", "numofapproved":"1", "id":"538"}, {"last_update":"1174044629", "numofapproved":"1", "id":"352"}, {"last_update":"1175713207", "numofapproved":"1", "id":"669"}, {"last_update":"1178339569", "numofapproved":"1", "id":"1262"}, {"last_update":"1178611427", "numofapproved":"1", "id":"1303"}, {"last_update":"1178707269", "numofapproved":"1", "id":"1341"}, {"last_update":"1179411388", "numofapproved":"1", "id":"1461"}, {"last_update":"1180000879", "numofapproved":"1", "id":"1648"}, {"last_update":"1180097993", "numofapproved":"1", "id":"1657"}, {"last_update":"1180107947", "numofapproved":"1", "id":"1659"}, {"last_update":"1180515935", "numofapproved":"1", "id":"1922"}, {"last_update":"1180712418", "numofapproved":"1", "id":"2102"}, {"last_update":"1180731895", "numofapproved":"1", "id":"2063"}, {"last_update":"1180731763", "numofapproved":"1", "id":"2143"}, {"last_update":"1180951519", "numofapproved":"1", "id":"2201"}, {"last_update":"1180954763", "numofapproved":"1", "id":"2182"}, {"last_update":"1181134185", "numofapproved":"1", "id":"2361"}, {"last_update":"1181206368", "numofapproved":"1", "id":"2441"}, {"last_update":"1181207556", "numofapproved":"1", "id":"2442"}, {"last_update":"1183065868", "numofapproved":"1", "id":"3741"}, {"last_update":"1183124436", "numofapproved":"1", "id":"3822"}, {"last_update":"1183118631", "numofapproved":"1", "id":"3802"}, {"last_update":"1183515629", "numofapproved":"1", "id":"4144"}, {"last_update":"1184169495", "numofapproved":"1", "id":"4621"}, {"last_update":"1184777700", "numofapproved":"1", "id":"5021"}, {"last_update":"1185371099", "numofapproved":"1", "id":"5441"}, {"last_update":"1185460060", "numofapproved":"1", "id":"5521"}, {"last_update":"1185462514", "numofapproved":"1", "id":"5541"}, {"last_update":"1185573050", "numofapproved":"1", "id":"5721"}, {"last_update":"1185795586", "numofapproved":"1", "id":"5781"}, {"last_update":"1185962181", "numofapproved":"1", "id":"5901"}, {"last_update":"1185987024", "numofapproved":"1", "id":"6001"}, {"last_update":"1186138150", "numofapproved":"1", "id":"6105"}, {"last_update":"1186500528", "numofapproved":"1", "id":"6281"}, {"last_update":"1187765075", "numofapproved":"1", "id":"7141"}, {"last_update":"1188158263", "numofapproved":"1", "id":"7482"}, {"last_update":"1189094579", "numofapproved":"1", "id":"8461"}, {"last_update":"1189327635", "numofapproved":"1", "id":"8721"}, {"last_update":"1182356521", "numofapproved":"1", "id":"3344"}, {"last_update":"1185017921", "numofapproved":"1", "id":"5161"}, {"last_update":"1185271167", "numofapproved":"1", "id":"5261"}, {"last_update":"1190663796", "numofapproved":"1", "id":"10041"}, {"last_update":"1190726728", "numofapproved":"1", "id":"10121"}, {"last_update":"1190801144", "numofapproved":"1", "id":"10241"}, {"last_update":"1190894441", "numofapproved":"1", "id":"10502"}, {"last_update":"1190973098", "numofapproved":"1", "id":"10667"}, {"last_update":"1190925124", "numofapproved":"1", "id":"10584"}, {"last_update":"1191249884", "numofapproved":"1", "id":"10961"}, {"last_update":"1187732431", "numofapproved":"1", "id":"7081"}, {"last_update":"1189259179", "numofapproved":"1", "id":"8681"}, {"last_update":"1191446517", "numofapproved":"1", "id":"11183"}, {"last_update":"1191510643", "numofapproved":"1", "id":"11381"}, {"last_update":"1191529640", "numofapproved":"1", "id":"11421"}, {"last_update":"1191588726", "numofapproved":"1", "id":"11602"}, {"last_update":"1191903050", "numofapproved":"1", "id":"11881"}, {"last_update":"1181218459", "numofapproved":"1", "id":"2464"}, {"last_update":"1187024536", "numofapproved":"1", "id":"6581"}, {"last_update":"1192009094", "numofapproved":"1", "id":"12041"}, {"last_update":"1192064048", "numofapproved":"1", "id":"12183"}, {"last_update":"1192061973", "numofapproved":"1", "id":"12181"}, {"last_update":"1193026780", "numofapproved":"1", "id":"13241"}, {"last_update":"1193416409", "numofapproved":"1", "id":"14161"}, {"last_update":"1186992495", "numofapproved":"1", "id":"6481"}, {"last_update":"1191410811", "numofapproved":"1", "id":"11066"}, {"last_update":"1193440748", "numofapproved":"1", "id":"14241"}, {"last_update":"1194252005", "numofapproved":"1", "id":"14884"}, {"last_update":"1194362364", "numofapproved":"1", "id":"14889"}, {"last_update":"1179240103", "numofapproved":"1", "id":"1389"}, {"last_update":"1181812262", "numofapproved":"1", "id":"2922"}, {"last_update":"1182093916", "numofapproved":"1", "id":"3181"}, {"last_update":"1182767688", "numofapproved":"1", "id":"3501"}, {"last_update":"1184181747", "numofapproved":"1", "id":"4661"}, {"last_update":"1186505570", "numofapproved":"1", "id":"6170"}, {"last_update":"1186751068", "numofapproved":"1", "id":"6384"}, {"last_update":"1187558925", "numofapproved":"1", "id":"6921"}, {"last_update":"1188037477", "numofapproved":"1", "id":"7424"}, {"last_update":"1194937530", "numofapproved":"1", "id":"16041"}, {"last_update":"1179754250", "numofapproved":"1", "id":"1562"}, {"last_update":"1183416194", "numofapproved":"1", "id":"4021"}, {"last_update":"1185835616", "numofapproved":"1", "id":"5841"}, {"last_update":"1192731190", "numofapproved":"1", "id":"13141"}, {"last_update":"1193178120", "numofapproved":"1", "id":"13523"}, {"last_update":"1193844805", "numofapproved":"1", "id":"14503"}, {"last_update":"1193909242", "numofapproved":"1", "id":"14525"}, {"last_update":"1195474767", "numofapproved":"1", "id":"17221"}, {"last_update":"1177690781", "numofapproved":"1", "id":"1142"}, {"last_update":"1185373614", "numofapproved":"1", "id":"5461"}, {"last_update":"1192520088", "numofapproved":"1", "id":"12624"}, {"last_update":"1193194444", "numofapproved":"1", "id":"13527"}, {"last_update":"1193387684", "numofapproved":"1", "id":"13950"}, {"last_update":"1193388786", "numofapproved":"1", "id":"13952"}, {"last_update":"1194616895", "numofapproved":"1", "id":"15401"}, {"last_update":"1195034817", "numofapproved":"1", "id":"16441"}, {"last_update":"1183107374", "numofapproved":"1", "id":"3761"}, {"last_update":"1183515040", "numofapproved":"1", "id":"4121"}, {"last_update":"1184744160", "numofapproved":"1", "id":"4942"}, {"last_update":"1192094830", "numofapproved":"1", "id":"12201"}, {"last_update":"1193314411", "numofapproved":"1", "id":"13821"}, {"last_update":"1193391901", "numofapproved":"1", "id":"13957"}, {"last_update":"1193399824", "numofapproved":"1", "id":"14043"}, {"last_update":"1194450353", "numofapproved":"1", "id":"15181"}, {"last_update":"1194474719", "numofapproved":"1", "id":"15241"}, {"last_update":"1194622799", "numofapproved":"1", "id":"15481"}, {"last_update":"1194880827", "numofapproved":"1", "id":"15901"}, {"last_update":"1182363929", "numofapproved":"1", "id":"3347"}, {"last_update":"1182952243", "numofapproved":"1", "id":"3642"}, {"last_update":"1183386876", "numofapproved":"1", "id":"3962"}, {"last_update":"1193178314", "numofapproved":"1", "id":"13524"}, {"last_update":"1195376577", "numofapproved":"1", "id":"17061"}, {"last_update":"1179832847", "numofapproved":"1", "id":"1621"}, {"last_update":"1184053269", "numofapproved":"1", "id":"4521"}, {"last_update":"1185024744", "numofapproved":"1", "id":"5181"}, {"last_update":"1186130324", "numofapproved":"1", "id":"6101"}, {"last_update":"1192529640", "numofapproved":"1", "id":"12662"}, {"last_update":"1193158482", "numofapproved":"1", "id":"13521"}, {"last_update":"1194247788", "numofapproved":"1", "id":"14883"}, {"last_update":"1182363717", "numofapproved":"1", "id":"3346"}, {"last_update":"1193386824", "numofapproved":"1", "id":"13944"}, {"last_update":"1193844655", "numofapproved":"1", "id":"14502"}, {"last_update":"1180732326", "numofapproved":"1", "id":"2064"}, {"last_update":"1182247493", "numofapproved":"1", "id":"3222"}, {"last_update":"1183515318", "numofapproved":"1", "id":"4143"}, {"last_update":"1184840285", "numofapproved":"1", "id":"5061"}, {"last_update":"1188458821", "numofapproved":"1", "id":"7741"}, {"last_update":"1188919582", "numofapproved":"1", "id":"8241"}, {"last_update":"1190990231", "numofapproved":"1", "id":"10701"}, {"last_update":"1190990557", "numofapproved":"1", "id":"10708"}, {"last_update":"1191583611", "numofapproved":"1", "id":"11521"}, {"last_update":"1192031263", "numofapproved":"1", "id":"12102"}, {"last_update":"1192431349", "numofapproved":"1", "id":"12563"}, {"last_update":"1192608972", "numofapproved":"1", "id":"12801"}, {"last_update":"1193244196", "numofapproved":"1", "id":"13641"}, {"last_update":"1193733530", "numofapproved":"1", "id":"14422"}, {"last_update":"1194988770", "numofapproved":"1", "id":"16381"}, {"last_update":"1195050890", "numofapproved":"1", "id":"16541"}, {"last_update":"1195047262", "numofapproved":"1", "id":"16502"}, {"last_update":"1195221672", "numofapproved":"1", "id":"16941"}, {"last_update":"1195400016", "numofapproved":"1", "id":"17103"}, {"last_update":"1178716622", "numofapproved":"1", "id":"1343"}, {"last_update":"1183563126", "numofapproved":"1", "id":"4181"}, {"last_update":"1183970953", "numofapproved":"1", "id":"4402"}, {"last_update":"1190149151", "numofapproved":"1", "id":"9381"}, {"last_update":"1190628937", "numofapproved":"1", "id":"9921"}, {"last_update":"1190908511", "numofapproved":"1", "id":"10521"}, {"last_update":"1191365468", "numofapproved":"1", "id":"11021"}, {"last_update":"1192431054", "numofapproved":"1", "id":"12561"}, {"last_update":"1188938163", "numofapproved":"1", "id":"8281"}, {"last_update":"1192155298", "numofapproved":"1", "id":"12383"}, {"last_update":"1193223714", "numofapproved":"1", "id":"13561"}, {"last_update":"1171799359", "numofapproved":"1", "id":"80"}, {"last_update":"1171962550", "numofapproved":"1", "id":"112"}, {"last_update":"1171965210", "numofapproved":"1", "id":"113"}, {"last_update":"1171980888", "numofapproved":"1", "id":"128"}, {"last_update":"1174299174", "numofapproved":"1", "id":"361"}, {"last_update":"1174301053", "numofapproved":"1", "id":"376"}, {"last_update":"1174899661", "numofapproved":"1", "id":"516"}, {"last_update":"1172646493", "numofapproved":"1", "id":"218"}, {"last_update":"1174899018", "numofapproved":"1", "id":"487"}, {"last_update":"1175091201", "numofapproved":"1", "id":"540"}, {"last_update":"1175267243", "numofapproved":"1", "id":"564"}, {"last_update":"1176293117", "numofapproved":"1", "id":"826"}, {"last_update":"1171602873", "numofapproved":"1", "id":"67"}, {"last_update":"1172568714", "numofapproved":"1", "id":"210"}, {"last_update":"1174300556", "numofapproved":"1", "id":"369"}, {"last_update":"1174301614", "numofapproved":"1", "id":"398"}, {"last_update":"1174429050", "numofapproved":"1", "id":"404"}, {"last_update":"1175547821", "numofapproved":"1", "id":"641"}, {"last_update":"1175696551", "numofapproved":"1", "id":"702"}, {"last_update":"1176223342", "numofapproved":"1", "id":"823"}, {"last_update":"1176459077", "numofapproved":"1", "id":"905"}, {"last_update":"1172169117", "numofapproved":"1", "id":"172"}, {"last_update":"1172259821", "numofapproved":"1", "id":"189"}, {"last_update":"1172847347", "numofapproved":"1", "id":"237"}, {"last_update":"1176485274", "numofapproved":"1", "id":"961"}, {"last_update":"1176739199", "numofapproved":"1", "id":"983"}, {"last_update":"1171710108", "numofapproved":"1", "id":"72"}, {"last_update":"1172147854", "numofapproved":"1", "id":"170"}, {"last_update":"1172178657", "numofapproved":"1", "id":"173"}, {"last_update":"1174933210", "numofapproved":"1", "id":"535"}, {"last_update":"1175502973", "numofapproved":"1", "id":"626"}, {"last_update":"1172071610", "numofapproved":"1", "id":"146"}, {"last_update":"1172847402", "numofapproved":"1", "id":"240"}, {"last_update":"1173282970", "numofapproved":"1", "id":"258"}, {"last_update":"1175502729", "numofapproved":"1", "id":"621"}, {"last_update":"1173889203", "numofapproved":"1", "id":"327"}, {"last_update":"1174301604", "numofapproved":"1", "id":"396"}, {"last_update":"1176738556", "numofapproved":"1", "id":"1005"}, {"last_update":"1171287066", "numofapproved":"1", "id":"22"}, {"last_update":"1171388951", "numofapproved":"1", "id":"46"}, {"last_update":"1171645099", "numofapproved":"1", "id":"70"}, {"last_update":"1174301489", "numofapproved":"1", "id":"394"}, {"last_update":"1176109438", "numofapproved":"1", "id":"804"}, {"last_update":"1173203622", "numofapproved":"1", "id":"251"}, {"last_update":"1174300337", "numofapproved":"1", "id":"364"}, {"last_update":"1174898999", "numofapproved":"1", "id":"486"}, {"last_update":"1174899221", "numofapproved":"1", "id":"497"}, {"last_update":"1174899505", "numofapproved":"1", "id":"508"}, {"last_update":"1171905996", "numofapproved":"1", "id":"106"}, {"last_update":"1172003938", "numofapproved":"1", "id":"131"}, {"last_update":"1172134183", "numofapproved":"1", "id":"167"}, {"last_update":"1178550080", "numofapproved":"1", "id":"1301"}, {"last_update":"1178718229", "numofapproved":"1", "id":"1346"}, {"last_update":"1178725187", "numofapproved":"1", "id":"1322"}, {"last_update":"1179302219", "numofapproved":"1", "id":"1392"}, {"last_update":"1180015260", "numofapproved":"1", "id":"1650"}, {"last_update":"1180088452", "numofapproved":"1", "id":"1656"}, {"last_update":"1180719498", "numofapproved":"1", "id":"2121"}, {"last_update":"1180731930", "numofapproved":"1", "id":"2145"}, {"last_update":"1180731601", "numofapproved":"1", "id":"2142"}, {"last_update":"1181034337", "numofapproved":"1", "id":"2281"}, {"last_update":"1181222113", "numofapproved":"1", "id":"2501"}, {"last_update":"1181254636", "numofapproved":"1", "id":"2601"}, {"last_update":"1181578682", "numofapproved":"1", "id":"2762"}, {"last_update":"1181731051", "numofapproved":"1", "id":"2881"}, {"last_update":"1177673345", "numofapproved":"1", "id":"1162"}, {"last_update":"1183741680", "numofapproved":"1", "id":"4301"}, {"last_update":"1183988623", "numofapproved":"1", "id":"4441"}, {"last_update":"1184217947", "numofapproved":"1", "id":"4701"}, {"last_update":"1186260146", "numofapproved":"1", "id":"6181"}, {"last_update":"1186289860", "numofapproved":"1", "id":"6163"}, {"last_update":"1186235477", "numofapproved":"1", "id":"6161"}, {"last_update":"1186508996", "numofapproved":"1", "id":"6171"}, {"last_update":"1187626570", "numofapproved":"1", "id":"6961"}, {"last_update":"1187713755", "numofapproved":"1", "id":"7041"}, {"last_update":"1187769208", "numofapproved":"1", "id":"7222"}, {"last_update":"1187856827", "numofapproved":"1", "id":"7341"}, {"last_update":"1188053850", "numofapproved":"1", "id":"7461"}, {"last_update":"1188264856", "numofapproved":"1", "id":"7541"}, {"last_update":"1188319841", "numofapproved":"1", "id":"7681"}, {"last_update":"1188582632", "numofapproved":"1", "id":"7901"}, {"last_update":"1188734330", "numofapproved":"1", "id":"8001"}, {"last_update":"1189003562", "numofapproved":"1", "id":"8381"}, {"last_update":"1179787121", "numofapproved":"1", "id":"1581"}, {"last_update":"1181998896", "numofapproved":"1", "id":"3121"}, {"last_update":"1182274782", "numofapproved":"1", "id":"3261"}, {"last_update":"1186350397", "numofapproved":"1", "id":"6241"}, {"last_update":"1187354512", "numofapproved":"1", "id":"6881"}, {"last_update":"1188918086", "numofapproved":"1", "id":"8221"}, {"last_update":"1190392989", "numofapproved":"1", "id":"9721"}, {"last_update":"1190925022", "numofapproved":"1", "id":"10583"}, {"last_update":"1190959571", "numofapproved":"1", "id":"10601"}, {"last_update":"1190990357", "numofapproved":"1", "id":"10705"}, {"last_update":"1190990656", "numofapproved":"1", "id":"10710"}, {"last_update":"1191226364", "numofapproved":"1", "id":"10921"}, {"last_update":"1180011741", "numofapproved":"1", "id":"1761"}, {"last_update":"1180533694", "numofapproved":"1", "id":"1961"}, {"last_update":"1180731839", "numofapproved":"1", "id":"2144"}, {"last_update":"1181461876", "numofapproved":"1", "id":"2681"}, {"last_update":"1181855690", "numofapproved":"1", "id":"3061"}, {"last_update":"1189537687", "numofapproved":"1", "id":"8821"}, {"last_update":"1189937430", "numofapproved":"1", "id":"9161"}, {"last_update":"1190803903", "numofapproved":"1", "id":"10261"}, {"last_update":"1190973051", "numofapproved":"1", "id":"10664"}, {"last_update":"1191410739", "numofapproved":"1", "id":"11064"}, {"last_update":"1191426697", "numofapproved":"1", "id":"11121"}, {"last_update":"1191446459", "numofapproved":"1", "id":"11182"}, {"last_update":"1191450891", "numofapproved":"1", "id":"11201"}, {"last_update":"1191550000", "numofapproved":"1", "id":"11441"}, {"last_update":"1191588714", "numofapproved":"1", "id":"11601"}, {"last_update":"1191596815", "numofapproved":"1", "id":"11641"}, {"last_update":"1191647971", "numofapproved":"1", "id":"11741"}, {"last_update":"1191949660", "numofapproved":"1", "id":"11981"}, {"last_update":"1180641844", "numofapproved":"1", "id":"2001"}, {"last_update":"1188319710", "numofapproved":"1", "id":"7661"}, {"last_update":"1189169640", "numofapproved":"1", "id":"8621"}, {"last_update":"1192028009", "numofapproved":"1", "id":"12081"}, {"last_update":"1192116783", "numofapproved":"1", "id":"12261"}, {"last_update":"1192558715", "numofapproved":"1", "id":"12741"}, {"last_update":"1192727702", "numofapproved":"1", "id":"13101"}, {"last_update":"1193035517", "numofapproved":"1", "id":"13262"}, {"last_update":"1193080239", "numofapproved":"1", "id":"13381"}, {"last_update":"1193268912", "numofapproved":"1", "id":"13722"}, {"last_update":"1193386894", "numofapproved":"1", "id":"13946"}, {"last_update":"1193388087", "numofapproved":"1", "id":"13982"}, {"last_update":"1179841973", "numofapproved":"1", "id":"1642"}, {"last_update":"1179842066", "numofapproved":"1", "id":"1662"}, {"last_update":"1185971695", "numofapproved":"1", "id":"5941"}, {"last_update":"1186137440", "numofapproved":"1", "id":"6103"}, {"last_update":"1192823224", "numofapproved":"1", "id":"13181"}, {"last_update":"1193921116", "numofapproved":"1", "id":"14581"}, {"last_update":"1193918035", "numofapproved":"1", "id":"14544"}, {"last_update":"1193973759", "numofapproved":"1", "id":"14663"}, {"last_update":"1194004166", "numofapproved":"1", "id":"14721"}, {"last_update":"1194020795", "numofapproved":"1", "id":"14761"}, {"last_update":"1194021069", "numofapproved":"1", "id":"14781"}, {"last_update":"1194283444", "numofapproved":"1", "id":"14887"}, {"last_update":"1194436909", "numofapproved":"1", "id":"15141"}, {"last_update":"1194538247", "numofapproved":"1", "id":"15341"}, {"last_update":"1180031440", "numofapproved":"1", "id":"1801"}, {"last_update":"1181823965", "numofapproved":"1", "id":"2941"}, {"last_update":"1182846565", "numofapproved":"1", "id":"3561"}, {"last_update":"1185872587", "numofapproved":"1", "id":"5843"}, {"last_update":"1186472951", "numofapproved":"1", "id":"6168"}, {"last_update":"1189937606", "numofapproved":"1", "id":"9181"}, {"last_update":"1193389026", "numofapproved":"1", "id":"13955"}, {"last_update":"1192130592", "numofapproved":"1", "id":"12321"}, {"last_update":"1194387386", "numofapproved":"1", "id":"15061"}, {"last_update":"1179336536", "numofapproved":"1", "id":"1396"}, {"last_update":"1182280246", "numofapproved":"1", "id":"3281"}, {"last_update":"1183394591", "numofapproved":"1", "id":"4001"}, {"last_update":"1184677502", "numofapproved":"1", "id":"4909"}, {"last_update":"1186144184", "numofapproved":"1", "id":"6106"}, {"last_update":"1187191683", "numofapproved":"1", "id":"6701"}, {"last_update":"1193909594", "numofapproved":"1", "id":"14527"}, {"last_update":"1194435747", "numofapproved":"1", "id":"15121"}, {"last_update":"1184252278", "numofapproved":"1", "id":"4761"}, {"last_update":"1194854996", "numofapproved":"1", "id":"15721"}, {"last_update":"1194937730", "numofapproved":"1", "id":"16045"}, {"last_update":"1193076864", "numofapproved":"1", "id":"13361"}, {"last_update":"1194904087", "numofapproved":"1", "id":"15981"}, {"last_update":"1181853751", "numofapproved":"1", "id":"3001"}, {"last_update":"1182075529", "numofapproved":"1", "id":"3161"}, {"last_update":"1184883226", "numofapproved":"1", "id":"5081"}, {"last_update":"1186136013", "numofapproved":"1", "id":"6102"}, {"last_update":"1193147983", "numofapproved":"1", "id":"13481"}, {"last_update":"1194532658", "numofapproved":"1", "id":"15301"}, {"last_update":"1194937763", "numofapproved":"1", "id":"16046"}, {"last_update":"1195225183", "numofapproved":"1", "id":"16981"}, {"last_update":"1180616624", "numofapproved":"1", "id":"1981"}, {"last_update":"1183019269", "numofapproved":"1", "id":"3701"}, {"last_update":"1188656338", "numofapproved":"1", "id":"7941"}, {"last_update":"1178799062", "numofapproved":"1", "id":"1353"}, {"last_update":"1178905809", "numofapproved":"1", "id":"1360"}, {"last_update":"1179311575", "numofapproved":"1", "id":"1408"}, {"last_update":"1182507595", "numofapproved":"1", "id":"3461"}, {"last_update":"1184254004", "numofapproved":"1", "id":"4781"}, {"last_update":"1187938257", "numofapproved":"1", "id":"7381"}, {"last_update":"1188473327", "numofapproved":"1", "id":"7801"}, {"last_update":"1189102174", "numofapproved":"1", "id":"8481"}, {"last_update":"1191419747", "numofapproved":"1", "id":"11102"}, {"last_update":"1193389169", "numofapproved":"1", "id":"14002"}, {"last_update":"1194440930", "numofapproved":"1", "id":"15102"}, {"last_update":"1194855848", "numofapproved":"1", "id":"15741"}, {"last_update":"1194862162", "numofapproved":"1", "id":"15841"}, {"last_update":"1194923605", "numofapproved":"1", "id":"16021"}, {"last_update":"1194950051", "numofapproved":"1", "id":"16142"}, {"last_update":"1194960554", "numofapproved":"1", "id":"16181"}, {"last_update":"1194988868", "numofapproved":"1", "id":"16382"}, {"last_update":"1195058276", "numofapproved":"1", "id":"16601"}, {"last_update":"1195469960", "numofapproved":"1", "id":"17201"}, {"last_update":"1178648361", "numofapproved":"1", "id":"1311"}, {"last_update":"1183970840", "numofapproved":"1", "id":"4401"}, {"last_update":"1184838534", "numofapproved":"1", "id":"5041"}, {"last_update":"1190745858", "numofapproved":"1", "id":"10161"}, {"last_update":"1191587968", "numofapproved":"1", "id":"11581"}, {"last_update":"1189773687", "numofapproved":"1", "id":"9021"}, {"last_update":"1192612866", "numofapproved":"1", "id":"12804"}, {"last_update":"1193746024", "numofapproved":"1", "id":"14461"}, {"last_update":"1193918117", "numofapproved":"1", "id":"14561"}, {"last_update":"1194981013", "numofapproved":"1", "id":"16321"}, {"last_update":"1195546695", "numofapproved":"1", "id":"17481"}, {"last_update":"1177592107", "numofapproved":"1", "id":"1047"}, {"last_update":"1183569612", "numofapproved":"1", "id":"4221"}, {"last_update":"1186770649", "numofapproved":"1", "id":"6401"}, {"last_update":"1187707518", "numofapproved":"1", "id":"7021"}, {"last_update":"1187769297", "numofapproved":"1", "id":"7223"}, {"last_update":"1187798945", "numofapproved":"1", "id":"7241"}, {"last_update":"1187820883", "numofapproved":"1", "id":"7261"}, {"last_update":"1190286816", "numofapproved":"1", "id":"9581"}, {"last_update":"1190541964", "numofapproved":"1", "id":"9842"}, {"last_update":"1190500569", "numofapproved":"1", "id":"9802"}, {"last_update":"1190800190", "numofapproved":"1", "id":"10222"}, {"last_update":"1190965460", "numofapproved":"1", "id":"10642"}, {"last_update":"1192120899", "numofapproved":"1", "id":"12301"}, {"last_update":"1193265675", "numofapproved":"1", "id":"13701"}, {"last_update":"1194508196", "numofapproved":"1", "id":"15261"}, {"last_update":"1172503197", "numofapproved":"1", "id":"196"}, {"last_update":"1172847366", "numofapproved":"1", "id":"238"}, {"last_update":"1173975764", "numofapproved":"1", "id":"347"}, {"last_update":"1174301010", "numofapproved":"1", "id":"375"}, {"last_update":"1174899614", "numofapproved":"1", "id":"514"}, {"last_update":"1174924853", "numofapproved":"1", "id":"527"}, {"last_update":"1175270318", "numofapproved":"1", "id":"567"}, {"last_update":"1174933246", "numofapproved":"1", "id":"536"}, {"last_update":"1176369900", "numofapproved":"1", "id":"889"}, {"last_update":"1171102836", "numofapproved":"1", "id":"2"}, {"last_update":"1171970451", "numofapproved":"1", "id":"121"}, {"last_update":"1174898953", "numofapproved":"1", "id":"484"}, {"last_update":"1175610845", "numofapproved":"1", "id":"664"}, {"last_update":"1176313569", "numofapproved":"1", "id":"885"}, {"last_update":"1171878648", "numofapproved":"1", "id":"89"}, {"last_update":"1171897268", "numofapproved":"1", "id":"96"}, {"last_update":"1172326187", "numofapproved":"1", "id":"193"}, {"last_update":"1176106905", "numofapproved":"1", "id":"802"}, {"last_update":"1176389540", "numofapproved":"1", "id":"891"}, {"last_update":"1171318806", "numofapproved":"1", "id":"24"}, {"last_update":"1171601548", "numofapproved":"1", "id":"66"}, {"last_update":"1172148331", "numofapproved":"1", "id":"171"}, {"last_update":"1172686680", "numofapproved":"1", "id":"228"}, {"last_update":"1173793572", "numofapproved":"1", "id":"308"}, {"last_update":"1174899594", "numofapproved":"1", "id":"513"}, {"last_update":"1174898936", "numofapproved":"1", "id":"483"}, {"last_update":"1175502773", "numofapproved":"1", "id":"622"}, {"last_update":"1175722537", "numofapproved":"1", "id":"709"}, {"last_update":"1175764633", "numofapproved":"1", "id":"672"}, {"last_update":"1175797156", "numofapproved":"1", "id":"721"}, {"last_update":"1175899070", "numofapproved":"1", "id":"785"}, {"last_update":"1176106959", "numofapproved":"1", "id":"803"}, {"last_update":"1176228460", "numofapproved":"1", "id":"824"}, {"last_update":"1176488163", "numofapproved":"1", "id":"962"}, {"last_update":"1172068869", "numofapproved":"1", "id":"133"}, {"last_update":"1172847381", "numofapproved":"1", "id":"239"}, {"last_update":"1173888657", "numofapproved":"1", "id":"320"}, {"last_update":"1171449446", "numofapproved":"1", "id":"48"}, {"last_update":"1175287424", "numofapproved":"1", "id":"581"}, {"last_update":"1175502897", "numofapproved":"1", "id":"624"}, {"last_update":"1175503020", "numofapproved":"1", "id":"605"}, {"last_update":"1172848367", "numofapproved":"1", "id":"243"}, {"last_update":"1174301060", "numofapproved":"1", "id":"377"}, {"last_update":"1176824481", "numofapproved":"1", "id":"986"}, {"last_update":"1171275893", "numofapproved":"1", "id":"6"}, {"last_update":"1172546216", "numofapproved":"1", "id":"206"}, {"last_update":"1175502705", "numofapproved":"1", "id":"601"}, {"last_update":"1173962671", "numofapproved":"1", "id":"341"}, {"last_update":"1173975403", "numofapproved":"1", "id":"342"}, {"last_update":"1173816295", "numofapproved":"1", "id":"313"}, {"last_update":"1174301256", "numofapproved":"1", "id":"384"}, {"last_update":"1174933293", "numofapproved":"1", "id":"537"}, {"last_update":"1176899419", "numofapproved":"1", "id":"988"}, {"last_update":"1173975599", "numofapproved":"1", "id":"345"}, {"last_update":"1174041960", "numofapproved":"1", "id":"351"}, {"last_update":"1175759476", "numofapproved":"1", "id":"671"}, {"last_update":"1178195644", "numofapproved":"1", "id":"1207"}, {"last_update":"1178725318", "numofapproved":"1", "id":"1348"}, {"last_update":"1179333492", "numofapproved":"1", "id":"1421"}, {"last_update":"1179999737", "numofapproved":"1", "id":"1646"}, {"last_update":"1180710770", "numofapproved":"1", "id":"2062"}, {"last_update":"1182868347", "numofapproved":"1", "id":"3601"}, {"last_update":"1182932927", "numofapproved":"1", "id":"3621"}, {"last_update":"1183115054", "numofapproved":"1", "id":"3784"}, {"last_update":"1180000741", "numofapproved":"1", "id":"1647"}, {"last_update":"1181292582", "numofapproved":"1", "id":"2621"}, {"last_update":"1184181581", "numofapproved":"1", "id":"4641"}, {"last_update":"1185280501", "numofapproved":"1", "id":"5301"}, {"last_update":"1185471699", "numofapproved":"1", "id":"5561"}, {"last_update":"1185542771", "numofapproved":"1", "id":"5701"}, {"last_update":"1186650650", "numofapproved":"1", "id":"6361"}, {"last_update":"1186951065", "numofapproved":"1", "id":"6461"}, {"last_update":"1187769080", "numofapproved":"1", "id":"7221"}, {"last_update":"1187887905", "numofapproved":"1", "id":"7348"}, {"last_update":"1188001607", "numofapproved":"1", "id":"7423"}, {"last_update":"1188463414", "numofapproved":"1", "id":"7762"}, {"last_update":"1188555813", "numofapproved":"1", "id":"7861"}, {"last_update":"1188634622", "numofapproved":"1", "id":"7921"}, {"last_update":"1189543954", "numofapproved":"1", "id":"8841"}, {"last_update":"1177511009", "numofapproved":"1", "id":"1043"}, {"last_update":"1181898808", "numofapproved":"1", "id":"3081"}, {"last_update":"1182247483", "numofapproved":"1", "id":"3221"}, {"last_update":"1187024005", "numofapproved":"1", "id":"6562"}, {"last_update":"1189839471", "numofapproved":"1", "id":"9081"}, {"last_update":"1190018380", "numofapproved":"1", "id":"9241"}, {"last_update":"1190149586", "numofapproved":"1", "id":"9401"}, {"last_update":"1190652684", "numofapproved":"1", "id":"9981"}, {"last_update":"1190662296", "numofapproved":"1", "id":"10022"}, {"last_update":"1190813509", "numofapproved":"1", "id":"10281"}, {"last_update":"1190826005", "numofapproved":"1", "id":"10403"}, {"last_update":"1190991166", "numofapproved":"1", "id":"10722"}, {"last_update":"1191057700", "numofapproved":"1", "id":"10801"}, {"last_update":"1191161241", "numofapproved":"1", "id":"10821"}, {"last_update":"1191227885", "numofapproved":"1", "id":"10941"}, {"last_update":"1182537005", "numofapproved":"1", "id":"3481"}, {"last_update":"1185018401", "numofapproved":"1", "id":"5162"}, {"last_update":"1186752963", "numofapproved":"1", "id":"6386"}, {"last_update":"1190660077", "numofapproved":"1", "id":"10001"}, {"last_update":"1191319062", "numofapproved":"1", "id":"10981"}, {"last_update":"1191446097", "numofapproved":"1", "id":"11161"}, {"last_update":"1191446587", "numofapproved":"1", "id":"11184"}, {"last_update":"1191470824", "numofapproved":"1", "id":"11221"}, {"last_update":"1191526821", "numofapproved":"1", "id":"11401"}, {"last_update":"1191585471", "numofapproved":"1", "id":"11561"}, {"last_update":"1191602213", "numofapproved":"1", "id":"11701"}, {"last_update":"1191845720", "numofapproved":"1", "id":"11821"}, {"last_update":"1191933874", "numofapproved":"1", "id":"11902"}, {"last_update":"1191933897", "numofapproved":"1", "id":"11903"}, {"last_update":"1177673238", "numofapproved":"1", "id":"1161"}, {"last_update":"1181601542", "numofapproved":"1", "id":"2781"}, {"last_update":"1182869532", "numofapproved":"1", "id":"3583"}, {"last_update":"1183315879", "numofapproved":"1", "id":"3881"}, {"last_update":"1187097870", "numofapproved":"1", "id":"6641"}, {"last_update":"1190148660", "numofapproved":"1", "id":"9361"}, {"last_update":"1192248648", "numofapproved":"1", "id":"12521"}, {"last_update":"1192702958", "numofapproved":"1", "id":"13001"}, {"last_update":"1193387721", "numofapproved":"1", "id":"13981"}, {"last_update":"1193391276", "numofapproved":"1", "id":"14021"}, {"last_update":"1193397051", "numofapproved":"1", "id":"14061"}, {"last_update":"1193592081", "numofapproved":"1", "id":"14321"}, {"last_update":"1188474438", "numofapproved":"1", "id":"7821"}, {"last_update":"1190158372", "numofapproved":"1", "id":"9441"}, {"last_update":"1193648459", "numofapproved":"1", "id":"14361"}, {"last_update":"1193999834", "numofapproved":"1", "id":"14681"}, {"last_update":"1194200119", "numofapproved":"1", "id":"14861"}, {"last_update":"1194528747", "numofapproved":"1", "id":"15111"}, {"last_update":"1179150787", "numofapproved":"1", "id":"1384"}, {"last_update":"1179266496", "numofapproved":"1", "id":"1390"}, {"last_update":"1179508139", "numofapproved":"1", "id":"1501"}, {"last_update":"1179842157", "numofapproved":"1", "id":"1664"}, {"last_update":"1179842347", "numofapproved":"1", "id":"1668"}, {"last_update":"1181245388", "numofapproved":"1", "id":"2562"}, {"last_update":"1181311044", "numofapproved":"1", "id":"2661"}, {"last_update":"1181545818", "numofapproved":"1", "id":"2701"}, {"last_update":"1181934881", "numofapproved":"1", "id":"3103"}, {"last_update":"1187020798", "numofapproved":"1", "id":"6541"}, {"last_update":"1187271377", "numofapproved":"1", "id":"6801"}, {"last_update":"1196086904", "numofapproved":"1", "id":"17545"}, {"last_update":"1196266437", "numofapproved":"2", "id":"17662"}, {"last_update":"1196266638", "numofapproved":"2", "id":"17663"}, {"last_update":"1197533251", "numofapproved":"1", "id":"17901"}, {"last_update":"1197533384", "numofapproved":"1", "id":"17923"}, {"last_update":"1197556776", "numofapproved":"2", "id":"17941"}, {"last_update":"1200059354", "numofapproved":"1", "id":"17981"}, {"last_update":"1200576144", "numofapproved":"1", "id":"18001"}, {"last_update":"1200576230", "numofapproved":"1", "id":"18002"}, {"last_update":"1200657266", "numofapproved":"1", "id":"18041"}, {"last_update":"1201510556", "numofapproved":"1", "id":"18061"}, {"last_update":"1196087136", "numofapproved":"1", "id":"17546"}, {"last_update":"1196087269", "numofapproved":"1", "id":"17547"}, {"last_update":"1196087335", "numofapproved":"1", "id":"17548"}, {"last_update":"1196087379", "numofapproved":"1", "id":"17549"}, {"last_update":"1196087427", "numofapproved":"1", "id":"17550"}, {"last_update":"1196096347", "numofapproved":"1", "id":"17581"}, {"last_update":"1196265997", "numofapproved":"2", "id":"17661"}, {"last_update":"1196266785", "numofapproved":"1", "id":"17664"}, {"last_update":"1196270058", "numofapproved":"1", "id":"17701"}, {"last_update":"1196431875", "numofapproved":"1", "id":"17804"}, {"last_update":"1197635044", "numofapproved":"1", "id":"17961"}, {"last_update":"1202720206", "numofapproved":"2", "id":"18084"}, {"last_update":"1196267153", "numofapproved":"1", "id":"17681"}, {"last_update":"1196090749", "numofapproved":"1", "id":"17569"}, {"last_update":"1196162163", "numofapproved":"2", "id":"17641"}, {"last_update":"1196345846", "numofapproved":"1", "id":"17721"}, {"last_update":"1196088254", "numofapproved":"1", "id":"17552"}, {"last_update":"1196088437", "numofapproved":"1", "id":"17564"}, {"last_update":"1196088477", "numofapproved":"1", "id":"17565"}, {"last_update":"1196088537", "numofapproved":"1", "id":"17566"}, {"last_update":"1196088894", "numofapproved":"1", "id":"17567"}, {"last_update":"1196090414", "numofapproved":"1", "id":"17554"}, {"last_update":"1196097621", "numofapproved":"1", "id":"17601"}, {"last_update":"1196097710", "numofapproved":"1", "id":"17602"}, {"last_update":"1196098047", "numofapproved":"1", "id":"17603"}, {"last_update":"1196358376", "numofapproved":"2", "id":"17761"}, {"last_update":"1196358647", "numofapproved":"1", "id":"17762"}, {"last_update":"1196427604", "numofapproved":"1", "id":"17781"}, {"last_update":"1196429856", "numofapproved":"1", "id":"17782"}, {"last_update":"1196431068", "numofapproved":"2", "id":"17783"}, {"last_update":"1196435953", "numofapproved":"2", "id":"17821"}, {"last_update":"1204027277", "numofapproved":"1", "id":"18104"}, {"last_update":"1196090201", "numofapproved":"1", "id":"17553"}, {"last_update":"1196097095", "numofapproved":"1", "id":"17582"}, {"last_update":"1196097215", "numofapproved":"1", "id":"17583"}, {"last_update":"1196430140", "numofapproved":"2", "id":"17803"}, {"last_update":"1196436411", "numofapproved":"2", "id":"17841"}, {"last_update":"1196692298", "numofapproved":"1", "id":"17861"}, {"last_update":"1196692342", "numofapproved":"2", "id":"17862"}, {"last_update":"1196695231", "numofapproved":"2", "id":"17865"}, {"last_update":"1197533316", "numofapproved":"1", "id":"17921"}, {"last_update":"1201512744", "numofapproved":"1", "id":"18082"}, {"last_update":"1201513438", "numofapproved":"2", "id":"18083"}, {"last_update":"1196087540", "numofapproved":"1", "id":"17551"}, {"last_update":"1196156416", "numofapproved":"2", "id":"17621"}, {"last_update":"1196356717", "numofapproved":"1", "id":"17741"}, {"last_update":"1196428544", "numofapproved":"2", "id":"17801"}, {"last_update":"1196429000", "numofapproved":"2", "id":"17802"}, {"last_update":"1196692578", "numofapproved":"1", "id":"17863"}, {"last_update":"1196693445", "numofapproved":"2", "id":"17881"}, {"last_update":"1196693804", "numofapproved":"2", "id":"17864"}, {"last_update":"1197533347", "numofapproved":"1", "id":"17922"}, {"last_update":"1200591782", "numofapproved":"1", "id":"18021"}, {"last_update":"1201510930", "numofapproved":"1", "id":"18081"}, {"last_update":"1192432005", "numofapproved":"1", "id":"12582"}, {"last_update":"1192614291", "numofapproved":"1", "id":"12805"}, {"last_update":"1192624421", "numofapproved":"1", "id":"12806"}, {"last_update":"1192983623", "numofapproved":"1", "id":"13221"}, {"last_update":"1193043248", "numofapproved":"1", "id":"13282"}, {"last_update":"1193223892", "numofapproved":"1", "id":"13562"}, {"last_update":"1193239943", "numofapproved":"1", "id":"13601"}, {"last_update":"1193385960", "numofapproved":"1", "id":"13961"}, {"last_update":"1193386863", "numofapproved":"1", "id":"13945"}, {"last_update":"1193399770", "numofapproved":"1", "id":"14042"}, {"last_update":"1193417684", "numofapproved":"1", "id":"14181"}, {"last_update":"1193458402", "numofapproved":"1", "id":"14261"}, {"last_update":"1193555071", "numofapproved":"1", "id":"14301"}, {"last_update":"1185285506", "numofapproved":"1", "id":"5321"}, {"last_update":"1188250869", "numofapproved":"1", "id":"7521"}, {"last_update":"1191410480", "numofapproved":"1", "id":"11061"}, {"last_update":"1193763056", "numofapproved":"1", "id":"14482"}, {"last_update":"1193913886", "numofapproved":"1", "id":"14542"}, {"last_update":"1194366001", "numofapproved":"1", "id":"14890"}, {"last_update":"1194454607", "numofapproved":"1", "id":"15105"}, {"last_update":"1194255904", "numofapproved":"1", "id":"14941"}, {"last_update":"1179328986", "numofapproved":"1", "id":"1395"}, {"last_update":"1180377628", "numofapproved":"1", "id":"1861"}, {"last_update":"1181250011", "numofapproved":"1", "id":"2563"}, {"last_update":"1181572386", "numofapproved":"1", "id":"2741"}, {"last_update":"1183967114", "numofapproved":"1", "id":"4381"}, {"last_update":"1192512712", "numofapproved":"1", "id":"12623"}, {"last_update":"1193172621", "numofapproved":"1", "id":"13522"}, {"last_update":"1193868932", "numofapproved":"1", "id":"14523"}, {"last_update":"1194980345", "numofapproved":"1", "id":"16301"}, {"last_update":"1182280312", "numofapproved":"1", "id":"3282"}, {"last_update":"1184058726", "numofapproved":"1", "id":"4542"}, {"last_update":"1188829875", "numofapproved":"1", "id":"8161"}, {"last_update":"1190129857", "numofapproved":"1", "id":"9341"}, {"last_update":"1190652687", "numofapproved":"1", "id":"9982"}, {"last_update":"1193389082", "numofapproved":"1", "id":"13956"}, {"last_update":"1195400591", "numofapproved":"1", "id":"17121"}, {"last_update":"1184420846", "numofapproved":"1", "id":"4882"}, {"last_update":"1184532219", "numofapproved":"1", "id":"4903"}, {"last_update":"1192030476", "numofapproved":"1", "id":"12101"}, {"last_update":"1192202239", "numofapproved":"1", "id":"12461"}, {"last_update":"1192688302", "numofapproved":"1", "id":"12961"}, {"last_update":"1192703266", "numofapproved":"1", "id":"13021"}, {"last_update":"1193387096", "numofapproved":"1", "id":"13948"}, {"last_update":"1193387200", "numofapproved":"1", "id":"13949"}, {"last_update":"1193909837", "numofapproved":"1", "id":"14528"}, {"last_update":"1181062093", "numofapproved":"1", "id":"2301"}, {"last_update":"1182364431", "numofapproved":"1", "id":"3348"}, {"last_update":"1182364589", "numofapproved":"1", "id":"3349"}, {"last_update":"1184942429", "numofapproved":"1", "id":"5101"}, {"last_update":"1192682522", "numofapproved":"1", "id":"12901"}, {"last_update":"1184756287", "numofapproved":"1", "id":"4944"}, {"last_update":"1190274411", "numofapproved":"1", "id":"9541"}, {"last_update":"1193324229", "numofapproved":"1", "id":"13861"}, {"last_update":"1195163999", "numofapproved":"1", "id":"16861"}, {"last_update":"1181553321", "numofapproved":"1", "id":"2721"}, {"last_update":"1178869453", "numofapproved":"1", "id":"1361"}, {"last_update":"1181219788", "numofapproved":"1", "id":"2481"}, {"last_update":"1178140002", "numofapproved":"1", "id":"1205"}, {"last_update":"1178716891", "numofapproved":"1", "id":"1345"}, {"last_update":"1180691957", "numofapproved":"1", "id":"2061"}, {"last_update":"1182246242", "numofapproved":"1", "id":"3206"}, {"last_update":"1182882314", "numofapproved":"1", "id":"3585"}, {"last_update":"1183124192", "numofapproved":"1", "id":"3821"}, {"last_update":"1183905634", "numofapproved":"1", "id":"4361"}, {"last_update":"1191225755", "numofapproved":"1", "id":"10901"}, {"last_update":"1192635977", "numofapproved":"1", "id":"12881"}, {"last_update":"1193268752", "numofapproved":"1", "id":"13721"}, {"last_update":"1193242245", "numofapproved":"1", "id":"13621"}, {"last_update":"1193949751", "numofapproved":"1", "id":"14621"}, {"last_update":"1194635892", "numofapproved":"1", "id":"15621"}, {"last_update":"1194726918", "numofapproved":"1", "id":"15664"}, {"last_update":"1194726371", "numofapproved":"1", "id":"15662"}, {"last_update":"1194858043", "numofapproved":"1", "id":"15781"}, {"last_update":"1194946522", "numofapproved":"1", "id":"16101"}, {"last_update":"1195047359", "numofapproved":"1", "id":"16521"}, {"last_update":"1195050812", "numofapproved":"1", "id":"16503"}, {"last_update":"1195058811", "numofapproved":"1", "id":"16621"}, {"last_update":"1195476161", "numofapproved":"1", "id":"17241"}, {"last_update":"1178645683", "numofapproved":"1", "id":"1305"}, {"last_update":"1183118619", "numofapproved":"1", "id":"3801"}, {"last_update":"1186150376", "numofapproved":"1", "id":"6121"}, {"last_update":"1189114226", "numofapproved":"1", "id":"8501"}, {"last_update":"1190973079", "numofapproved":"1", "id":"10666"}, {"last_update":"1190990329", "numofapproved":"1", "id":"10704"}, {"last_update":"1191508485", "numofapproved":"1", "id":"11361"}, {"last_update":"1183054560", "numofapproved":"1", "id":"3721"}, {"last_update":"1185263889", "numofapproved":"1", "id":"5241"}, {"last_update":"1187876083", "numofapproved":"1", "id":"7346"}, {"last_update":"1189550218", "numofapproved":"1", "id":"8861"}, {"last_update":"1190800088", "numofapproved":"1", "id":"10221"}, {"last_update":"1193260528", "numofapproved":"1", "id":"13661"}, {"last_update":"1172509002", "numofapproved":"1", "id":"199"}, {"last_update":"1172509846", "numofapproved":"1", "id":"200"}, {"last_update":"1172589855", "numofapproved":"1", "id":"214"}, {"last_update":"1172847322", "numofapproved":"1", "id":"236"}, {"last_update":"1172847433", "numofapproved":"1", "id":"242"}, {"last_update":"1173607050", "numofapproved":"1", "id":"283"}, {"last_update":"1173703535", "numofapproved":"1", "id":"301"}, {"last_update":"1173719825", "numofapproved":"1", "id":"302"}, {"last_update":"1174414845", "numofapproved":"1", "id":"403"}, {"last_update":"1174650542", "numofapproved":"1", "id":"441"}, {"last_update":"1171475944", "numofapproved":"1", "id":"52"}, {"last_update":"1172746278", "numofapproved":"1", "id":"231"}, {"last_update":"1173251095", "numofapproved":"1", "id":"254"}, {"last_update":"1173259501", "numofapproved":"1", "id":"255"}, {"last_update":"1174899183", "numofapproved":"1", "id":"495"}, {"last_update":"1174924714", "numofapproved":"1", "id":"524"}, {"last_update":"1171962179", "numofapproved":"1", "id":"108"}, {"last_update":"1172522401", "numofapproved":"1", "id":"205"}, {"last_update":"1174299349", "numofapproved":"1", "id":"362"}, {"last_update":"1174899291", "numofapproved":"1", "id":"500"}, {"last_update":"1175617661", "numofapproved":"1", "id":"688"}, {"last_update":"1176302948", "numofapproved":"1", "id":"881"}, {"last_update":"1176467393", "numofapproved":"1", "id":"893"}, {"last_update":"1176737599", "numofapproved":"1", "id":"982"}, {"last_update":"1171465517", "numofapproved":"1", "id":"50"}, {"last_update":"1171924670", "numofapproved":"1", "id":"107"}, {"last_update":"1173880505", "numofapproved":"1", "id":"317"}, {"last_update":"1173889350", "numofapproved":"1", "id":"329"}, {"last_update":"1173889557", "numofapproved":"1", "id":"332"}, {"last_update":"1176391285", "numofapproved":"1", "id":"892"}, {"last_update":"1176673529", "numofapproved":"1", "id":"981"}, {"last_update":"1171643442", "numofapproved":"1", "id":"69"}, {"last_update":"1172226841", "numofapproved":"1", "id":"182"}, {"last_update":"1174899475", "numofapproved":"1", "id":"506"}, {"last_update":"1174915327", "numofapproved":"1", "id":"521"}, {"last_update":"1176194461", "numofapproved":"1", "id":"821"}, {"last_update":"1172013837", "numofapproved":"1", "id":"132"}, {"last_update":"1172184974", "numofapproved":"1", "id":"177"}, {"last_update":"1175777908", "numofapproved":"1", "id":"674"}, {"last_update":"1173460745", "numofapproved":"1", "id":"281"}, {"last_update":"1174401746", "numofapproved":"1", "id":"402"}, {"last_update":"1171274691", "numofapproved":"1", "id":"5"}, {"last_update":"1171799314", "numofapproved":"1", "id":"78"}, {"last_update":"1171979089", "numofapproved":"1", "id":"127"}, {"last_update":"1172503571", "numofapproved":"1", "id":"197"}, {"last_update":"1174301365", "numofapproved":"1", "id":"391"}, {"last_update":"1174301259", "numofapproved":"1", "id":"385"}, {"last_update":"1174899163", "numofapproved":"1", "id":"494"}, {"last_update":"1174933167", "numofapproved":"1", "id":"534"}, {"last_update":"1176139704", "numofapproved":"1", "id":"808"}, {"last_update":"1175502855", "numofapproved":"1", "id":"603"}, {"last_update":"1173721122", "numofapproved":"1", "id":"303"}, {"last_update":"1173809079", "numofapproved":"1", "id":"311"}, {"last_update":"1174734352", "numofapproved":"1", "id":"461"}, {"last_update":"1174898917", "numofapproved":"1", "id":"482"}, {"last_update":"1174899374", "numofapproved":"1", "id":"503"}, {"last_update":"1176392495", "numofapproved":"1", "id":"903"}, {"last_update":"1176829535", "numofapproved":"1", "id":"987"}, {"last_update":"1173889385", "numofapproved":"1", "id":"330"}, {"last_update":"1175869070", "numofapproved":"1", "id":"783"}, {"last_update":"1177510634", "numofapproved":"1", "id":"1042"}, {"last_update":"1177585810", "numofapproved":"1", "id":"1062"}, {"last_update":"1178648303", "numofapproved":"1", "id":"1309"}, {"last_update":"1178883682", "numofapproved":"1", "id":"1363"}, {"last_update":"1179239792", "numofapproved":"1", "id":"1402"}, {"last_update":"1179997715", "numofapproved":"1", "id":"1644"}, {"last_update":"1180031289", "numofapproved":"1", "id":"1654"}, {"last_update":"1180440758", "numofapproved":"1", "id":"1921"}, {"last_update":"1180972413", "numofapproved":"1", "id":"2221"}, {"last_update":"1181032741", "numofapproved":"1", "id":"2261"}, {"last_update":"1181198104", "numofapproved":"1", "id":"2401"}, {"last_update":"1181237541", "numofapproved":"1", "id":"2581"}, {"last_update":"1181293731", "numofapproved":"1", "id":"2641"}, {"last_update":"1182231158", "numofapproved":"1", "id":"3204"}, {"last_update":"1177668412", "numofapproved":"1", "id":"1121"}, {"last_update":"1178713554", "numofapproved":"1", "id":"1342"}, {"last_update":"1179239886", "numofapproved":"1", "id":"1404"}, {"last_update":"1184766561", "numofapproved":"1", "id":"4961"}, {"last_update":"1185293883", "numofapproved":"1", "id":"5341"}, {"last_update":"1185781181", "numofapproved":"1", "id":"5761"}, {"last_update":"1185898126", "numofapproved":"1", "id":"5862"}, {"last_update":"1186290486", "numofapproved":"1", "id":"6164"}, {"last_update":"1186260193", "numofapproved":"1", "id":"6162"}, {"last_update":"1186305362", "numofapproved":"1", "id":"6201"}, {"last_update":"1187024035", "numofapproved":"1", "id":"6563"}, {"last_update":"1187245873", "numofapproved":"1", "id":"6761"}, {"last_update":"1187765176", "numofapproved":"1", "id":"7142"}, {"last_update":"1187872548", "numofapproved":"1", "id":"7343"}, {"last_update":"1188774634", "numofapproved":"1", "id":"8061"}, {"last_update":"1188838929", "numofapproved":"1", "id":"8181"}, {"last_update":"1189608461", "numofapproved":"1", "id":"8881"}, {"last_update":"1189667694", "numofapproved":"1", "id":"8921"}, {"last_update":"1179747423", "numofapproved":"1", "id":"1541"}, {"last_update":"1181142187", "numofapproved":"1", "id":"2381"}, {"last_update":"1185965227", "numofapproved":"1", "id":"5921"}, {"last_update":"1190476977", "numofapproved":"1", "id":"9761"}, {"last_update":"1190648889", "numofapproved":"1", "id":"9961"}, {"last_update":"1190824195", "numofapproved":"1", "id":"10381"}, {"last_update":"1190825530", "numofapproved":"1", "id":"10401"}, {"last_update":"1190894398", "numofapproved":"1", "id":"10501"}, {"last_update":"1178271031", "numofapproved":"1", "id":"1242"}, {"last_update":"1178878052", "numofapproved":"1", "id":"1359"}, {"last_update":"1178967516", "numofapproved":"1", "id":"1364"}, {"last_update":"1180018261", "numofapproved":"1", "id":"1652"}, {"last_update":"1180107922", "numofapproved":"1", "id":"1841"}, {"last_update":"1180514196", "numofapproved":"1", "id":"1941"}, {"last_update":"1181901023", "numofapproved":"1", "id":"3082"}, {"last_update":"1182417878", "numofapproved":"1", "id":"3361"}, {"last_update":"1182785340", "numofapproved":"1", "id":"3521"}, {"last_update":"1183485766", "numofapproved":"1", "id":"4101"}, {"last_update":"1189526136", "numofapproved":"1", "id":"8803"}, {"last_update":"1191446636", "numofapproved":"1", "id":"11185"}, {"last_update":"1191489743", "numofapproved":"1", "id":"11241"}, {"last_update":"1191903141", "numofapproved":"1", "id":"11882"}, {"last_update":"1191940049", "numofapproved":"1", "id":"11941"}, {"last_update":"1179239857", "numofapproved":"1", "id":"1403"}, {"last_update":"1185799202", "numofapproved":"1", "id":"5801"}, {"last_update":"1190924823", "numofapproved":"1", "id":"10562"}, {"last_update":"1191410783", "numofapproved":"1", "id":"11065"}, {"last_update":"1192031578", "numofapproved":"1", "id":"12121"}, {"last_update":"1192431234", "numofapproved":"1", "id":"12562"}, {"last_update":"1192609228", "numofapproved":"1", "id":"12802"}, {"last_update":"1192742243", "numofapproved":"1", "id":"13161"}, {"last_update":"1192942532", "numofapproved":"1", "id":"13201"}, {"last_update":"1193386303", "numofapproved":"1", "id":"13962"}, {"last_update":"1193406158", "numofapproved":"1", "id":"14121"}, {"last_update":"1193418273", "numofapproved":"1", "id":"14201"}, {"last_update":"1193519213", "numofapproved":"1", "id":"14281"}, {"last_update":"1193666593", "numofapproved":"1", "id":"14401"}, {"last_update":"1193733296", "numofapproved":"1", "id":"14421"}, {"last_update":"1193760981", "numofapproved":"1", "id":"14481"}, {"last_update":"1182436569", "numofapproved":"1", "id":"3422"}, {"last_update":"1184012598", "numofapproved":"1", "id":"4481"}, {"last_update":"1189715279", "numofapproved":"1", "id":"8981"}, {"last_update":"1192528903", "numofapproved":"1", "id":"12701"}, {"last_update":"1194246273", "numofapproved":"1", "id":"14901"}, {"last_update":"1194354217", "numofapproved":"1", "id":"14888"}, {"last_update":"1194366787", "numofapproved":"1", "id":"14891"}, {"last_update":"1194445768", "numofapproved":"1", "id":"15104"}, {"last_update":"1194467580", "numofapproved":"1", "id":"15107"}, {"last_update":"1194508237", "numofapproved":"1", "id":"15262"}, {"last_update":"1194635341", "numofapproved":"1", "id":"15581"}, {"last_update":"1194635508", "numofapproved":"1", "id":"15582"}, {"last_update":"1179214538", "numofapproved":"1", "id":"1386"}, {"last_update":"1186433530", "numofapproved":"1", "id":"6167"}, {"last_update":"1187853435", "numofapproved":"1", "id":"7321"}, {"last_update":"1187972012", "numofapproved":"1", "id":"7421"}, {"last_update":"1188895906", "numofapproved":"1", "id":"8201"}, {"last_update":"1190284020", "numofapproved":"1", "id":"9561"}, {"last_update":"1190924163", "numofapproved":"1", "id":"10561"}, {"last_update":"1192529770", "numofapproved":"1", "id":"12663"}, {"last_update":"1192536538", "numofapproved":"1", "id":"12666"}, {"last_update":"1193269090", "numofapproved":"1", "id":"13741"}, {"last_update":"1193428819", "numofapproved":"1", "id":"14221"}, {"last_update":"1193860091", "numofapproved":"1", "id":"14521"}, {"last_update":"1193909426", "numofapproved":"1", "id":"14526"}, {"last_update":"1194533708", "numofapproved":"1", "id":"15321"}, {"last_update":"1179822723", "numofapproved":"1", "id":"1601"}, {"last_update":"1179842248", "numofapproved":"1", "id":"1666"}, {"last_update":"1182412362", "numofapproved":"1", "id":"3352"}, {"last_update":"1185980065", "numofapproved":"1", "id":"5961"}, {"last_update":"1186751100", "numofapproved":"1", "id":"6385"}, {"last_update":"1187202714", "numofapproved":"1", "id":"6721"}, {"last_update":"1187601864", "numofapproved":"1", "id":"6923"}, {"last_update":"1191490727", "numofapproved":"1", "id":"11281"}, {"last_update":"1194449840", "numofapproved":"1", "id":"15161"}, {"last_update":"1180028166", "numofapproved":"1", "id":"1781"}, {"last_update":"1185025939", "numofapproved":"1", "id":"5201"}, {"last_update":"1192454400", "numofapproved":"1", "id":"12621"}, {"last_update":"1193414234", "numofapproved":"1", "id":"14141"}, {"last_update":"1194270682", "numofapproved":"1", "id":"14961"}, {"last_update":"1184061669", "numofapproved":"1", "id":"4561"}, {"last_update":"1186161284", "numofapproved":"1", "id":"6141"}, {"last_update":"1187714492", "numofapproved":"1", "id":"7061"}, {"last_update":"1187893562", "numofapproved":"1", "id":"7361"}, {"last_update":"1190815311", "numofapproved":"1", "id":"10301"}, {"last_update":"1193388120", "numofapproved":"1", "id":"13951"}, {"last_update":"1195239956", "numofapproved":"1", "id":"17041"}, {"last_update":"1179147467", "numofapproved":"1", "id":"1381"}, {"last_update":"1182346611", "numofapproved":"1", "id":"3341"}, {"last_update":"1184267506", "numofapproved":"1", "id":"4802"}, {"last_update":"1192047087", "numofapproved":"1", "id":"12161"}, {"last_update":"1192198948", "numofapproved":"1", "id":"12441"}, {"last_update":"1193208717", "numofapproved":"1", "id":"13528"}, {"last_update":"1194907182", "numofapproved":"1", "id":"16001"}, {"last_update":"1179153020", "numofapproved":"1", "id":"1385"}, {"last_update":"1179835655", "numofapproved":"1", "id":"1641"}, {"last_update":"1181234739", "numofapproved":"1", "id":"2542"}, {"last_update":"1182356477", "numofapproved":"1", "id":"3343"}, {"last_update":"1182418583", "numofapproved":"1", "id":"3381"}, {"last_update":"1184568502", "numofapproved":"1", "id":"4905"}, {"last_update":"1189151603", "numofapproved":"1", "id":"8581"}, {"last_update":"1191595695", "numofapproved":"1", "id":"11621"}, {"last_update":"1193105000", "numofapproved":"1", "id":"13421"}, {"last_update":"1195104657", "numofapproved":"1", "id":"16701"}], "request_timestamp":1206363392.08521, "request_call":"requestDetails", "instance":"tbedi", "call_time":"0.10059", "request_date":"2008-03-2412:56:32 UTC", "request_url":"http://cmsdoc.cern.ch/cms/test/aprom/phedex/dev/gowri/datasvc/tbedi/requestDetails?format=json"}} """ from jsonParser import jsonObject data = jsonObject.parseString(s) #~ from pprint import pprint #~ pprint( data[0].asList() ) #~ print #~ print data.dump() print(data.phedex.call_time) print(data.phedex.instance) print(data.phedex.request_call) print(len(data.phedex.request)) for req in data.phedex.request[:10]: #~ print req.dump() print("-", req.id, req.last_update) pyparsing-2.0.3/examples/stackish.py0000664000175000017500000000567012171425201016556 0ustar barrybarry# stackish.py # # Stackish is a data representation syntax, similar to JSON or YAML. For more info on # stackish, see http://www.savingtheinternetwithhate.com/stackish.html # # Copyright 2008, Paul McGuire # """ NUMBER A simple integer type that's just any series of digits. FLOAT A simple floating point type. STRING A string is double quotes with anything inside that's not a " or newline character. You can include \n and \" to include these characters. MARK Marks a point in the stack that demarcates the boundary for a nested group. WORD Marks the root node of a group, with the other end being the nearest MARK. GROUP Acts as the root node of an anonymous group. ATTRIBUTE Assigns an attribute name to the previously processed node. This means that just about anything can be an attribute, unlike in XML. BLOB A BLOB is unique to Stackish and allows you to record any content (even binary content) inside the structure. This is done by pre- sizing the data with the NUMBER similar to Dan Bernstein's netstrings setup. SPACE White space is basically ignored. This is interesting because since Stackish is serialized consistently this means you can use \n as the separation character and perform reasonable diffs on two structures. """ from pyparsing import Suppress,Word,nums,alphas,alphanums,Combine,oneOf,\ Optional,QuotedString,Forward,Group,ZeroOrMore,printables,srange MARK,UNMARK,AT,COLON,QUOTE = map(Suppress,"[]@:'") NUMBER = Word(nums) NUMBER.setParseAction(lambda t:int(t[0])) FLOAT = Combine(oneOf("+ -") + Word(nums) + "." + Optional(Word(nums))) FLOAT.setParseAction(lambda t:float(t[0])) STRING = QuotedString('"', multiline=True) WORD = Word(alphas,alphanums+"_:") ATTRIBUTE = Combine(AT + WORD) strBody = Forward() def setBodyLength(tokens): strBody << Word(srange(r'[\0x00-\0xffff]'), exact=int(tokens[0])) return "" BLOB = Combine(QUOTE + Word(nums).setParseAction(setBodyLength) + COLON + strBody + QUOTE) item = Forward() def assignUsing(s): def assignPA(tokens): if s in tokens: tokens[tokens[s]] = tokens[0] del tokens[s] return assignPA GROUP = (MARK + Group( ZeroOrMore( (item + Optional(ATTRIBUTE)("attr") ).setParseAction(assignUsing("attr")) ) ) + ( WORD("name") | UNMARK ) ).setParseAction(assignUsing("name")) item << (NUMBER | FLOAT | STRING | BLOB | GROUP ) tests = """\ [ '10:1234567890' @name 25 @age +0.45 @percentage person:zed [ [ "hello" 1 child root [ "child" [ 200 '4:like' "I" "hello" things root [ [ "data" [ 2 1 ] @numbers child root [ [ 1 2 3 ] @test 4 5 6 root """.splitlines() for test in tests: if test: print(test) print(item.parseString(test).dump()) print() pyparsing-2.0.3/examples/simpleWiki.py0000664000175000017500000000207212171425202017054 0ustar barrybarryfrom pyparsing import * wikiInput = """ Here is a simple Wiki input: *This is in italics.* **This is in bold!** ***This is in bold italics!*** Here's a URL to {{Pyparsing's Wiki Page->http://pyparsing.wikispaces.com}} """ def convertToHTML(opening,closing): def conversionParseAction(s,l,t): return opening + t[0] + closing return conversionParseAction italicized = QuotedString("*").setParseAction(convertToHTML("","")) bolded = QuotedString("**").setParseAction(convertToHTML("","")) boldItalicized = QuotedString("***").setParseAction(convertToHTML("","")) def convertToHTML_A(s,l,t): try: text,url=t[0].split("->") except ValueError: raise ParseFatalException(s,l,"invalid URL link reference: " + t[0]) return '%s' % (url,text) urlRef = QuotedString("{{",endQuoteChar="}}").setParseAction(convertToHTML_A) wikiMarkup = urlRef | boldItalicized | bolded | italicized print(wikiInput) print() print(wikiMarkup.transformString(wikiInput)) pyparsing-2.0.3/examples/shapes.py0000664000175000017500000000326312053623314016230 0ustar barrybarry# shapes.py # # A sample program showing how parse actions can convert parsed # strings into a data type or object. # # Copyright 2012, Paul T. McGuire # # define class hierarchy of Shape classes, with polymorphic area method class Shape(object): def __init__(self, tokens): self.__dict__.update(tokens.asDict()) def area(self): raise NotImplementedException() def __str__(self): return "<%s>: %s" % (self.__class__.__name__, self.__dict__) class Square(Shape): def area(self): return self.side**2 class Rectangle(Shape): def area(self): return self.width * self.height class Circle(Shape): def area(self): return 3.14159 * self.radius**2 from pyparsing import * number = Regex(r'-?\d+(\.\d*)?').setParseAction(lambda t:float(t[0])) # Shape expressions: # square : S # rectangle: R # circle : C squareDefn = "S" + number('centerx') + number('centery') + number('side') rectDefn = "R" + number('centerx') + number('centery') + number('width') + number('height') circleDefn = "C" + number('centerx') + number('centery') + number('diameter') squareDefn.setParseAction(Square) rectDefn.setParseAction(Rectangle) def computeRadius(tokens): tokens['radius'] = tokens.diameter/2.0 circleDefn.setParseAction(computeRadius, Circle) shapeExpr = squareDefn | rectDefn | circleDefn tests = """\ C 0 0 100 R 10 10 20 50 S -1 5 10""".splitlines() for t in tests: shape = shapeExpr.parseString(t)[0] print(shape) print("Area:", shape.area()) print() pyparsing-2.0.3/examples/pgn.py0000664000175000017500000000665212171425201015532 0ustar barrybarry# pgn.py rel. 1.1 17-sep-2004 # # Demonstration of the parsing module, implementing a pgn parser. # # The aim of this parser is not to support database application, # but to create automagically a pgn annotated reading the log console file # of a lecture of ICC (Internet Chess Club), saved by Blitzin. # Of course you can modify the Abstract Syntax Tree to your purpose. # # Copyright 2004, by Alberto Santini http://www.albertosantini.it/chess/ # from pyparsing import alphanums, nums, quotedString from pyparsing import Combine, Forward, Group, Literal, oneOf, OneOrMore, Optional, Suppress, ZeroOrMore, White, Word from pyparsing import ParseException # # define pgn grammar # tag = Suppress("[") + Word(alphanums) + Combine(quotedString) + Suppress("]") comment = Suppress("{") + Word(alphanums + " ") + Suppress("}") dot = Literal(".") piece = oneOf("K Q B N R") file_coord = oneOf("a b c d e f g h") rank_coord = oneOf("1 2 3 4 5 6 7 8") capture = oneOf("x :") promote = Literal("=") castle_queenside = Literal("O-O-O") | Literal("0-0-0") | Literal("o-o-o") castle_kingside = Literal("O-O") | Literal("0-0") | Literal("o-o") move_number = Optional(comment) + Word(nums) + dot m1 = file_coord + rank_coord # pawn move e.g. d4 m2 = file_coord + capture + file_coord + rank_coord # pawn capture move e.g. dxe5 m3 = file_coord + "8" + promote + piece # pawn promotion e.g. e8=Q m4 = piece + file_coord + rank_coord # piece move e.g. Be6 m5 = piece + file_coord + file_coord + rank_coord # piece move e.g. Nbd2 m6 = piece + rank_coord + file_coord + rank_coord # piece move e.g. R4a7 m7 = piece + capture + file_coord + rank_coord # piece capture move e.g. Bxh7 m8 = castle_queenside | castle_kingside # castling e.g. o-o check = oneOf("+ ++") mate = Literal("#") annotation = Word("!?", max=2) nag = " $" + Word(nums) decoration = check | mate | annotation | nag variant = Forward() half_move = Combine((m3 | m1 | m2 | m4 | m5 | m6 | m7 | m8) + Optional(decoration)) \ + Optional(comment) +Optional(variant) move = Suppress(move_number) + half_move + Optional(half_move) variant << "(" + OneOrMore(move) + ")" # grouping the plies (half-moves) for each move: useful to group annotations, variants... # suggested by Paul McGuire :) move = Group(Suppress(move_number) + half_move + Optional(half_move)) variant << Group("(" + OneOrMore(move) + ")") game_terminator = oneOf("1-0 0-1 1/2-1/2 *") pgnGrammar = Suppress(ZeroOrMore(tag)) + ZeroOrMore(move) + Optional(Suppress(game_terminator)) def parsePGN( pgn, bnf=pgnGrammar, fn=None ): try: return bnf.parseString( pgn ) except ParseException as err: print(err.line) print(" "*(err.column-1) + "^") print(err) if __name__ == "__main__": # input string pgn = """ [Event "ICC 5 0 u"] [Site "Internet Chess Club"] [Date "2004.01.25"] [Round "-"] [White "guest920"] [Black "IceBox"] [Result "0-1"] [ICCResult "White checkmated"] [BlackElo "1498"] [Opening "French defense"] [ECO "C00"] [NIC "FR.01"] [Time "04:44:56"] [TimeControl "300+0"] 1. e4 e6 2. Nf3 d5 $2 3. exd5 (3. e5 g6 4. h4) exd5 4. Qe2+ Qe7 5. Qxe7+ Bxe7 6. d3 Nf6 7. Be3 Bg4 8. Nbd2 c5 9. h3 Be6 10. O-O-O Nc6 11. g4 Bd6 12. g5 Nd7 13. Rg1 d4 14. g6 fxg6 15. Bg5 Rf8 16. a3 Bd5 17. Re1+ Nde5 18. Nxe5 Nxe5 19. Bf4 Rf5 20. Bxe5 Rxe5 21. Rg5 Rxe1# {Black wins} 0-1 """ # parse input string tokens = parsePGN(pgn, pgnGrammar) print("tokens = ", tokens) pyparsing-2.0.3/examples/indentedGrammarExample.py0000664000175000017500000000361012171425201021352 0ustar barrybarry# indentedGrammarExample.py # # Copyright (c) 2006, Paul McGuire # # A sample of a pyparsing grammar using indentation for # grouping (like Python does). # from pyparsing import * data = """\ def A(z): A1 B = 100 G = A2 A2 A3 B def BB(a,b,c): BB1 def BBA(): bba1 bba2 bba3 C D def spam(x,y): def eggs(z): pass """ indentStack = [1] def checkPeerIndent(s,l,t): curCol = col(l,s) if curCol != indentStack[-1]: if (not indentStack) or curCol > indentStack[-1]: raise ParseFatalException(s,l,"illegal nesting") raise ParseException(s,l,"not a peer entry") def checkSubIndent(s,l,t): curCol = col(l,s) if curCol > indentStack[-1]: indentStack.append( curCol ) else: raise ParseException(s,l,"not a subentry") def checkUnindent(s,l,t): if l >= len(s): return curCol = col(l,s) if not(curCol < indentStack[-1] and curCol <= indentStack[-2]): raise ParseException(s,l,"not an unindent") def doUnindent(): indentStack.pop() INDENT = lineEnd.suppress() + empty + empty.copy().setParseAction(checkSubIndent) UNDENT = FollowedBy(empty).setParseAction(checkUnindent) UNDENT.setParseAction(doUnindent) stmt = Forward() suite = Group( OneOrMore( empty + stmt.setParseAction( checkPeerIndent ) ) ) identifier = Word(alphas, alphanums) funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") funcDef = Group( funcDecl + INDENT + suite + UNDENT ) rvalue = Forward() funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") rvalue << (funcCall | identifier | Word(nums)) assignment = Group(identifier + "=" + rvalue) stmt << ( funcDef | assignment | identifier ) print(data) parseTree = suite.parseString(data) import pprint pprint.pprint( parseTree.asList() ) pyparsing-2.0.3/examples/protobuf_parser.py0000664000175000017500000000675512171425201020166 0ustar barrybarry# protobuf_parser.py # # simple parser for parsing protobuf .proto files # # Copyright 2010, Paul McGuire # from pyparsing import (Word, alphas, alphanums, Regex, Suppress, Forward, Group, oneOf, ZeroOrMore, Optional, delimitedList, Keyword, restOfLine, quotedString) ident = Word(alphas+"_",alphanums+"_").setName("identifier") integer = Regex(r"[+-]?\d+") LBRACE,RBRACE,LBRACK,RBRACK,LPAR,RPAR,EQ,SEMI = map(Suppress,"{}[]()=;") kwds = """message required optional repeated enum extensions extends extend to package service rpc returns true false option import""" for kw in kwds.split(): exec("%s_ = Keyword('%s')" % (kw.upper(), kw)) messageBody = Forward() messageDefn = MESSAGE_ - ident("messageId") + LBRACE + messageBody("body") + RBRACE typespec = oneOf("""double float int32 int64 uint32 uint64 sint32 sint64 fixed32 fixed64 sfixed32 sfixed64 bool string bytes""") | ident rvalue = integer | TRUE_ | FALSE_ | ident fieldDirective = LBRACK + Group(ident + EQ + rvalue) + RBRACK fieldDefn = (( REQUIRED_ | OPTIONAL_ | REPEATED_ )("fieldQualifier") - typespec("typespec") + ident("ident") + EQ + integer("fieldint") + ZeroOrMore(fieldDirective) + SEMI) # enumDefn ::= 'enum' ident '{' { ident '=' integer ';' }* '}' enumDefn = ENUM_ - ident + LBRACE + ZeroOrMore( Group(ident + EQ + integer + SEMI) ) + RBRACE # extensionsDefn ::= 'extensions' integer 'to' integer ';' extensionsDefn = EXTENSIONS_ - integer + TO_ + integer + SEMI # messageExtension ::= 'extend' ident '{' messageBody '}' messageExtension = EXTEND_ - ident + LBRACE + messageBody + RBRACE # messageBody ::= { fieldDefn | enumDefn | messageDefn | extensionsDefn | messageExtension }* messageBody << Group(ZeroOrMore( Group(fieldDefn | enumDefn | messageDefn | extensionsDefn | messageExtension) )) # methodDefn ::= 'rpc' ident '(' [ ident ] ')' 'returns' '(' [ ident ] ')' ';' methodDefn = (RPC_ - ident("methodName") + LPAR + Optional(ident("methodParam")) + RPAR + RETURNS_ + LPAR + Optional(ident("methodReturn")) + RPAR) # serviceDefn ::= 'service' ident '{' methodDefn* '}' serviceDefn = SERVICE_ - ident("serviceName") + LBRACE + ZeroOrMore(Group(methodDefn)) + RBRACE # packageDirective ::= 'package' ident [ '.' ident]* ';' packageDirective = Group(PACKAGE_ - delimitedList(ident, '.', combine=True) + SEMI) comment = '//' + restOfLine importDirective = IMPORT_ - quotedString("importFileSpec") + SEMI optionDirective = OPTION_ - ident("optionName") + EQ + quotedString("optionValue") + SEMI topLevelStatement = Group(messageDefn | messageExtension | enumDefn | serviceDefn | importDirective | optionDirective) parser = Optional(packageDirective) + ZeroOrMore(topLevelStatement) parser.ignore(comment) test1 = """message Person { required int32 id = 1; required string name = 2; optional string email = 3; }""" test2 = """package tutorial; message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } message AddressBook { repeated Person person = 1; }""" from pprint import pprint #~ print parser.parseString(test2, parseAll=True).dump() pprint( parser.parseString(test2, parseAll=True).asList()) pyparsing-2.0.3/examples/lucene_grammar.py0000664000175000017500000001623612171425201017726 0ustar barrybarry# # lucene_grammar.py # # Copyright 2011, Paul McGuire # # implementation of Lucene grammar, as decribed # at http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/docs/queryparsersyntax.html # from pyparsing import (Literal, CaselessKeyword, Forward, Regex, QuotedString, Suppress, Optional, Group, FollowedBy, operatorPrecedence, opAssoc, ParseException, ParserElement) ParserElement.enablePackrat() COLON,LBRACK,RBRACK,LBRACE,RBRACE,TILDE,CARAT = map(Literal,":[]{}~^") LPAR,RPAR = map(Suppress,"()") and_ = CaselessKeyword("AND") or_ = CaselessKeyword("OR") not_ = CaselessKeyword("NOT") to_ = CaselessKeyword("TO") keyword = and_ | or_ | not_ expression = Forward() valid_word = Regex(r'([a-zA-Z0-9*_+.-]|\\[!(){}\[\]^"~*?\\:])+').setName("word") valid_word.setParseAction( lambda t : t[0].replace('\\\\',chr(127)).replace('\\','').replace(chr(127),'\\') ) string = QuotedString('"') required_modifier = Literal("+")("required") prohibit_modifier = Literal("-")("prohibit") integer = Regex(r"\d+").setParseAction(lambda t:int(t[0])) proximity_modifier = Group(TILDE + integer("proximity")) number = Regex(r'\d+(\.\d+)?').setParseAction(lambda t:float(t[0])) fuzzy_modifier = TILDE + Optional(number, default=0.5)("fuzzy") term = Forward() field_name = valid_word.copy().setName("fieldname") incl_range_search = Group(LBRACK + term("lower") + to_ + term("upper") + RBRACK) excl_range_search = Group(LBRACE + term("lower") + to_ + term("upper") + RBRACE) range_search = incl_range_search("incl_range") | excl_range_search("excl_range") boost = (CARAT + number("boost")) string_expr = Group(string + proximity_modifier) | string word_expr = Group(valid_word + fuzzy_modifier) | valid_word term << (Optional(field_name("field") + COLON) + (word_expr | string_expr | range_search | Group(LPAR + expression + RPAR)) + Optional(boost)) term.setParseAction(lambda t:[t] if 'field' in t or 'boost' in t else None) expression << operatorPrecedence(term, [ (required_modifier | prohibit_modifier, 1, opAssoc.RIGHT), ((not_ | '!').setParseAction(lambda:"NOT"), 1, opAssoc.RIGHT), ((and_ | '&&').setParseAction(lambda:"AND"), 2, opAssoc.LEFT), (Optional(or_ | '||').setParseAction(lambda:"OR"), 2, opAssoc.LEFT), ]) # test strings taken from grammar description doc, and TestQueryParser.java tests = r""" a and b a and not b a and !b a && !b a&&!b name:a name:a and not title:b (a^100 c d f) and !z name:"blah de blah" title:(+return +"pink panther") title:"The Right Way" AND text:go title:"Do it right" AND right title:Do it right roam~ roam~0.8 "jakarta apache"~10 mod_date:[20020101 TO 20030101] title:{Aida TO Carmen} jakarta apache jakarta^4 apache "jakarta apache"^4 "Apache Lucene" "jakarta apache" jakarta "jakarta apache" OR jakarta "jakarta apache" AND "Apache Lucene" +jakarta lucene "jakarta apache" NOT "Apache Lucene" "jakarta apache" -"Apache Lucene" (jakarta OR apache) AND website \(1+1\)\:2 c\:\\windows (fieldX:xxxxx OR fieldy:xxxxxxxx)^2 AND (fieldx:the OR fieldy:foo) (fieldX:xxxxx fieldy:xxxxxxxx)^2 AND (fieldx:the fieldy:foo) (fieldX:xxxxx~0.5 fieldy:xxxxxxxx)^2 AND (fieldx:the fieldy:foo) +term -term term foo:term AND field:anotherTerm germ term^2.0 (term)^2.0 (foo OR bar) AND (baz OR boo) +(apple \"steve jobs\") -(foo bar baz) +title:(dog OR cat) -author:\"bob dole\" a AND b +a +b (a AND b) c OR (a AND b) c (+a +b) a AND NOT b +a -b a AND -b a AND !b a && b a && ! b a OR b a b a || b a OR !b a -b a OR ! b a OR -b a - b a + b a ! b +foo:term +anotherterm hello term^2.0 (germ term)^2.0 term^2 +(foo bar) +(baz boo) ((a OR b) AND NOT c) OR d (+(a b) -c) d field a&&b .NET term germ 3 term 1.0 1 2 term term1 term2 term term term term* term*^2 term*^2.0 term~ term~2.0 term~0.7 term~^3 term~2.0^3.0 term*germ term*germ^3 term*germ^3.0 term~1.1 [A TO C] t*erm* *term* term term^3.0 term term stop^3.0 term term +stop term term -stop term drop AND (stop) AND roll +drop +roll term +(stop) term term -(stop) term drop AND stop AND roll term phrase term term (phrase1 phrase2) term term AND NOT phrase term +term -(phrase1 phrase2) term stop^3 stop (stop)^3 ((stop))^3 (stop^3) ((stop)^3) (stop) ((stop)) term +stop [ a TO z] [a TO z] [ a TO z ] { a TO z} {a TO z} { a TO z } { a TO z }^2.0 {a TO z}^2.0 [ a TO z] OR bar [a TO z] bar [ a TO z] AND bar +[a TO z] +bar ( bar blar { a TO z}) bar blar {a TO z} gack ( bar blar { a TO z}) gack (bar blar {a TO z}) [* TO Z] [* TO z] [A TO *] [a TO *] [* TO *] [\* TO \*] \!blah \:blah blah \~blah \*blah a a-b:c a+b:c a\:b:c a\\b:c a:b-c a:b+c a:b\:c a:b\\c a:b-c* a:b+c* a:b\:c* a:b\\c* a:b-c~2.0 a:b+c~2.0 a:b\:c~ a:b\\c~ [a- TO a+] [ a\\ TO a\* ] c\:\\temp\\\~foo.txt abc XYZ (item:\\ item:ABCD\\) \* * \\ a\:b\:c a\\b\:c a\:b\\c a\:b\:c\* a\:b\\\\c\* a:b-c~ a:b+c~ a\:b\:c\~ a\:b\\c\~ +weltbank +worlbank +term +term +term term +term term term term +term term +term +term -term term term -term +term +term on on^1.0 hello^2.0 the^3 the some phrase xunit~ one two three A AND B OR C AND D +A +B +C +D foo:zoo* foo:zoo*^2 zoo foo:* foo:*^2 *:foo a:the OR a:foo a:woo OR a:the *:* (*:*) +*:* -*:* the wizard of ozzy """.splitlines() failtests = r""" field:term:with:colon some more terms (sub query)^5.0^2.0 plus more a:b:c a:b:c~ a:b:c* a:b:c~2.0 \+blah \-blah foo \|| bar foo \AND bar \a a\-b:c a\+b:c a\b:c a:b\-c a:b\+c a\-b\:c a\+b\:c a:b\c* a:b\-c~ a:b\+c~ a:b\c a:b\-c* a:b\+c* [ a\- TO a\+ ] [a\ TO a*] a\\\+b a\+b c:\temp\~foo.txt XY\ a\u0062c a:b\c~2.0 XY\u005a XY\u005A item:\ item:ABCD\ \ a\ or b a\:b\-c a\:b\+c a\:b\-c\* a\:b\+c\* a\:b\-c\~ a\:b\+c\~ a:b\c~ [ a\ TO a* ] """.splitlines() allpass = True for t in [_f for _f in map(str.strip,tests) if _f]: print(t) try: #~ expression.parseString(t,parseAll=True) print(expression.parseString(t,parseAll=True)) except ParseException as pe: print(t) print(pe) allpass = False print() print(("OK", "FAIL")[not allpass]) pyparsing-2.0.3/examples/sexpParser.py0000664000175000017500000001260012171425201017070 0ustar barrybarry# sexpParser.py # # Demonstration of the pyparsing module, implementing a simple S-expression # parser. # # Updates: # November, 2011 - fixed errors in precedence of alternatives in simpleString; # fixed exception raised in verifyLen to properly signal the input string # and exception location so that markInputline works correctly; fixed # definition of decimal to accept a single '0' and optional leading '-' # sign; updated tests to improve parser coverage # # Copyright 2007-2011, by Paul McGuire # """ BNF reference: http://theory.lcs.mit.edu/~rivest/sexp.txt :: | :: ? ; :: | | | | ; :: "[" "]" ; :: ":" ; :: + ; -- decimal numbers should have no unnecessary leading zeros -- any string of bytes, of the indicated length :: + ; :: ? "|" ( | )* "|" ; :: "#" ( | )* "#" ; :: ? :: "\"" "\"" :: "(" ( | )* ")" ; :: * ; :: | | ; :: | | ; :: "a" | ... | "z" ; :: "A" | ... | "Z" ; :: "0" | ... | "9" ; :: | "A" | ... | "F" | "a" | ... | "f" ; :: "-" | "." | "/" | "_" | ":" | "*" | "+" | "=" ; :: " " | "\t" | "\r" | "\n" ; :: | | "+" | "/" | "=" ; :: "" ; """ from pyparsing import * from base64 import b64decode import pprint def verifyLen(s,l,t): t = t[0] if t.len is not None: t1len = len(t[1]) if t1len != t.len: raise ParseFatalException(s,l,\ "invalid data of length %d, expected %s" % (t1len, t.len)) return t[1] # define punctuation literals LPAR, RPAR, LBRK, RBRK, LBRC, RBRC, VBAR = map(Suppress, "()[]{}|") decimal = Regex(r'0|[1-9]\d*').setParseAction(lambda t: int(t[0])) hexadecimal = ("#" + OneOrMore(Word(hexnums)) + "#")\ .setParseAction(lambda t: int("".join(t[1:-1]),16)) bytes = Word(printables) raw = Group(decimal("len") + Suppress(":") + bytes).setParseAction(verifyLen) token = Word(alphanums + "-./_:*+=") base64_ = Group(Optional(decimal|hexadecimal,default=None)("len") + VBAR + OneOrMore(Word( alphanums +"+/=" )).setParseAction(lambda t: b64decode("".join(t))) + VBAR).setParseAction(verifyLen) qString = Group(Optional(decimal,default=None)("len") + dblQuotedString.setParseAction(removeQuotes)).setParseAction(verifyLen) simpleString = base64_ | raw | decimal | token | hexadecimal | qString # extended definitions decimal = Regex(r'-?0|[1-9]\d*').setParseAction(lambda t: int(t[0])) real = Regex(r"[+-]?\d+\.\d*([eE][+-]?\d+)?").setParseAction(lambda tokens: float(tokens[0])) token = Word(alphanums + "-./_:*+=!<>") simpleString = real | base64_ | raw | decimal | token | hexadecimal | qString display = LBRK + simpleString + RBRK string_ = Optional(display) + simpleString sexp = Forward() sexpList = Group(LPAR + ZeroOrMore(sexp) + RPAR) sexp << ( string_ | sexpList ) ######### Test data ########### test00 = """(snicker "abc" (#03# |YWJj|))""" test01 = """(certificate (issuer (name (public-key rsa-with-md5 (e 15 |NFGq/E3wh9f4rJIQVXhS|) (n |d738/4ghP9rFZ0gAIYZ5q9y6iskDJwASi5rEQpEQq8ZyMZeIZzIAR2I5iGE=|)) aid-committee)) (subject (ref (public-key rsa-with-md5 (e |NFGq/E3wh9f4rJIQVXhS|) (n |d738/4ghP9rFZ0gAIYZ5q9y6iskDJwASi5rEQpEQq8ZyMZeIZzIAR2I5iGE=|)) tom mother)) (not-before "1997-01-01_09:00:00") (not-after "1998-01-01_09:00:00") (tag (spend (account "12345678") (* numeric range "1" "1000")))) """ test02 = """(lambda (x) (* x x))""" test03 = """(def length (lambda (x) (cond ((not x) 0) ( t (+ 1 (length (cdr x)))) ) ) ) """ test04 = """(2:XX "abc" (#03# |YWJj|))""" test05 = """(if (is (window_name) "XMMS") (set_workspace 2))""" test06 = """(if (and (is (application_name) "Firefox") (or (contains (window_name) "Enter name of file to save to") (contains (window_name) "Save As") (contains (window_name) "Save Image") () ) ) (geometry "+140+122") ) """ test07 = """(defun factorial (x) (if (zerop x) 1 (* x (factorial (- x 1))))) """ test51 = """(2:XX "abc" (#30# |YWJj|))""" test51error = """(3:XX "abc" (#30# |YWJj|))""" test52 = """ (and (or (> uid 1000) (!= gid 20) ) (> quota 5.0e+03) ) """ # Run tests t = None alltests = [ locals()[t] for t in sorted(locals()) if t.startswith("test") ] for t in alltests: print('-'*50) print(t) try: sexpr = sexp.parseString(t, parseAll=True) pprint.pprint(sexpr.asList()) except ParseFatalException as pfe: print("Error:", pfe.msg) print(pfe.markInputline('^')) print() pyparsing-2.0.3/examples/simpleSQL.py0000664000175000017500000001123012171425201016603 0ustar barrybarry# simpleSQL.py # # simple demo of using the parsing library to do simple-minded SQL parsing # could be extended to include where clauses etc. # # Copyright (c) 2003, Paul McGuire # from pyparsing import Literal, CaselessLiteral, Word, Upcase, delimitedList, Optional, \ Combine, Group, alphas, nums, alphanums, ParseException, Forward, oneOf, quotedString, \ ZeroOrMore, restOfLine, Keyword def test( str ): print(str,"->") try: tokens = simpleSQL.parseString( str ) print("tokens = ", tokens) print("tokens.columns =", tokens.columns) print("tokens.tables =", tokens.tables) print("tokens.where =", tokens.where) except ParseException as err: print(" "*err.loc + "^\n" + err.msg) print(err) print() # define SQL tokens selectStmt = Forward() selectToken = Keyword("select", caseless=True) fromToken = Keyword("from", caseless=True) ident = Word( alphas, alphanums + "_$" ).setName("identifier") columnName = Upcase( delimitedList( ident, ".", combine=True ) ) columnNameList = Group( delimitedList( columnName ) ) tableName = Upcase( delimitedList( ident, ".", combine=True ) ) tableNameList = Group( delimitedList( tableName ) ) whereExpression = Forward() and_ = Keyword("and", caseless=True) or_ = Keyword("or", caseless=True) in_ = Keyword("in", caseless=True) E = CaselessLiteral("E") binop = oneOf("= != < > >= <= eq ne lt le gt ge", caseless=True) arithSign = Word("+-",exact=1) realNum = Combine( Optional(arithSign) + ( Word( nums ) + "." + Optional( Word(nums) ) | ( "." + Word(nums) ) ) + Optional( E + Optional(arithSign) + Word(nums) ) ) intNum = Combine( Optional(arithSign) + Word( nums ) + Optional( E + Optional("+") + Word(nums) ) ) columnRval = realNum | intNum | quotedString | columnName # need to add support for alg expressions whereCondition = Group( ( columnName + binop + columnRval ) | ( columnName + in_ + "(" + delimitedList( columnRval ) + ")" ) | ( columnName + in_ + "(" + selectStmt + ")" ) | ( "(" + whereExpression + ")" ) ) whereExpression << whereCondition + ZeroOrMore( ( and_ | or_ ) + whereExpression ) # define the grammar selectStmt << ( selectToken + ( '*' | columnNameList ).setResultsName( "columns" ) + fromToken + tableNameList.setResultsName( "tables" ) + Optional( Group( CaselessLiteral("where") + whereExpression ), "" ).setResultsName("where") ) simpleSQL = selectStmt # define Oracle comment format, and ignore them oracleSqlComment = "--" + restOfLine simpleSQL.ignore( oracleSqlComment ) test( "SELECT * from XYZZY, ABC" ) test( "select * from SYS.XYZZY" ) test( "Select A from Sys.dual" ) test( "Select A,B,C from Sys.dual" ) test( "Select A, B, C from Sys.dual" ) test( "Select A, B, C from Sys.dual, Table2 " ) test( "Xelect A, B, C from Sys.dual" ) test( "Select A, B, C frox Sys.dual" ) test( "Select" ) test( "Select &&& frox Sys.dual" ) test( "Select A from Sys.dual where a in ('RED','GREEN','BLUE')" ) test( "Select A from Sys.dual where a in ('RED','GREEN','BLUE') and b in (10,20,30)" ) test( "Select A,b from table1,table2 where table1.id eq table2.id -- test out comparison operators" ) """ Test output: >pythonw -u simpleSQL.py SELECT * from XYZZY, ABC -> tokens = ['select', '*', 'from', ['XYZZY', 'ABC']] tokens.columns = * tokens.tables = ['XYZZY', 'ABC'] select * from SYS.XYZZY -> tokens = ['select', '*', 'from', ['SYS.XYZZY']] tokens.columns = * tokens.tables = ['SYS.XYZZY'] Select A from Sys.dual -> tokens = ['select', ['A'], 'from', ['SYS.DUAL']] tokens.columns = ['A'] tokens.tables = ['SYS.DUAL'] Select A,B,C from Sys.dual -> tokens = ['select', ['A', 'B', 'C'], 'from', ['SYS.DUAL']] tokens.columns = ['A', 'B', 'C'] tokens.tables = ['SYS.DUAL'] Select A, B, C from Sys.dual -> tokens = ['select', ['A', 'B', 'C'], 'from', ['SYS.DUAL']] tokens.columns = ['A', 'B', 'C'] tokens.tables = ['SYS.DUAL'] Select A, B, C from Sys.dual, Table2 -> tokens = ['select', ['A', 'B', 'C'], 'from', ['SYS.DUAL', 'TABLE2']] tokens.columns = ['A', 'B', 'C'] tokens.tables = ['SYS.DUAL', 'TABLE2'] Xelect A, B, C from Sys.dual -> ^ Expected 'select' Expected 'select' (0), (1,1) Select A, B, C frox Sys.dual -> ^ Expected 'from' Expected 'from' (15), (1,16) Select -> ^ Expected '*' Expected '*' (6), (1,7) Select &&& frox Sys.dual -> ^ Expected '*' Expected '*' (7), (1,8) >Exit code: 0 """pyparsing-2.0.3/examples/antlr_grammar.py0000664000175000017500000002475512171425201017600 0ustar barrybarry''' antlr_grammar.py Created on 4 sept. 2010 @author: luca (Minor updates by Paul McGuire, June, 2012) ''' from pyparsing import Word, ZeroOrMore, printables, Suppress, OneOrMore, Group, \ LineEnd, Optional, White, originalTextFor, hexnums, nums, Combine, Literal, Keyword, \ cStyleComment, Regex, Forward, MatchFirst, And, srange, oneOf, alphas, alphanums, \ delimitedList # http://www.antlr.org/grammar/ANTLR/ANTLRv3.g # Tokens EOL = Suppress(LineEnd()) # $ singleTextString = originalTextFor(ZeroOrMore(~EOL + (White(" \t") | Word(printables)))).leaveWhitespace() XDIGIT = hexnums INT = Word(nums) ESC = Literal('\\') + (oneOf(list(r'nrtbf\">'+"'")) | ('u' + Word(hexnums, exact=4)) | Word(printables, exact=1)) LITERAL_CHAR = ESC | ~(Literal("'") | Literal('\\')) + Word(printables, exact=1) CHAR_LITERAL = Suppress("'") + LITERAL_CHAR + Suppress("'") STRING_LITERAL = Suppress("'") + Combine(OneOrMore(LITERAL_CHAR)) + Suppress("'") DOUBLE_QUOTE_STRING_LITERAL = '"' + ZeroOrMore(LITERAL_CHAR) + '"' DOUBLE_ANGLE_STRING_LITERAL = '<<' + ZeroOrMore(Word(printables, exact=1)) + '>>' TOKEN_REF = Word(alphas.upper(), alphanums+'_') RULE_REF = Word(alphas.lower(), alphanums+'_') ACTION_ESC = (Suppress("\\") + Suppress("'")) | Suppress('\\"') | Suppress('\\') + (~(Literal("'") | Literal('"')) + Word(printables, exact=1)) ACTION_CHAR_LITERAL = Suppress("'") + (ACTION_ESC | ~(Literal('\\') | Literal("'")) + Word(printables, exact=1)) + Suppress("'") ACTION_STRING_LITERAL = Suppress('"') + ZeroOrMore(ACTION_ESC | ~(Literal('\\') | Literal('"')) + Word(printables, exact=1)) + Suppress('"') SRC = Suppress('src') + ACTION_STRING_LITERAL("file") + INT("line") id = TOKEN_REF | RULE_REF SL_COMMENT = Suppress('//') + Suppress('$ANTLR') + SRC | ZeroOrMore(~EOL + Word(printables)) + EOL ML_COMMENT = cStyleComment WS = OneOrMore(Suppress(' ') | Suppress('\t') | (Optional(Suppress('\r')) + Literal('\n'))) WS_LOOP = ZeroOrMore(SL_COMMENT | ML_COMMENT) NESTED_ARG_ACTION = Forward() NESTED_ARG_ACTION << Suppress('[') + ZeroOrMore(NESTED_ARG_ACTION | ACTION_STRING_LITERAL | ACTION_CHAR_LITERAL) + Suppress(']') ARG_ACTION = NESTED_ARG_ACTION NESTED_ACTION = Forward() NESTED_ACTION << Suppress('{') + ZeroOrMore(NESTED_ACTION | SL_COMMENT | ML_COMMENT | ACTION_STRING_LITERAL | ACTION_CHAR_LITERAL) + Suppress('}') ACTION = NESTED_ACTION + Optional('?') SCOPE = Suppress('scope') OPTIONS = Suppress('options') + Suppress('{') # + WS_LOOP + Suppress('{') TOKENS = Suppress('tokens') + Suppress('{') # + WS_LOOP + Suppress('{') FRAGMENT = 'fragment'; TREE_BEGIN = Suppress('^(') ROOT = Suppress('^') BANG = Suppress('!') RANGE = Suppress('..') REWRITE = Suppress('->') # General Parser Definitions # Grammar heading optionValue = id | STRING_LITERAL | CHAR_LITERAL | INT | Literal('*').setName("s") option = Group(id("id") + Suppress('=') + optionValue("value"))("option") optionsSpec = OPTIONS + Group(OneOrMore(option + Suppress(';')))("options") + Suppress('}') tokenSpec = Group(TOKEN_REF("token_ref") + (Suppress('=') + (STRING_LITERAL | CHAR_LITERAL)("lit")))("token") + Suppress(';') tokensSpec = TOKENS + Group(OneOrMore(tokenSpec))("tokens") + Suppress('}') attrScope = Suppress('scope') + id + ACTION grammarType = Keyword('lexer') + Keyword('parser') + Keyword('tree') actionScopeName = id | Keyword('lexer')("l") | Keyword('parser')("p") action = Suppress('@') + Optional(actionScopeName + Suppress('::')) + id + ACTION grammarHeading = Optional(ML_COMMENT("ML_COMMENT")) + Optional(grammarType) + Suppress('grammar') + id("grammarName") + Suppress(';') + Optional(optionsSpec) + Optional(tokensSpec) + ZeroOrMore(attrScope) + ZeroOrMore(action) modifier = Keyword('protected') | Keyword('public') | Keyword('private') | Keyword('fragment') ruleAction = Suppress('@') + id + ACTION throwsSpec = Suppress('throws') + delimitedList(id) ruleScopeSpec = (Suppress('scope') + ACTION) | (Suppress('scope') + delimitedList(id) + Suppress(';')) | (Suppress('scope') + ACTION + Suppress('scope') + delimitedList(id) + Suppress(';')) unary_op = oneOf("^ !") notTerminal = CHAR_LITERAL | TOKEN_REF | STRING_LITERAL terminal = (CHAR_LITERAL | TOKEN_REF + Optional(ARG_ACTION) | STRING_LITERAL | '.') + Optional(unary_op) block = Forward() notSet = Suppress('~') + (notTerminal | block) rangeNotPython = CHAR_LITERAL("c1") + RANGE + CHAR_LITERAL("c2") atom = Group(rangeNotPython + Optional(unary_op)("op")) | terminal | (notSet + Optional(unary_op)("op")) | (RULE_REF + Optional(ARG_ACTION("arg")) + Optional(unary_op)("op")) element = Forward() treeSpec = Suppress('^(') + element*(2,) + Suppress(')') ebnfSuffix = oneOf("? * +") ebnf = block + Optional(ebnfSuffix("op") | '=>') elementNoOptionSpec = (id("result_name") + oneOf('= +=')("labelOp") + atom("atom") + Optional(ebnfSuffix)) | (id("result_name") + oneOf('= +=')("labelOp") + block + Optional(ebnfSuffix)) | atom("atom") + Optional(ebnfSuffix) | ebnf | ACTION | (treeSpec + Optional(ebnfSuffix)) # | SEMPRED ( '=>' -> GATED_SEMPRED | -> SEMPRED ) element << Group(elementNoOptionSpec)("element") alternative = Group(Group(OneOrMore(element))("elements")) # Do not ask me why group is needed twice... seems like the xml that you see is not always the real structure? rewrite = Optional(Literal('TODO REWRITE RULES TODO')) block << Suppress('(') + Optional(Optional(optionsSpec("opts")) + Suppress(':')) + Group(alternative('a1') + rewrite + Group(ZeroOrMore(Suppress('|') + alternative('a2') + rewrite))("alternatives"))("block") + Suppress(')') altList = alternative('a1') + rewrite + Group(ZeroOrMore(Suppress('|') + alternative('a2') + rewrite))("alternatives") exceptionHandler = Suppress('catch') + ARG_ACTION + ACTION finallyClause = Suppress('finally') + ACTION exceptionGroup = (OneOrMore(exceptionHandler) + Optional(finallyClause)) | finallyClause ruleHeading = Optional(ML_COMMENT)("ruleComment") + Optional(modifier)("modifier") + id("ruleName") + Optional("!") + Optional(ARG_ACTION("arg")) + Optional(Suppress('returns') + ARG_ACTION("rt")) + Optional(throwsSpec) + Optional(optionsSpec) + Optional(ruleScopeSpec) + ZeroOrMore(ruleAction) rule = Group(ruleHeading + Suppress(':') + altList + Suppress(';') + Optional(exceptionGroup))("rule") grammarDef = grammarHeading + Group(OneOrMore(rule))("rules") def grammar(): return grammarDef def __antlrAlternativesConverter(pyparsingRules, antlrBlock): rule = None if hasattr(antlrBlock, 'alternatives') and antlrBlock.alternatives != '' and len(antlrBlock.alternatives) > 0: alternatives = [] alternatives.append(__antlrAlternativeConverter(pyparsingRules, antlrBlock.a1)) for alternative in antlrBlock.alternatives: alternatives.append(__antlrAlternativeConverter(pyparsingRules, alternative)) rule = MatchFirst(alternatives)("anonymous_or") elif hasattr(antlrBlock, 'a1') and antlrBlock.a1 != '': rule = __antlrAlternativeConverter(pyparsingRules, antlrBlock.a1) else: raise Exception('Not yet implemented') assert rule != None return rule def __antlrAlternativeConverter(pyparsingRules, antlrAlternative): elementList = [] for element in antlrAlternative.elements: rule = None if hasattr(element.atom, 'c1') and element.atom.c1 != '': regex = r'['+str(element.atom.c1[0])+'-'+str(element.atom.c2[0]+']') rule = Regex(regex)("anonymous_regex") elif hasattr(element, 'block') and element.block != '': rule = __antlrAlternativesConverter(pyparsingRules, element.block) else: ruleRef = element.atom assert ruleRef in pyparsingRules rule = pyparsingRules[element.atom](element.atom) if hasattr(element, 'op') and element.op != '': if element.op == '+': rule = Group(OneOrMore(rule))("anonymous_one_or_more") elif element.op == '*': rule = Group(ZeroOrMore(rule))("anonymous_zero_or_more") elif element.op == '?': rule = Optional(rule) else: raise Exception('rule operator not yet implemented : ' + element.op) rule = rule elementList.append(rule) if len(elementList) > 1: rule = Group(And(elementList))("anonymous_and") else: rule = elementList[0] assert rule != None return rule def __antlrRuleConverter(pyparsingRules, antlrRule): rule = None rule = __antlrAlternativesConverter(pyparsingRules, antlrRule) assert rule != None rule(antlrRule.ruleName) return rule def antlrConverter(antlrGrammarTree): pyparsingRules = {} antlrTokens = {} for antlrToken in antlrGrammarTree.tokens: antlrTokens[antlrToken.token_ref] = antlrToken.lit for antlrTokenName, antlrToken in list(antlrTokens.items()): pyparsingRules[antlrTokenName] = Literal(antlrToken) antlrRules = {} for antlrRule in antlrGrammarTree.rules: antlrRules[antlrRule.ruleName] = antlrRule pyparsingRules[antlrRule.ruleName] = Forward() # antlr is a top down grammar for antlrRuleName, antlrRule in list(antlrRules.items()): pyparsingRule = __antlrRuleConverter(pyparsingRules, antlrRule) assert pyparsingRule != None pyparsingRules[antlrRuleName] << pyparsingRule return pyparsingRules if __name__ == "__main__": text = """grammar SimpleCalc; options { language = Python; } tokens { PLUS = '+' ; MINUS = '-' ; MULT = '*' ; DIV = '/' ; } /*------------------------------------------------------------------ * PARSER RULES *------------------------------------------------------------------*/ expr : term ( ( PLUS | MINUS ) term )* ; term : factor ( ( MULT | DIV ) factor )* ; factor : NUMBER ; /*------------------------------------------------------------------ * LEXER RULES *------------------------------------------------------------------*/ NUMBER : (DIGIT)+ ; /* WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; } ; */ fragment DIGIT : '0'..'9' ; """ grammar().validate() antlrGrammarTree = grammar().parseString(text) print(antlrGrammarTree.asXML("antlrGrammarTree")) pyparsingRules = antlrConverter(antlrGrammarTree) pyparsingRule = pyparsingRules["expr"] pyparsingTree = pyparsingRule.parseString("2 - 5 * 42 + 7 / 25") print(pyparsingTree.asXML("pyparsingTree")) pyparsing-2.0.3/examples/greeting.py0000664000175000017500000000056412171425201016546 0ustar barrybarry# greeting.py # # Demonstration of the pyparsing module, on the prototypical "Hello, World!" # example # # Copyright 2003, by Paul McGuire # from pyparsing import Word, alphas # define grammar greet = Word( alphas ) + "," + Word( alphas ) + "!" # input string hello = "Hello, World!" # parse input string print(hello, "->", greet.parseString( hello )) pyparsing-2.0.3/examples/adventureEngine.py0000664000175000017500000005016312171425201020065 0ustar barrybarry# adventureEngine.py # Copyright 2005-2006, Paul McGuire # # Updated 2012 - latest pyparsing API # from pyparsing import * import random import string def aOrAn( item ): if item.desc[0] in "aeiou": return "an " + item.desc else: return "a " + item.desc def enumerateItems(l): if len(l) == 0: return "nothing" out = [] if len(l) > 1: out.append(', '.join(aOrAn(item) for item in l[:-1])) out.append('and') out.append(aOrAn(l[-1])) return " ".join(out) def enumerateDoors(l): if len(l) == 0: return "" out = [] if len(l) > 1: out.append(', '.join(l[:-1])) out.append("and") out.append(l[-1]) return " ".join(out) class Room(object): def __init__(self, desc): self.desc = desc self.inv = [] self.gameOver = False self.doors = [None,None,None,None] def __getattr__(self,attr): return \ { "n":self.doors[0], "s":self.doors[1], "e":self.doors[2], "w":self.doors[3], }[attr] def enter(self,player): if self.gameOver: player.gameOver = True def addItem(self, it): self.inv.append(it) def removeItem(self,it): self.inv.remove(it) def describe(self): print(self.desc) visibleItems = [ it for it in self.inv if it.isVisible ] if random.random() > 0.5: if len(visibleItems) > 1: is_form = "are" else: is_form = "is" print("There %s %s here." % (is_form, enumerateItems(visibleItems))) else: print("You see %s." % (enumerateItems(visibleItems))) class Exit(Room): def __init__(self): super(Exit,self).__init__("") def enter(self,player): player.gameOver = True class Item(object): items = {} def __init__(self, desc): self.desc = desc self.isDeadly = False self.isFragile = False self.isBroken = False self.isTakeable = True self.isVisible = True self.isOpenable = False self.useAction = None self.usableConditionTest = None self.cantTakeMessage = "You can't take that!" Item.items[desc] = self def __str__(self): return self.desc def breakItem(self): if not self.isBroken: print("") self.desc = "broken " + self.desc self.isBroken = True def isUsable(self, player, target): if self.usableConditionTest: return self.usableConditionTest( player, target ) else: return False def useItem(self, player, target): if self.useAction: self.useAction(player, self, target) class OpenableItem(Item): def __init__(self, desc, contents=None): super(OpenableItem,self).__init__(desc) self.isOpenable = True self.isOpened = False if contents is not None: if isinstance(contents, Item): self.contents = [contents,] else: self.contents = contents else: self.contents = [] def openItem(self, player): if not self.isOpened: self.isOpened = not self.isOpened if self.contents is not None: for item in self.contents: player.room.addItem( item ) self.contents = [] self.desc = "open " + self.desc def closeItem(self, player): if self.isOpened: self.isOpened = not self.isOpened if self.desc.startswith("open "): self.desc = self.desc[5:] class Command(object): "Base class for commands" def __init__(self, verb, verbProg): self.verb = verb self.verbProg = verbProg @staticmethod def helpDescription(): return "" def _doCommand(self, player): pass def __call__(self, player ): print(self.verbProg.capitalize()+"...") self._doCommand(player) class MoveCommand(Command): def __init__(self, quals): super(MoveCommand,self).__init__("MOVE", "moving") self.direction = quals.direction[0] @staticmethod def helpDescription(): return """MOVE or GO - go NORTH, SOUTH, EAST, or WEST (can abbreviate as 'GO N' and 'GO W', or even just 'E' and 'S')""" def _doCommand(self, player): rm = player.room nextRoom = rm.doors[ { "N":0, "S":1, "E":2, "W":3, }[self.direction] ] if nextRoom: player.moveTo( nextRoom ) else: print("Can't go that way.") class TakeCommand(Command): def __init__(self, quals): super(TakeCommand,self).__init__("TAKE", "taking") self.subject = quals.item @staticmethod def helpDescription(): return "TAKE or PICKUP or PICK UP - pick up an object (but some are deadly)" def _doCommand(self, player): rm = player.room subj = Item.items[self.subject] if subj in rm.inv and subj.isVisible: if subj.isTakeable: rm.removeItem(subj) player.take(subj) else: print(subj.cantTakeMessage) else: print("There is no %s here." % subj) class DropCommand(Command): def __init__(self, quals): super(DropCommand,self).__init__("DROP", "dropping") self.subject = quals.item @staticmethod def helpDescription(): return "DROP or LEAVE - drop an object (but fragile items may break)" def _doCommand(self, player): rm = player.room subj = Item.items[self.subject] if subj in player.inv: rm.addItem(subj) player.drop(subj) else: print("You don't have %s." % (aOrAn(subj))) class InventoryCommand(Command): def __init__(self, quals): super(InventoryCommand,self).__init__("INV", "taking inventory") @staticmethod def helpDescription(): return "INVENTORY or INV or I - lists what items you have" def _doCommand(self, player): print("You have %s." % enumerateItems( player.inv )) class LookCommand(Command): def __init__(self, quals): super(LookCommand,self).__init__("LOOK", "looking") @staticmethod def helpDescription(): return "LOOK or L - describes the current room and any objects in it" def _doCommand(self, player): player.room.describe() class DoorsCommand(Command): def __init__(self, quals): super(DoorsCommand,self).__init__("DOORS", "looking for doors") @staticmethod def helpDescription(): return "DOORS - display what doors are visible from this room" def _doCommand(self, player): rm = player.room numDoors = sum([1 for r in rm.doors if r is not None]) if numDoors == 0: reply = "There are no doors in any direction." else: if numDoors == 1: reply = "There is a door to the " else: reply = "There are doors to the " doorNames = [ {0:"north", 1:"south", 2:"east", 3:"west"}[i] for i,d in enumerate(rm.doors) if d is not None ] #~ print doorNames reply += enumerateDoors( doorNames ) reply += "." print(reply) class UseCommand(Command): def __init__(self, quals): super(UseCommand,self).__init__("USE", "using") self.subject = Item.items[quals.usedObj] if quals.targetObj: self.target = Item.items[quals.targetObj] else: self.target = None @staticmethod def helpDescription(): return "USE or U - use an object, optionally IN or ON another object" def _doCommand(self, player): rm = player.room availItems = rm.inv + player.inv if self.subject in availItems: if self.subject.isUsable( player, self.target ): self.subject.useItem( player, self.target ) else: print("You can't use that here.") else: print("There is no %s here to use." % self.subject) class OpenCommand(Command): def __init__(self, quals): super(OpenCommand,self).__init__("OPEN", "opening") self.subject = Item.items[quals.item] @staticmethod def helpDescription(): return "OPEN or O - open an object" def _doCommand(self, player): rm = player.room availItems = rm.inv+player.inv if self.subject in availItems: if self.subject.isOpenable: if not self.subject.isOpened: self.subject.openItem( player ) else: print("It's already open.") else: print("You can't open that.") else: print("There is no %s here to open." % self.subject) class CloseCommand(Command): def __init__(self, quals): super(CloseCommand,self).__init__("CLOSE", "closing") self.subject = Item.items[quals.item] @staticmethod def helpDescription(): return "CLOSE or CL - close an object" def _doCommand(self, player): rm = player.room availItems = rm.inv+player.inv if self.subject in availItems: if self.subject.isOpenable: if self.subject.isOpened: self.subject.closeItem( player ) else: print("You can't close that, it's not open.") else: print("You can't close that.") else: print("There is no %s here to close." % self.subject) class QuitCommand(Command): def __init__(self, quals): super(QuitCommand,self).__init__("QUIT", "quitting") @staticmethod def helpDescription(): return "QUIT or Q - ends the game" def _doCommand(self, player): print("Ok....") player.gameOver = True class HelpCommand(Command): def __init__(self, quals): super(HelpCommand,self).__init__("HELP", "helping") @staticmethod def helpDescription(): return "HELP or H or ? - displays this help message" def _doCommand(self, player): print("Enter any of the following commands (not case sensitive):") for cmd in [ InventoryCommand, DropCommand, TakeCommand, UseCommand, OpenCommand, CloseCommand, MoveCommand, LookCommand, DoorsCommand, QuitCommand, HelpCommand, ]: print(" - %s" % cmd.helpDescription()) print() class AppParseException(ParseException): pass class Parser(object): def __init__(self): self.bnf = self.makeBNF() def makeBNF(self): invVerb = oneOf("INV INVENTORY I", caseless=True) dropVerb = oneOf("DROP LEAVE", caseless=True) takeVerb = oneOf("TAKE PICKUP", caseless=True) | \ (CaselessLiteral("PICK") + CaselessLiteral("UP") ) moveVerb = oneOf("MOVE GO", caseless=True) | empty useVerb = oneOf("USE U", caseless=True) openVerb = oneOf("OPEN O", caseless=True) closeVerb = oneOf("CLOSE CL", caseless=True) quitVerb = oneOf("QUIT Q", caseless=True) lookVerb = oneOf("LOOK L", caseless=True) doorsVerb = CaselessLiteral("DOORS") helpVerb = oneOf("H HELP ?",caseless=True) itemRef = OneOrMore(Word(alphas)).setParseAction( self.validateItemName ) nDir = oneOf("N NORTH",caseless=True).setParseAction(replaceWith("N")) sDir = oneOf("S SOUTH",caseless=True).setParseAction(replaceWith("S")) eDir = oneOf("E EAST",caseless=True).setParseAction(replaceWith("E")) wDir = oneOf("W WEST",caseless=True).setParseAction(replaceWith("W")) moveDirection = nDir | sDir | eDir | wDir invCommand = invVerb dropCommand = dropVerb + itemRef("item") takeCommand = takeVerb + itemRef("item") useCommand = useVerb + itemRef("usedObj") + \ Optional(oneOf("IN ON",caseless=True)) + \ Optional(itemRef,default=None)("targetObj") openCommand = openVerb + itemRef("item") closeCommand = closeVerb + itemRef("item") moveCommand = moveVerb + moveDirection("direction") quitCommand = quitVerb lookCommand = lookVerb doorsCommand = doorsVerb helpCommand = helpVerb # attach command classes to expressions invCommand.setParseAction(InventoryCommand) dropCommand.setParseAction(DropCommand) takeCommand.setParseAction(TakeCommand) useCommand.setParseAction(UseCommand) openCommand.setParseAction(OpenCommand) closeCommand.setParseAction(CloseCommand) moveCommand.setParseAction(MoveCommand) quitCommand.setParseAction(QuitCommand) lookCommand.setParseAction(LookCommand) doorsCommand.setParseAction(DoorsCommand) helpCommand.setParseAction(HelpCommand) # define parser using all command expressions return ( invCommand | useCommand | openCommand | closeCommand | dropCommand | takeCommand | moveCommand | lookCommand | doorsCommand | helpCommand | quitCommand )("command") + LineEnd() def validateItemName(self,s,l,t): iname = " ".join(t) if iname not in Item.items: raise AppParseException(s,l,"No such item '%s'." % iname) return iname def parseCmd(self, cmdstr): try: ret = self.bnf.parseString(cmdstr) return ret except AppParseException as pe: print(pe.msg) except ParseException as pe: print(random.choice([ "Sorry, I don't understand that.", "Huh?", "Excuse me?", "???", "What?" ] )) class Player(object): def __init__(self, name): self.name = name self.gameOver = False self.inv = [] def moveTo(self, rm): self.room = rm rm.enter(self) if self.gameOver: if rm.desc: rm.describe() print("Game over!") else: rm.describe() def take(self,it): if it.isDeadly: print("Aaaagh!...., the %s killed me!" % it) self.gameOver = True else: self.inv.append(it) def drop(self,it): self.inv.remove(it) if it.isFragile: it.breakItem() def createRooms( rm ): """ create rooms, using multiline string showing map layout string contains symbols for the following: A-Z, a-z indicate rooms, and rooms will be stored in a dictionary by reference letter -, | symbols indicate connection between rooms <, >, ^, . symbols indicate one-way connection between rooms """ # start with empty dictionary of rooms ret = {} # look for room symbols, and initialize dictionary # - exit room is always marked 'Z' for c in rm: if c in string.ascii_letters: if c != "Z": ret[c] = Room(c) else: ret[c] = Exit() # scan through input string looking for connections between rooms rows = rm.split("\n") for row,line in enumerate(rows): for col,c in enumerate(line): if c in string.ascii_letters: room = ret[c] n = None s = None e = None w = None # look in neighboring cells for connection symbols (must take # care to guard that neighboring cells exist before testing # contents) if col > 0 and line[col-1] in "<-": other = line[col-2] w = ret[other] if col < len(line)-1 and line[col+1] in "->": other = line[col+2] e = ret[other] if row > 1 and col < len(rows[row-1]) and rows[row-1][col] in '|^': other = rows[row-2][col] n = ret[other] if row < len(rows)-1 and col < len(rows[row+1]) and rows[row+1][col] in '|.': other = rows[row+2][col] s = ret[other] # set connections to neighboring rooms room.doors=[n,s,e,w] return ret # put items in rooms def putItemInRoom(i,r): if isinstance(r,str): r = rooms[r] r.addItem( Item.items[i] ) def playGame(p,startRoom): # create parser parser = Parser() p.moveTo( startRoom ) while not p.gameOver: cmdstr = input(">> ") cmd = parser.parseCmd(cmdstr) if cmd is not None: cmd.command( p ) print() print("You ended the game with:") for i in p.inv: print(" -", aOrAn(i)) #==================== # start game definition roomMap = """ d-Z | f-c-e . | q", L) print("exprStack=", exprStack) # Evaluate the stack of parsed operands, emitting C code. try: result=_evaluateStack(exprStack) except TypeError: print("Unsupported operation on right side of '%s'.\nCheck for missing or incorrect tags on non-scalar operands."%input_string, file=sys.stderr) raise except UnaryUnsupportedError: print("Unary negation is not supported for vectors and matrices: '%s'"%input_string, file=sys.stderr) raise # Create final assignment and print it. if debug_flag: print("var=",targetvar) if targetvar != None: try: result = _assignfunc(targetvar,result) except TypeError: print("Left side tag does not match right side of '%s'"%input_string, file=sys.stderr) raise except UnaryUnsupportedError: print("Unary negation is not supported for vectors and matrices: '%s'"%input_string, file=sys.stderr) raise return result else: print("Empty left side in '%s'"%input_string, file=sys.stderr) raise TypeError ##----------------------------------------------------------------------------------- def fprocess(infilep,outfilep): """ Scans an input file for LA equations between double square brackets, e.g. [[ M3_mymatrix = M3_anothermatrix^-1 ]], and replaces the expression with a comment containing the equation followed by nested function calls that implement the equation as C code. A trailing semi-colon is appended. The equation within [[ ]] should NOT end with a semicolon as that will raise a ParseException. However, it is ok to have a semicolon after the right brackets. Other text in the file is unaltered. The arguments are file objects (NOT file names) opened for reading and writing, respectively. """ pattern = r'\[\[\s*(.*?)\s*\]\]' eqn = re.compile(pattern,re.DOTALL) s = infilep.read() def parser(mo): ccode = parse(mo.group(1)) return "/* %s */\n%s;\nLAParserBufferReset();\n"%(mo.group(1),ccode) content = eqn.sub(parser,s) outfilep.write(content) ##----------------------------------------------------------------------------------- def test(): """ Tests the parsing of various supported expressions. Raises an AssertError if the output is not what is expected. Prints the input, expected output, and actual output for all tests. """ print("Testing LAParser") testcases = [ ("Scalar addition","a = b+c","a=(b+c)"), ("Vector addition","V3_a = V3_b + V3_c","vCopy(a,vAdd(b,c))"), ("Vector addition","V3_a=V3_b+V3_c","vCopy(a,vAdd(b,c))"), ("Matrix addition","M3_a = M3_b + M3_c","mCopy(a,mAdd(b,c))"), ("Matrix addition","M3_a=M3_b+M3_c","mCopy(a,mAdd(b,c))"), ("Scalar subtraction","a = b-c","a=(b-c)"), ("Vector subtraction","V3_a = V3_b - V3_c","vCopy(a,vSubtract(b,c))"), ("Matrix subtraction","M3_a = M3_b - M3_c","mCopy(a,mSubtract(b,c))"), ("Scalar multiplication","a = b*c","a=b*c"), ("Scalar division","a = b/c","a=b/c"), ("Vector multiplication (dot product)","a = V3_b * V3_c","a=vDot(b,c)"), ("Vector multiplication (outer product)","M3_a = V3_b @ V3_c","mCopy(a,vOuterProduct(b,c))"), ("Matrix multiplication","M3_a = M3_b * M3_c","mCopy(a,mMultiply(b,c))"), ("Vector scaling","V3_a = V3_b * c","vCopy(a,vScale(b,c))"), ("Matrix scaling","M3_a = M3_b * c","mCopy(a,mScale(b,c))"), ("Matrix by vector multiplication","V3_a = M3_b * V3_c","vCopy(a,mvMultiply(b,c))"), ("Scalar exponentiation","a = b^c","a=pow(b,c)"), ("Matrix inversion","M3_a = M3_b^-1","mCopy(a,mInverse(b))"), ("Matrix transpose","M3_a = M3_b^T","mCopy(a,mTranspose(b))"), ("Matrix determinant","a = M3_b^Det","a=mDeterminant(b)"), ("Vector magnitude squared","a = V3_b^Mag2","a=vMagnitude2(b)"), ("Vector magnitude","a = V3_b^Mag","a=sqrt(vMagnitude2(b))"), ("Complicated expression", "myscalar = (M3_amatrix * V3_bvector)^Mag + 5*(-xyz[i] + 2.03^2)","myscalar=(sqrt(vMagnitude2(mvMultiply(amatrix,bvector)))+5*(-xyz[i]+pow(2.03,2)))"), ("Complicated Multiline", "myscalar = \n(M3_amatrix * V3_bvector)^Mag +\n 5*(xyz + 2.03^2)","myscalar=(sqrt(vMagnitude2(mvMultiply(amatrix,bvector)))+5*(xyz+pow(2.03,2)))") ] for t in testcases: name,input,expected = t print(name) print(" %s input"%input) print(" %s expected"%expected) result = parse(input) print(" %s received"%result) print("") assert expected == result ##TODO: Write testcases with invalid expressions and test that the expected ## exceptions are raised. print("Tests completed!") ##---------------------------------------------------------------------------- ## The following is executed only when this module is executed as ## command line script. It runs a small test suite (see above) ## and then enters an interactive loop where you ## can enter expressions and see the resulting C code as output. if __name__ == '__main__': # run testcases test() # input_string input_string='' # Display instructions on how to use the program interactively interactiveusage = """ Entering interactive mode: Type in an equation to be parsed or 'quit' to exit the program. Type 'debug on' to print parsing details as each string is processed. Type 'debug off' to stop printing parsing details """ print(interactiveusage) input_string = input("> ") while input_string != 'quit': if input_string == "debug on": debug_flag = True elif input_string == "debug off": debug_flag = False else: try: print(parse(input_string)) except: pass # obtain new input string input_string = input("> ") # if user types 'quit' then say goodbye print("Good bye!") pyparsing-2.0.3/examples/urlExtractor.py0000664000175000017500000000340212171425202017433 0ustar barrybarry# URL extractor # Copyright 2004, Paul McGuire from pyparsing import Literal,Suppress,CharsNotIn,CaselessLiteral,\ Word,dblQuotedString,alphanums,SkipTo import urllib.request, urllib.parse, urllib.error import pprint # Define the pyparsing grammar for a URL, that is: # URLlink ::= linkText # URL ::= doubleQuotedString | alphanumericWordPath # Note that whitespace may appear just about anywhere in the link. Note also # that it is not necessary to explicitly show this in the pyparsing grammar; by default, # pyparsing skips over whitespace between tokens. linkOpenTag = (Literal("<") + "a" + "href" + "=").suppress() + \ ( dblQuotedString | Word(alphanums+"/") ) + \ Suppress(">") linkCloseTag = Literal("<") + "/" + CaselessLiteral("a") + ">" link = linkOpenTag + SkipTo(linkCloseTag) + linkCloseTag.suppress() # Go get some HTML with some links in it. serverListPage = urllib.request.urlopen( "http://www.yahoo.com" ) htmlText = serverListPage.read() serverListPage.close() # scanString is a generator that loops through the input htmlText, and for each # match yields the tokens and start and end locations (for this application, we are # not interested in the start and end values). for toks,strt,end in link.scanString(htmlText): print(toks.asList()) # Rerun scanString, but this time create a dict of text:URL key-value pairs. # Need to reverse the tokens returned by link, using a parse action. link.setParseAction( lambda st,loc,toks: [ toks[1], toks[0] ] ) # Create dictionary from list comprehension, assembled from each pair of tokens returned # from a matched URL. pprint.pprint( dict( [ toks for toks,strt,end in link.scanString(htmlText) ] ) ) pyparsing-2.0.3/examples/withAttribute.py0000664000175000017500000000156712171425201017605 0ustar barrybarry# # withAttribute.py # Copyright, 2007 - Paul McGuire # # Simple example of using withAttribute parse action helper # to define # data = """\  49.950   50.950   51.950  """ from pyparsing import * tdS,tdE = makeHTMLTags("TD") fontS,fontE = makeHTMLTags("FONT") realNum = Combine( Word(nums) + "." + Word(nums) ).setParseAction(lambda t:float(t[0])) NBSP = Literal(" ") patt = tdS + fontS + NBSP + realNum("value") + NBSP + fontE + tdE tdS.setParseAction( withAttribute(align="right",width="80") ) for s in patt.searchString(data): print(s.value) pyparsing-2.0.3/examples/configParse.py0000664000175000017500000000404412217255052017205 0ustar barrybarry# # configparse.py # # an example of using the parsing module to be able to process a .INI configuration file # # Copyright (c) 2003, Paul McGuire # from pyparsing import \ Literal, Word, ZeroOrMore, Group, Dict, Optional, \ printables, ParseException, restOfLine, empty import pprint inibnf = None def inifile_BNF(): global inibnf if not inibnf: # punctuation lbrack = Literal("[").suppress() rbrack = Literal("]").suppress() equals = Literal("=").suppress() semi = Literal(";") comment = semi + Optional( restOfLine ) nonrbrack = "".join( [ c for c in printables if c != "]" ] ) + " \t" nonequals = "".join( [ c for c in printables if c != "=" ] ) + " \t" sectionDef = lbrack + Word( nonrbrack ) + rbrack keyDef = ~lbrack + Word( nonequals ) + equals + empty + restOfLine # strip any leading or trailing blanks from key def stripKey(tokens): tokens[0] = tokens[0].strip() keyDef.setParseAction(stripKey) # using Dict will allow retrieval of named data fields as attributes of the parsed results inibnf = Dict( ZeroOrMore( Group( sectionDef + Dict( ZeroOrMore( Group( keyDef ) ) ) ) ) ) inibnf.ignore( comment ) return inibnf pp = pprint.PrettyPrinter(2) def test( strng ): print(strng) try: iniFile = open(strng) iniData = "".join( iniFile.readlines() ) bnf = inifile_BNF() tokens = bnf.parseString( iniData ) pp.pprint( tokens.asList() ) except ParseException as err: print(err.line) print(" "*(err.column-1) + "^") print(err) iniFile.close() print() return tokens if __name__ == "__main__": ini = test("setup.ini") print("ini['Startup']['modemid'] =", ini['Startup']['modemid']) print("ini.Startup =", ini.Startup) print("ini.Startup.modemid =", ini.Startup.modemid) pyparsing-2.0.3/examples/apicheck.py0000664000175000017500000000417212171425202016511 0ustar barrybarry# apicheck.py # A simple source code scanner for finding patterns of the form # [ procname1 $arg1 $arg2 ] # and verifying the number of arguments from pyparsing import * # define punctuation and simple tokens for locating API calls LBRACK,RBRACK,LBRACE,RBRACE = map(Suppress,"[]{}") ident = Word(alphas,alphanums+"_") | QuotedString("{",endQuoteChar="}") arg = "$" + ident # define an API call with a specific number of arguments - using '-' # will ensure that after matching procname, an incorrect number of args will # raise a ParseSyntaxException, which will interrupt the scanString def apiProc(name, numargs): return LBRACK + Keyword(name)("procname") - arg*numargs + RBRACK # create an apiReference, listing all API functions to be scanned for, and # their respective number of arguments. Beginning the overall expression # with FollowedBy allows us to quickly rule out non-api calls while scanning, # since all of the api calls begin with a "[" apiRef = FollowedBy("[") + MatchFirst([ apiProc("procname1", 2), apiProc("procname2", 1), apiProc("procname3", 2), ]) test = """[ procname1 $par1 $par2 ] other code here [ procname1 $par1 $par2 $par3 ] more code here [ procname1 $par1 ] [ procname3 ${arg with spaces} $par2 ]""" # now explicitly iterate through the scanner using next(), so that # we can trap ParseSyntaxException's that would be raised due to # an incorrect number of arguments. If an exception does occur, # then see how we reset the input text and scanner to advance to the # next line of source code api_scanner = apiRef.scanString(test) while 1: try: t,s,e = next(api_scanner) print("found %s on line %d" % (t.procname, lineno(s,test))) except ParseSyntaxException as pe: print("invalid arg count on line", pe.lineno) print(pe.lineno,':',pe.line) # reset api scanner to start after this exception location test = "\n"*(pe.lineno-1)+test[pe.loc+1:] api_scanner = apiRef.scanString(test) except StopIteration: break pyparsing-2.0.3/examples/macroExpander.py0000664000175000017500000000346412171425202017535 0ustar barrybarry# macroExpander.py # # Example pyparsing program for performing macro expansion, similar to # the C pre-processor. This program is not as fully-featured, simply # processing macros of the form: # #def xxx yyyyy # and replacing xxx with yyyyy in the rest of the input string. Macros # can also be composed using other macros, such as # #def zzz xxx+1 # Since xxx was previously defined as yyyyy, then zzz will be replaced # with yyyyy+1. # # Copyright 2007 by Paul McGuire # from pyparsing import * # define the structure of a macro definition (the empty term is used # to advance to the next non-whitespace character) macroDef = "#def" + Word(alphas+"_",alphanums+"_").setResultsName("macro") + \ empty + restOfLine.setResultsName("value") # define a placeholder for defined macros - initially nothing macroExpr = Forward() # global dictionary for macro definitions macros = {} # parse action for macro definitions def processMacroDefn(s,l,t): macroVal = macroExpander.transformString(t.value) macros[t.macro] = macroVal macroExpr << MatchFirst( list(map(Keyword,list(macros.keys()))) ) return "#def " + t.macro + " " + macroVal # parse action to replace macro references with their respective definition def processMacroRef(s,l,t): return macros[t[0]] # attach parse actions to expressions macroExpr.setParseAction(processMacroRef) macroDef.setParseAction(processMacroDefn) # define pattern for scanning through the input string macroExpander = macroExpr | macroDef # test macro substitution using transformString testString = """ #def A 100 #def ALEN A+1 char Astring[ALEN]; char AA[A]; typedef char[ALEN] Acharbuf; """ print(macroExpander.transformString(testString)) print(macros) pyparsing-2.0.3/examples/ebnftest.py0000664000175000017500000000442212171425201016551 0ustar barrybarryprint('Importing pyparsing...') from pyparsing import * print('Constructing EBNF parser with pyparsing...') import ebnf import sets grammar = ''' syntax = (syntax_rule), {(syntax_rule)}; syntax_rule = meta_identifier, '=', definitions_list, ';'; definitions_list = single_definition, {'|', single_definition}; single_definition = syntactic_term, {',', syntactic_term}; syntactic_term = syntactic_factor,['-', syntactic_factor]; syntactic_factor = [integer, '*'], syntactic_primary; syntactic_primary = optional_sequence | repeated_sequence | grouped_sequence | meta_identifier | terminal_string; optional_sequence = '[', definitions_list, ']'; repeated_sequence = '{', definitions_list, '}'; grouped_sequence = '(', definitions_list, ')'; (* terminal_string = "'", character - "'", {character - "'"}, "'" | '"', character - '"', {character - '"'}, '"'; meta_identifier = letter, {letter | digit}; integer = digit, {digit}; *) ''' table = {} #~ table['character'] = Word(printables, exact=1) #~ table['letter'] = Word(alphas + '_', exact=1) #~ table['digit'] = Word(nums, exact=1) table['terminal_string'] = sglQuotedString table['meta_identifier'] = Word(alphas+"_", alphas+"_"+nums) table['integer'] = Word(nums) print('Parsing EBNF grammar with EBNF parser...') parsers = ebnf.parse(grammar, table) ebnf_parser = parsers['syntax'] commentcharcount = 0 commentlocs = sets.Set() def tallyCommentChars(s,l,t): global commentcharcount,commentlocs # only count this comment if we haven't seen it before if l not in commentlocs: charCount = ( len(t[0]) - len(list(filter(str.isspace, t[0]))) ) commentcharcount += charCount commentlocs.add(l) return l,t #ordinarily, these lines wouldn't be necessary, but we are doing extra stuff with the comment expression ebnf.ebnfComment.setParseAction( tallyCommentChars ) ebnf_parser.ignore( ebnf.ebnfComment ) print('Parsing EBNF grammar with generated EBNF parser...\n') parsed_chars = ebnf_parser.parseString(grammar) parsed_char_len = len(parsed_chars) print("],\n".join(str( parsed_chars.asList() ).split("],"))) #~ grammar_length = len(grammar) - len(filter(str.isspace, grammar))-commentcharcount #~ assert parsed_char_len == grammar_length print('Ok!') pyparsing-2.0.3/examples/groupUsingListAllMatches.py0000664000175000017500000000076612171425201021702 0ustar barrybarry# # A simple example showing the use of the implied listAllMatches=True for # results names with a trailing '*' character. # # This example performs work similar to itertools.groupby, but without # having to sort the input first. # from pyparsing import Word, ZeroOrMore, nums aExpr = Word("A", nums) bExpr = Word("B", nums) cExpr = Word("C", nums) grammar = ZeroOrMore(aExpr("A*") | bExpr("B*") | cExpr("C*")) results = grammar.parseString("A1 B1 A2 C1 B2 A3") print(results.dump()) pyparsing-2.0.3/examples/cpp_enum_parser.py0000664000175000017500000000247612171425201020130 0ustar barrybarry# # cpp_enum_parser.py # # Posted by Mark Tolenen on comp.lang.python in August, 2009, # Used with permission. # # Parser that scans through C or C++ code for enum definitions, and # generates corresponding Python constant definitions. # # from pyparsing import * # sample string with enums and other stuff sample = ''' stuff before enum hello { Zero, One, Two, Three, Five=5, Six, Ten=10 }; in the middle enum blah { alpha, beta, gamma = 10 , zeta = 50 }; at the end ''' # syntax we don't want to see in the final parse tree LBRACE,RBRACE,EQ,COMMA = map(Suppress,"{}=,") _enum = Suppress('enum') identifier = Word(alphas,alphanums+'_') integer = Word(nums) enumValue = Group(identifier('name') + Optional(EQ + integer('value'))) enumList = Group(enumValue + ZeroOrMore(COMMA + enumValue)) enum = _enum + identifier('enum') + LBRACE + enumList('names') + RBRACE # find instances of enums ignoring other syntax for item,start,stop in enum.scanString(sample): id = 0 for entry in item.names: if entry.value != '': id = int(entry.value) print('%s_%s = %d' % (item.enum.upper(),entry.name.upper(),id)) id += 1 pyparsing-2.0.3/examples/list1.py0000664000175000017500000000317212171425201015774 0ustar barrybarryfrom pyparsing import * # first pass lbrack = Literal("[") rbrack = Literal("]") integer = Word(nums).setName("integer") real = Combine(Optional(oneOf("+ -")) + Word(nums) + "." + Optional(Word(nums))).setName("real") listItem = real | integer | quotedString listStr = lbrack + delimitedList(listItem) + rbrack test = "['a', 100, 3.14]" print(listStr.parseString(test)) # second pass, cleanup and add converters lbrack = Literal("[").suppress() rbrack = Literal("]").suppress() cvtInt = lambda s,l,toks: int(toks[0]) integer = Word(nums).setName("integer").setParseAction( cvtInt ) cvtReal = lambda s,l,toks: float(toks[0]) real = Combine(Optional(oneOf("+ -")) + Word(nums) + "." + Optional(Word(nums))).setName("real").setParseAction( cvtReal ) listItem = real | integer | quotedString.setParseAction( removeQuotes ) listStr = lbrack + delimitedList(listItem) + rbrack test = "['a', 100, 3.14]" print(listStr.parseString(test)) # third pass, add nested list support cvtInt = lambda s,l,toks: int(toks[0]) cvtReal = lambda s,l,toks: float(toks[0]) lbrack = Literal("[").suppress() rbrack = Literal("]").suppress() integer = Word(nums).setName("integer").setParseAction( cvtInt ) real = Combine(Optional(oneOf("+ -")) + Word(nums) + "." + Optional(Word(nums))).setName("real").setParseAction( cvtReal ) listStr = Forward() listItem = real | integer | quotedString.setParseAction(removeQuotes) | Group(listStr) listStr << lbrack + delimitedList(listItem) + rbrack test = "['a', 100, 3.14, [ +2.718, 'xyzzy', -1.414] ]" print(listStr.parseString(test))pyparsing-2.0.3/examples/dhcpd_leases_parser.py0000664000175000017500000000613412171425202020734 0ustar barrybarry# # dhcpd_leases_parser.py # # Copyright 2008, Paul McGuire # # Sample parser to parse a dhcpd.leases file to extract leases # and lease attributes # # format ref: http://www.linuxmanpages.com/man5/dhcpd.leases.5.php # sample = r"""\ # All times in this file are in UTC (GMT), not your local timezone. This is # not a bug, so please don't ask about it. There is no portable way to # store leases in the local timezone, so please don't request this as a # feature. If this is inconvenient or confusing to you, we sincerely # apologize. Seriously, though - don't ask. # The format of this file is documented in the dhcpd.leases(5) manual page. # This lease file was written by isc-dhcp-V3.0.4 lease 192.168.0.250 { starts 3 2008/01/23 17:16:41; ends 6 2008/02/02 17:16:41; tstp 6 2008/02/02 17:16:41; binding state free; hardware ethernet 00:17:f2:9b:d8:19; uid "\001\000\027\362\233\330\031"; } lease 192.168.0.198 { starts 1 2008/02/04 13:46:55; ends never; tstp 1 2008/02/04 17:04:14; binding state free; hardware ethernet 00:13:72:d3:3b:98; uid "\001\000\023r\323;\230"; } lease 192.168.0.239 { starts 3 2008/02/06 12:12:03; ends 4 2008/02/07 12:12:03; tstp 4 2008/02/07 12:12:03; binding state free; hardware ethernet 00:1d:09:65:93:26; } """ from pyparsing import * import datetime,time LBRACE,RBRACE,SEMI,QUOTE = map(Suppress,'{};"') ipAddress = Combine(Word(nums) + ('.' + Word(nums))*3) hexint = Word(hexnums,exact=2) macAddress = Combine(hexint + (':'+hexint)*5) hdwType = Word(alphanums) yyyymmdd = Combine((Word(nums,exact=4)|Word(nums,exact=2))+ ('/'+Word(nums,exact=2))*2) hhmmss = Combine(Word(nums,exact=2)+(':'+Word(nums,exact=2))*2) dateRef = oneOf(list("0123456"))("weekday") + yyyymmdd("date") + \ hhmmss("time") def utcToLocalTime(tokens): utctime = datetime.datetime.strptime("%(date)s %(time)s" % tokens, "%Y/%m/%d %H:%M:%S") localtime = utctime-datetime.timedelta(0,time.timezone,0) tokens["utcdate"],tokens["utctime"] = tokens["date"],tokens["time"] tokens["localdate"],tokens["localtime"] = str(localtime).split() del tokens["date"] del tokens["time"] dateRef.setParseAction(utcToLocalTime) startsStmt = "starts" + dateRef + SEMI endsStmt = "ends" + (dateRef | "never") + SEMI tstpStmt = "tstp" + dateRef + SEMI tsfpStmt = "tsfp" + dateRef + SEMI hdwStmt = "hardware" + hdwType("type") + macAddress("mac") + SEMI uidStmt = "uid" + QuotedString('"')("uid") + SEMI bindingStmt = "binding" + Word(alphanums) + Word(alphanums) + SEMI leaseStatement = startsStmt | endsStmt | tstpStmt | tsfpStmt | hdwStmt | \ uidStmt | bindingStmt leaseDef = "lease" + ipAddress("ipaddress") + LBRACE + \ Dict(ZeroOrMore(Group(leaseStatement))) + RBRACE for lease in leaseDef.searchString(sample): print(lease.dump()) print(lease.ipaddress,'->',lease.hardware.mac) print() pyparsing-2.0.3/examples/stateMachine2.py0000664000175000017500000002117112171425202017427 0ustar barrybarry# stateMachine.py # # module to define .pystate import handler # #import imputil import sys import os import types import urllib.parse DEBUG = False from pyparsing import Word, Group, ZeroOrMore, alphas, \ alphanums, ParserElement, ParseException, ParseSyntaxException, \ Empty, LineEnd, OneOrMore, col, Keyword, pythonStyleComment, \ StringEnd, traceParseAction ident = Word(alphas+"_", alphanums+"_$") pythonKeywords = """and as assert break class continue def del elif else except exec finally for from global if import in is lambda None not or pass print raise return try while with yield True False""" pythonKeywords = set(pythonKeywords.split()) def no_keywords_allowed(s,l,t): wd = t[0] if wd in pythonKeywords: errmsg = "cannot not use keyword '%s' " \ "as an identifier" % wd raise ParseException(s,l,errmsg) ident.setParseAction(no_keywords_allowed) stateTransition = ident("fromState") + "->" + ident("toState") stateMachine = Keyword("statemachine") + \ ident("name") + ":" + \ OneOrMore(Group(stateTransition))("transitions") namedStateTransition = (ident("fromState") + \ "-(" + ident("transition") + ")->" + \ ident("toState")) namedStateMachine = Keyword("statemachine") + \ ident("name") + ":" + \ OneOrMore(Group(namedStateTransition))("transitions") def expand_state_definition(source, loc, tokens): indent = " " * (col(loc,source)-1) statedef = [] # build list of states states = set() fromTo = {} for tn in tokens.transitions: states.add(tn.fromState) states.add(tn.toState) fromTo[tn.fromState] = tn.toState # define base class for state classes baseStateClass = tokens.name + "State" statedef.extend([ "class %s(object):" % baseStateClass, " def __str__(self):", " return self.__class__.__name__", " def next_state(self):", " return self._next_state_class()" ]) # define all state classes statedef.extend( "class %s(%s): pass" % (s,baseStateClass) for s in states ) statedef.extend( "%s._next_state_class = %s" % (s,fromTo[s]) for s in states if s in fromTo ) return indent + ("\n"+indent).join(statedef)+"\n" stateMachine.setParseAction(expand_state_definition) def expand_named_state_definition(source,loc,tokens): indent = " " * (col(loc,source)-1) statedef = [] # build list of states and transitions states = set() transitions = set() baseStateClass = tokens.name + "State" fromTo = {} for tn in tokens.transitions: states.add(tn.fromState) states.add(tn.toState) transitions.add(tn.transition) if tn.fromState in fromTo: fromTo[tn.fromState][tn.transition] = tn.toState else: fromTo[tn.fromState] = {tn.transition:tn.toState} # add entries for terminal states for s in states: if s not in fromTo: fromTo[s] = {} # define state transition class statedef.extend([ "class %sTransition:" % baseStateClass, " def __str__(self):", " return self.transitionName", ]) statedef.extend( "%s = %sTransition()" % (tn,baseStateClass) for tn in transitions) statedef.extend("%s.transitionName = '%s'" % (tn,tn) for tn in transitions) # define base class for state classes excmsg = "'" + tokens.name + \ '.%s does not support transition "%s"' \ "'% (self, tn)" statedef.extend([ "class %s(object):" % baseStateClass, " def __str__(self):", " return self.__class__.__name__", " def next_state(self,tn):", " try:", " return self.tnmap[tn]()", " except KeyError:", " raise Exception(%s)" % excmsg, " def __getattr__(self,name):", " raise Exception(%s)" % excmsg, ]) # define all state classes for s in states: statedef.append("class %s(%s): pass" % (s,baseStateClass)) # define state transition maps and transition methods for s in states: trns = list(fromTo[s].items()) statedef.append("%s.tnmap = {%s}" % (s, ",".join("%s:%s" % tn for tn in trns)) ) statedef.extend([ "%s.%s = staticmethod(lambda : %s())" % (s,tn_,to_) for tn_,to_ in trns ]) return indent + ("\n"+indent).join(statedef) + "\n" namedStateMachine.setParseAction( expand_named_state_definition) #====================================================================== # NEW STUFF - Matt Anderson, 2009-11-26 #====================================================================== class SuffixImporter(object): """An importer designed using the mechanism defined in :pep:`302`. I read the PEP, and also used Doug Hellmann's PyMOTW article `Modules and Imports`_, as a pattern. .. _`Modules and Imports`: http://www.doughellmann.com/PyMOTW/sys/imports.html Define a subclass that specifies a :attr:`suffix` attribute, and implements a :meth:`process_filedata` method. Then call the classmethod :meth:`register` on your class to actually install it in the appropriate places in :mod:`sys`. """ scheme = 'suffix' suffix = None path_entry = None @classmethod def trigger_url(cls): if cls.suffix is None: raise ValueError('%s.suffix is not set' % cls.__name__) return 'suffix:%s' % cls.suffix @classmethod def register(cls): sys.path_hooks.append(cls) sys.path.append(cls.trigger_url()) def __init__(self, path_entry): pr = urllib.parse.urlparse(str(path_entry)) if pr.scheme != self.scheme or pr.path != self.suffix: raise ImportError() self.path_entry = path_entry self._found = {} def checkpath_iter(self, fullname): for dirpath in sys.path: # if the value in sys.path_importer_cache is None, then this # path *should* be imported by the builtin mechanism, and the # entry is thus a path to a directory on the filesystem; # if it's not None, then some other importer is in charge, and # it probably isn't even a filesystem path if sys.path_importer_cache.get(dirpath,False) is None: checkpath = os.path.join( dirpath,'%s.%s' % (fullname,self.suffix)) yield checkpath def find_module(self, fullname, path=None): for checkpath in self.checkpath_iter(fullname): if os.path.isfile(checkpath): self._found[fullname] = checkpath return self return None def load_module(self, fullname): assert fullname in self._found if fullname in sys.modules: module = sys.modules[fullname] else: sys.modules[fullname] = module = types.ModuleType(fullname) data = None f = open(self._found[fullname]) try: data = f.read() finally: f.close() module.__dict__.clear() module.__file__ = self._found[fullname] module.__name__ = fullname module.__loader__ = self self.process_filedata(module, data) return module def process_filedata(self, module, data): pass class PystateImporter(SuffixImporter): suffix = 'pystate' def process_filedata(self, module, data): # MATT-NOTE: re-worked :func:`get_state_machine` # convert any statemachine expressions stateMachineExpr = (stateMachine | namedStateMachine).ignore( pythonStyleComment) generated_code = stateMachineExpr.transformString(data) if DEBUG: print(generated_code) # compile code object from generated code # (strip trailing spaces and tabs, compile doesn't like # dangling whitespace) COMPILE_MODE = 'exec' codeobj = compile(generated_code.rstrip(" \t"), module.__file__, COMPILE_MODE) exec(codeobj, module.__dict__) PystateImporter.register() pyparsing-2.0.3/examples/SimpleCalc.py0000664000175000017500000000605312171425202016756 0ustar barrybarry# SimpleCalc.py # # Demonstration of the parsing module, # Sample usage # # $ python SimpleCalc.py # Type in the string to be parse or 'quit' to exit the program # > g=67.89 + 7/5 # 69.29 # > g # 69.29 # > h=(6*g+8.8)-g # 355.25 # > h + 1 # 356.25 # > 87.89 + 7/5 # 89.29 # > ans+10 # 99.29 # > quit # Good bye! # # # Uncomment the line below for readline support on interactive terminal # import readline from pyparsing import ParseException, Word, alphas, alphanums import math # Debugging flag can be set to either "debug_flag=True" or "debug_flag=False" debug_flag=False variables = {} from fourFn import BNF, exprStack, fn, opn def evaluateStack( s ): op = s.pop() if op == 'unary -': return -evaluateStack( s ) if op in "+-*/^": op2 = evaluateStack( s ) op1 = evaluateStack( s ) return opn[op]( op1, op2 ) elif op == "PI": return math.pi # 3.1415926535 elif op == "E": return math.e # 2.718281828 elif op in fn: return fn[op]( evaluateStack( s ) ) elif op[0].isalpha(): if op in variables: return variables[op] raise Exception("invalid identifier '%s'" % op) else: return float( op ) arithExpr = BNF() ident = Word(alphas, alphanums).setName("identifier") assignment = ident("varname") + '=' + arithExpr pattern = assignment | arithExpr if __name__ == '__main__': # input_string input_string='' # Display instructions on how to quit the program print("Type in the string to be parsed or 'quit' to exit the program") input_string = input("> ") while input_string != 'quit': if input_string.lower() == 'debug': debug_flag=True input_string = input("> ") continue # Reset to an empty exprStack del exprStack[:] if input_string != '': # try parsing the input string try: L=pattern.parseString( input_string, parseAll=True ) except ParseException as err: L=['Parse Failure',input_string] # show result of parsing the input string if debug_flag: print(input_string, "->", L) if len(L)==0 or L[0] != 'Parse Failure': if debug_flag: print("exprStack=", exprStack) # calculate result , store a copy in ans , display the result to user try: result=evaluateStack(exprStack) except Exception as e: print(str(e)) else: variables['ans']=result print(result) # Assign result to a variable if required if L.varname: variables[L.varname] = result if debug_flag: print("variables=",variables) else: print('Parse Failure') print(err.line) print(" "*(err.column-1) + "^") print(err) # obtain new input string input_string = input("> ") # if user type 'quit' then say goodbye print("Good bye!") pyparsing-2.0.3/examples/datetimeParseActions.py0000664000175000017500000000305612053623307021057 0ustar barrybarry# parseActions.py # # A sample program a parser to match a date string of the form "YYYY/MM/DD", # and return it as a datetime, or raise an exception if not a valid date. # # Copyright 2012, Paul T. McGuire # from datetime import datetime from pyparsing import * # define an integer string, and a parse action to convert it # to an integer at parse time integer = Word(nums) def convertToInt(tokens): # no need to test for validity - we can't get here # unless tokens[0] contains all numeric digits return int(tokens[0]) integer.setParseAction(convertToInt) # or can be written as one line as #integer = Word(nums).setParseAction(lambda t: int(t[0])) # define a pattern for a year/month/day date date = integer('year') + '/' + integer('month') + '/' + integer('day') def convertToDatetime(s,loc,tokens): try: # note that the year, month, and day fields were already # converted to ints from strings by the parse action defined # on the integer expression above return datetime(tokens.year, tokens.month, tokens.day) except Exception as ve: errmsg = "'%d/%d/%d' is not a valid date, %s" % \ (tokens.year, tokens.month, tokens.day, ve) raise ParseException(s, loc, errmsg) date.setParseAction(convertToDatetime) def test(s): try: print(date.parseString(s)) except ParseException as pe: print(pe) test("2000/1/1") test("2000/13/1") # invalid month test("1900/2/29") # 1900 was not a leap year test("2000/2/29") # but 2000 was pyparsing-2.0.3/examples/parseListString.py0000664000175000017500000000742712171425201020104 0ustar barrybarry# parseListString.py # # Copyright, 2006, by Paul McGuire # from pyparsing import * # first pass lbrack = Literal("[") rbrack = Literal("]") integer = Word(nums).setName("integer") real = Combine(Optional(oneOf("+ -")) + Word(nums) + "." + Optional(Word(nums))).setName("real") listItem = real | integer | quotedString listStr = lbrack + delimitedList(listItem) + rbrack test = "['a', 100, 3.14]" print(listStr.parseString(test)) # second pass, cleanup and add converters lbrack = Literal("[").suppress() rbrack = Literal("]").suppress() cvtInt = lambda s,l,toks: int(toks[0]) integer = Word(nums).setName("integer").setParseAction( cvtInt ) cvtReal = lambda s,l,toks: float(toks[0]) real = Combine(Optional(oneOf("+ -")) + Word(nums) + "." + Optional(Word(nums))).setName("real").setParseAction( cvtReal ) listItem = real | integer | quotedString.setParseAction( removeQuotes ) listStr = lbrack + delimitedList(listItem) + rbrack test = "['a', 100, 3.14]" print(listStr.parseString(test)) # third pass, add nested list support, and tuples, too! cvtInt = lambda s,l,toks: int(toks[0]) cvtReal = lambda s,l,toks: float(toks[0]) lbrack = Literal("[").suppress() rbrack = Literal("]").suppress() integer = Word(nums).setName("integer").setParseAction( cvtInt ) real = Combine(Optional(oneOf("+ -")) + Word(nums) + "." + Optional(Word(nums))).setName("real").setParseAction( cvtReal ) tupleStr = Forward() listStr = Forward() listItem = real | integer | quotedString.setParseAction(removeQuotes) | Group(listStr) | tupleStr tupleStr << ( Suppress("(") + delimitedList(listItem) + Optional(Suppress(",")) + Suppress(")") ) tupleStr.setParseAction( lambda t:tuple(t.asList()) ) listStr << lbrack + delimitedList(listItem) + Optional(Suppress(",")) + rbrack test = "['a', 100, ('A', [101,102]), 3.14, [ +2.718, 'xyzzy', -1.414] ]" print(listStr.parseString(test)) # fourth pass, just parsing tuples of numbers #~ from pyparsing import * #~ integer = (Word(nums)|Word('-+',nums)).setName("integer") #~ real = Combine(integer + "." + Optional(Word(nums))).setName("real") #~ tupleStr = Forward().setName("tuple") #~ tupleItem = real | integer | tupleStr #~ tupleStr << ( Suppress("(") + delimitedList(tupleItem) + #~ Optional(Suppress(",")) + Suppress(")") ) #~ # add parse actions to do conversion during parsing #~ integer.setParseAction( lambda toks: int(toks[0]) ) #~ real.setParseAction( lambda toks: float(toks[0]) ) #~ tupleStr.setParseAction( lambda toks: tuple(toks) ) #~ s = '((1,2), (3,4), (-5,9.2),)' #~ print tupleStr.parseString(s)[0] cvtInt = lambda s,l,toks: int(toks[0]) cvtReal = lambda s,l,toks: float(toks[0]) cvtDict = lambda s,l,toks: dict(toks[0]) lbrack = Literal("[").suppress() rbrack = Literal("]").suppress() lbrace = Literal("{").suppress() rbrace = Literal("}").suppress() colon = Literal(":").suppress() integer = Word(nums).setName("integer").setParseAction( cvtInt ) real = Combine(Optional(oneOf("+ -")) + Word(nums) + "." + Optional(Word(nums))).setName("real").setParseAction( cvtReal ) tupleStr = Forward() listStr = Forward() dictStr = Forward() listItem = real | integer | quotedString.setParseAction(removeQuotes) | Group(listStr) | tupleStr | dictStr tupleStr << ( Suppress("(") + delimitedList(listItem) + Optional(Suppress(",")) + Suppress(")") ) tupleStr.setParseAction( lambda t:tuple(t.asList()) ) listStr << lbrack + delimitedList(listItem) + Optional(Suppress(",")) + rbrack dictStr << rbrace + delimitedList( Group( listItem + colon + listItem ) ) + rbrace test = "['a', 100, ('A', [101,102]), 3.14, [ +2.718, 'xyzzy', -1.414] ]" test = '[{0: [2], 1: []}, {0: [], 1: [], 2: []}, {0: [1, 2]}]' print(listStr.parseString(test)) pyparsing-2.0.3/examples/deltaTime.py0000664000175000017500000001561312171425201016653 0ustar barrybarry# deltaTime.py # # Parser to convert a conversational time reference such as "in a minute" or # "noon tomorrow" and convert it to a Python datetime. The returned # ParseResults object contains the results name "timeOffset" containing # the timedelta, and "calculatedTime" containing the computed time relative # to datetime.now(). # # Copyright 2010, by Paul McGuire # from datetime import datetime, timedelta from pyparsing import * import calendar __all__ = ["nlTimeExpression"] # string conversion parse actions def convertToTimedelta(toks): unit = toks.timeunit.lower().rstrip("s") td = { 'week' : timedelta(7), 'day' : timedelta(1), 'hour' : timedelta(0,0,0,0,0,1), 'minute' : timedelta(0,0,0,0,1), 'second' : timedelta(0,1), }[unit] if toks.qty: td *= int(toks.qty) if toks.dir: td *= toks.dir toks["timeOffset"] = td def convertToDay(toks): now = datetime.now() if "wkdayRef" in toks: todaynum = now.weekday() daynames = [n.lower() for n in calendar.day_name] nameddaynum = daynames.index(toks.wkdayRef.day.lower()) if toks.wkdayRef.dir > 0: daydiff = (nameddaynum + 7 - todaynum) % 7 else: daydiff = -((todaynum + 7 - nameddaynum) % 7) toks["absTime"] = datetime(now.year, now.month, now.day)+timedelta(daydiff) else: name = toks.name.lower() toks["absTime"] = { "now" : now, "today" : datetime(now.year, now.month, now.day), "yesterday" : datetime(now.year, now.month, now.day)+timedelta(-1), "tomorrow" : datetime(now.year, now.month, now.day)+timedelta(+1), }[name] def convertToAbsTime(toks): now = datetime.now() if "dayRef" in toks: day = toks.dayRef.absTime day = datetime(day.year, day.month, day.day) else: day = datetime(now.year, now.month, now.day) if "timeOfDay" in toks: if isinstance(toks.timeOfDay,str): timeOfDay = { "now" : timedelta(0, (now.hour*60+now.minute)*60+now.second, now.microsecond), "noon" : timedelta(0,0,0,0,0,12), "midnight" : timedelta(), }[toks.timeOfDay] else: hhmmss = toks.timeparts if hhmmss.miltime: hh,mm = hhmmss.miltime ss = 0 else: hh,mm,ss = (hhmmss.HH % 12), hhmmss.MM, hhmmss.SS if not mm: mm = 0 if not ss: ss = 0 if toks.timeOfDay.ampm == 'pm': hh += 12 timeOfDay = timedelta(0, (hh*60+mm)*60+ss, 0) else: timeOfDay = timedelta(0, (now.hour*60+now.minute)*60+now.second, now.microsecond) toks["absTime"] = day + timeOfDay def calculateTime(toks): if toks.absTime: absTime = toks.absTime else: absTime = datetime.now() if toks.timeOffset: absTime += toks.timeOffset toks["calculatedTime"] = absTime # grammar definitions CL = CaselessLiteral today, tomorrow, yesterday, noon, midnight, now = map( CL, "today tomorrow yesterday noon midnight now".split()) plural = lambda s : Combine(CL(s) + Optional(CL("s"))) week, day, hour, minute, second = map( plural, "week day hour minute second".split()) am = CL("am") pm = CL("pm") COLON = Suppress(':') # are these actually operators? in_ = CL("in").setParseAction(replaceWith(1)) from_ = CL("from").setParseAction(replaceWith(1)) before = CL("before").setParseAction(replaceWith(-1)) after = CL("after").setParseAction(replaceWith(1)) ago = CL("ago").setParseAction(replaceWith(-1)) next_ = CL("next").setParseAction(replaceWith(1)) last_ = CL("last").setParseAction(replaceWith(-1)) at_ = CL("at") couple = (Optional(CL("a")) + CL("couple") + Optional(CL("of"))).setParseAction(replaceWith(2)) a_qty = CL("a").setParseAction(replaceWith(1)) integer = Word(nums).setParseAction(lambda t:int(t[0])) int4 = Group(Word(nums,exact=4).setParseAction(lambda t: [int(t[0][:2]),int(t[0][2:])] )) qty = integer | couple | a_qty dayName = oneOf( list(calendar.day_name) ) dayOffset = (qty("qty") + (week | day)("timeunit")) dayFwdBack = (from_ + now.suppress() | ago)("dir") weekdayRef = (Optional(next_ | last_,1)("dir") + dayName("day")) dayRef = Optional( (dayOffset + (before | after | from_)("dir") ).setParseAction(convertToTimedelta) ) + \ ((yesterday | today | tomorrow)("name")| weekdayRef("wkdayRef")).setParseAction(convertToDay) todayRef = (dayOffset + dayFwdBack).setParseAction(convertToTimedelta) | \ (in_("dir") + qty("qty") + day("timeunit")).setParseAction(convertToTimedelta) dayTimeSpec = dayRef | todayRef dayTimeSpec.setParseAction(calculateTime) relativeTimeUnit = (week | day | hour | minute | second) timespec = Group(int4("miltime") | integer("HH") + Optional(COLON + integer("MM")) + Optional(COLON + integer("SS")) + (am | pm)("ampm") ) absTimeSpec = ((noon | midnight | now | timespec("timeparts"))("timeOfDay") + Optional(dayRef)("dayRef") | dayRef("dayRef") + at_ + (noon | midnight | now | timespec("timeparts"))("timeOfDay")) absTimeSpec.setParseAction(convertToAbsTime,calculateTime) relTimeSpec = qty("qty") + relativeTimeUnit("timeunit") + \ (from_ | before | after)("dir") + \ Optional(at_) + \ absTimeSpec("absTime") | \ qty("qty") + relativeTimeUnit("timeunit") + ago("dir") | \ in_ + qty("qty") + relativeTimeUnit("timeunit") relTimeSpec.setParseAction(convertToTimedelta,calculateTime) nlTimeExpression = (absTimeSpec + Optional(dayTimeSpec) | dayTimeSpec + Optional(Optional(at_) + absTimeSpec) | relTimeSpec + Optional(absTimeSpec)) # test grammar tests = """\ today tomorrow yesterday in a couple of days a couple of days from now a couple of days from today in a day 3 days ago 3 days from now a day ago in 2 weeks in 3 days at 5pm now 10 minutes ago 10 minutes from now in 10 minutes in a minute in a couple of minutes 20 seconds ago in 30 seconds 20 seconds before noon 20 seconds before noon tomorrow noon midnight noon tomorrow 6am tomorrow 0800 yesterday 12:15 AM today 3pm 2 days from today a week from today a week from now 3 weeks ago noon next Sunday noon Sunday noon last Sunday 2pm next Sunday next Sunday at 2pm""".splitlines() for t in tests: print(t, "(relative to %s)" % datetime.now()) res = nlTimeExpression.parseString(t) if "calculatedTime" in res: print(res.calculatedTime) else: print("???") print() pyparsing-2.0.3/examples/commasep.py0000664000175000017500000000135012171425201016540 0ustar barrybarry# commasep.py # # comma-separated list example, to illustrate the advantages of using # the pyparsing commaSeparatedList as opposed to string.split(","): # - leading and trailing whitespace is implicitly trimmed from list elements # - list elements can be quoted strings, which can safely contain commas without breaking # into separate elements from pyparsing import commaSeparatedList testData = [ "a,b,c,100.2,,3", "d, e, j k , m ", "'Hello, World', f, g , , 5.1,x", "John Doe, 123 Main St., Cleveland, Ohio", "Jane Doe, 456 St. James St., Los Angeles , California ", "", ] for line in testData: print(commaSeparatedList.parseString(line)) print(line.split(",")) print() pyparsing-2.0.3/examples/holaMundo.py0000664000175000017500000000206312171425202016665 0ustar barrybarry# -*- coding: UTF-8 -*- # escrito por Marco Alfonso, 2004 Noviembre # importamos el modulo from pyparsing import * saludo= Word(alphas) + ',' + Word(alphas) + '!' # Aqui decimos que la gramatica "saludo" DEBE contener # una palabra compuesta de caracteres alfanumericos # (Word(alphas)) mas una ',' mas otra palabra alfanumerica, # mas '!' y esos seian nuestros tokens tokens = saludo.parseString("Hola, Mundo !") # Ahora parseamos una cadena, "Hola, Mundo!", # el metodo parseString, nos devuelve una lista con los tokens # encontrados, en caso de no haber errores... for i in range(len(tokens)): print ("Token %d -> %s" % (i,tokens[i])) #imprimimos cada uno de los tokens Y listooo!!, he aqu la salida # Token 0> Hola Token 1> , Token 2> Mundo Token 3> ! # Por supuesto, se pueden reutilizar gramticas, por ejemplo: numimag = Word(nums) + 'i' numreal = Word(nums) numcomplex = numreal + '+' + numimag print (numcomplex.parseString("3+5i")) # Excelente!!, bueno, los dejo, me voy a seguir tirando cdigo pyparsing-2.0.3/examples/matchPreviousDemo.py0000664000175000017500000000111312171425201020367 0ustar barrybarry# # matchPreviousDemo.py # from pyparsing import * src = """ class a ... end a; class b ... end b; class c ... end d;""" identifier = Word(alphas) classIdent = identifier("classname") # note that this also makes a copy of identifier classHead = "class" + classIdent classBody = "..." classEnd = "end" + matchPreviousLiteral(classIdent) + ';' classDefn = classHead + classBody + classEnd # use this form to catch syntax error # classDefn = classHead + classBody - classEnd for tokens in classDefn.searchString(src): print(tokens.classname)pyparsing-2.0.3/examples/excelExpr.py0000664000175000017500000000442612171425201016702 0ustar barrybarry# excelExpr.py # # Copyright 2010, Paul McGuire # # A partial implementation of a parser of Excel formula expressions. # from pyparsing import (CaselessKeyword, Suppress, Word, alphas, alphanums, nums, Optional, Group, oneOf, Forward, Regex, operatorPrecedence, opAssoc, dblQuotedString, delimitedList, Combine, Literal, QuotedString) EQ,EXCL,LPAR,RPAR,COLON,COMMA = map(Suppress, '=!():,') EXCL, DOLLAR = map(Literal,"!$") sheetRef = Word(alphas, alphanums) | QuotedString("'",escQuote="''") colRef = Optional(DOLLAR) + Word(alphas,max=2) rowRef = Optional(DOLLAR) + Word(nums) cellRef = Combine(Group(Optional(sheetRef + EXCL)("sheet") + colRef("col") + rowRef("row"))) cellRange = (Group(cellRef("start") + COLON + cellRef("end"))("range") | cellRef | Word(alphas,alphanums)) expr = Forward() COMPARISON_OP = oneOf("< = > >= <= != <>") condExpr = expr + COMPARISON_OP + expr ifFunc = (CaselessKeyword("if") + LPAR + Group(condExpr)("condition") + COMMA + expr("if_true") + COMMA + expr("if_false") + RPAR) statFunc = lambda name : CaselessKeyword(name) + LPAR + delimitedList(expr) + RPAR sumFunc = statFunc("sum") minFunc = statFunc("min") maxFunc = statFunc("max") aveFunc = statFunc("ave") funcCall = ifFunc | sumFunc | minFunc | maxFunc | aveFunc multOp = oneOf("* /") addOp = oneOf("+ -") numericLiteral = Regex(r"\-?\d+(\.\d+)?") operand = numericLiteral | funcCall | cellRange | cellRef arithExpr = operatorPrecedence(operand, [ (multOp, 2, opAssoc.LEFT), (addOp, 2, opAssoc.LEFT), ]) textOperand = dblQuotedString | cellRef textExpr = operatorPrecedence(textOperand, [ ('&', 2, opAssoc.LEFT), ]) expr << (arithExpr | textExpr) test1 = "=3*A7+5" test2 = "=3*Sheet1!$A$7+5" test2a ="=3*'Sheet 1'!$A$7+5" test2b ="=3*'O''Reilly''s sheet'!$A$7+5" test3 = "=if(Sum(A1:A25)>42,Min(B1:B25), " \ "if(Sum(C1:C25)>3.14, (Min(C1:C25)+3)*18,Max(B1:B25)))" test3a = "=sum(a1:a25,10,min(b1,c2,d3))" import pprint tests = [locals()[t] for t in list(locals().keys()) if t.startswith("test")] for test in tests: print(test) pprint.pprint( (EQ + expr).parseString(test,parseAll=True).asList() ) print() pyparsing-2.0.3/examples/scanExamples.py0000664000175000017500000000447312171425201017370 0ustar barrybarry# # scanExamples.py # # Illustration of using pyparsing's scanString,transformString, and searchString methods # # Copyright (c) 2004, 2006 Paul McGuire # from pyparsing import Word, alphas, alphanums, Literal, restOfLine, OneOrMore, \ empty, Suppress, replaceWith # simulate some C++ code testData = """ #define MAX_LOCS=100 #define USERNAME = "floyd" #define PASSWORD = "swordfish" a = MAX_LOCS; CORBA::initORB("xyzzy", USERNAME, PASSWORD ); """ ################# print("Example of an extractor") print("----------------------") # simple grammar to match #define's ident = Word(alphas, alphanums+"_") macroDef = Literal("#define") + ident.setResultsName("name") + "=" + restOfLine.setResultsName("value") for t,s,e in macroDef.scanString( testData ): print(t.name,":", t.value) # or a quick way to make a dictionary of the names and values # (return only key and value tokens, and construct dict from key-value pairs) # - empty ahead of restOfLine advances past leading whitespace, does implicit lstrip during parsing macroDef = Suppress("#define") + ident + Suppress("=") + empty + restOfLine macros = dict(list(macroDef.searchString(testData))) print("macros =", macros) print() ################# print("Examples of a transformer") print("----------------------") # convert C++ namespaces to mangled C-compatible names scopedIdent = ident + OneOrMore( Literal("::").suppress() + ident ) scopedIdent.setParseAction(lambda t: "_".join(t)) print("(replace namespace-scoped names with C-compatible names)") print(scopedIdent.transformString( testData )) # or a crude pre-processor (use parse actions to replace matching text) def substituteMacro(s,l,t): if t[0] in macros: return macros[t[0]] ident.setParseAction( substituteMacro ) ident.ignore(macroDef) print("(simulate #define pre-processor)") print(ident.transformString( testData )) ################# print("Example of a stripper") print("----------------------") from pyparsing import dblQuotedString, LineStart # remove all string macro definitions (after extracting to a string resource table?) stringMacroDef = Literal("#define") + ident + "=" + dblQuotedString + LineStart() stringMacroDef.setParseAction( replaceWith("") ) print(stringMacroDef.transformString( testData )) pyparsing-2.0.3/examples/antlr_grammar_tests.py0000664000175000017500000000470312171425201021011 0ustar barrybarry''' Created on 4 sept. 2010 @author: luca ''' import unittest import antlr_grammar class Test(unittest.TestCase): def testOptionsSpec(self): text = """options { language = Python; }""" antlr_grammar.optionsSpec.parseString(text) #@UndefinedVariable def testTokensSpec(self): text = """tokens { PLUS = '+' ; MINUS = '-' ; MULT = '*' ; DIV = '/' ; }""" antlr_grammar.tokensSpec.parseString(text) #@UndefinedVariable def testBlock(self): text = """( PLUS | MINUS )""" antlr_grammar.block.parseString(text) #@UndefinedVariable def testRule(self): text = """expr : term ( ( PLUS | MINUS ) term )* ;""" antlr_grammar.rule.parseString(text) #@UndefinedVariable def testLexerRule(self): text = """fragment DIGIT : '0'..'9' ;""" antlr_grammar.rule.parseString(text) #@UndefinedVariable def testLexerRule2(self): text = """WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; } ;""" #antlr_grammar.rule.parseString(text) #@UndefinedVariable def testGrammar(self): text = """grammar SimpleCalc; options { language = Python; } tokens { PLUS = '+' ; MINUS = '-' ; MULT = '*' ; DIV = '/' ; } /*------------------------------------------------------------------ * PARSER RULES *------------------------------------------------------------------*/ expr : term ( ( PLUS | MINUS ) term )* ; term : factor ( ( MULT | DIV ) factor )* ; factor : NUMBER ; /*------------------------------------------------------------------ * LEXER RULES *------------------------------------------------------------------*/ NUMBER : (DIGIT)+ ; /* WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; } ; */ fragment DIGIT : '0'..'9' ;""" antlrGrammarTree = antlr_grammar.grammarDef.parseString(text) #@UndefinedVariable pyparsingRules = antlr_grammar.antlrConverter(antlrGrammarTree) pyparsingRule = pyparsingRules["expr"] pyparsingTree = pyparsingRule.parseString("2 - 5 * 42 + 7 / 25") self.assertNotEqual(None, pyparsingTree) if __name__ == "__main__": #import sys;sys.argv = ['', 'Test.testOptionsSpec'] unittest.main()pyparsing-2.0.3/examples/simpleArith.py0000664000175000017500000000442312171425201017221 0ustar barrybarry# # simpleArith.py # # Example of defining an arithmetic expression parser using # the operatorPrecedence helper method in pyparsing. # # Copyright 2006, by Paul McGuire # from pyparsing import * integer = Word(nums).setParseAction(lambda t:int(t[0])) variable = Word(alphas,exact=1) operand = integer | variable expop = Literal('^') signop = oneOf('+ -') multop = oneOf('* /') plusop = oneOf('+ -') factop = Literal('!') # To use the operatorPrecedence helper: # 1. Define the "atom" operand term of the grammar. # For this simple grammar, the smallest operand is either # and integer or a variable. This will be the first argument # to the operatorPrecedence method. # 2. Define a list of tuples for each level of operator # precendence. Each tuple is of the form # (opExpr, numTerms, rightLeftAssoc, parseAction), where # - opExpr is the pyparsing expression for the operator; # may also be a string, which will be converted to a Literal # - numTerms is the number of terms for this operator (must # be 1 or 2) # - rightLeftAssoc is the indicator whether the operator is # right or left associative, using the pyparsing-defined # constants opAssoc.RIGHT and opAssoc.LEFT. # - parseAction is the parse action to be associated with # expressions matching this operator expression (the # parse action tuple member may be omitted) # 3. Call operatorPrecedence passing the operand expression and # the operator precedence list, and save the returned value # as the generated pyparsing expression. You can then use # this expression to parse input strings, or incorporate it # into a larger, more complex grammar. # expr = operatorPrecedence( operand, [("!", 1, opAssoc.LEFT), ("^", 2, opAssoc.RIGHT), (signop, 1, opAssoc.RIGHT), (multop, 2, opAssoc.LEFT), (plusop, 2, opAssoc.LEFT),] ) test = ["9 + 2 + 3", "9 + 2 * 3", "(9 + 2) * 3", "(9 + -2) * 3", "(9 + -2) * 3^2^2", "(9! + -2) * 3^2^2", "M*X + B", "M*(X + B)", "1+2*-3^4*5+-+-6",] for t in test: print(t) print(expr.parseString(t)) print() pyparsing-2.0.3/examples/urlExtractorNew.py0000664000175000017500000000270312171425201020107 0ustar barrybarry# URL extractor # Copyright 2004, Paul McGuire from pyparsing import Literal,Suppress,CharsNotIn,CaselessLiteral,\ Word,dblQuotedString,alphanums,SkipTo,makeHTMLTags import urllib.request, urllib.parse, urllib.error import pprint # Define the pyparsing grammar for a URL, that is: # URLlink ::= linkText # URL ::= doubleQuotedString | alphanumericWordPath # Note that whitespace may appear just about anywhere in the link. Note also # that it is not necessary to explicitly show this in the pyparsing grammar; by default, # pyparsing skips over whitespace between tokens. linkOpenTag,linkCloseTag = makeHTMLTags("a") link = linkOpenTag + SkipTo(linkCloseTag).setResultsName("body") + linkCloseTag.suppress() # Go get some HTML with some links in it. serverListPage = urllib.request.urlopen( "http://www.google.com" ) htmlText = serverListPage.read() serverListPage.close() # scanString is a generator that loops through the input htmlText, and for each # match yields the tokens and start and end locations (for this application, we are # not interested in the start and end values). for toks,strt,end in link.scanString(htmlText): print(toks.startA.href,"->",toks.body) # Create dictionary from list comprehension, assembled from each pair of tokens returned # from a matched URL. pprint.pprint( dict( [ (toks.body,toks.startA.href) for toks,strt,end in link.scanString(htmlText) ] ) ) pyparsing-2.0.3/examples/test_bibparse.py0000664000175000017500000001727312171425201017575 0ustar barrybarry""" Test for bibparse grammar """ from os.path import join as pjoin, dirname from pyparsing import ParseException from btpyparse import Macro import btpyparse as bp from nose.tools import assert_true, assert_false, assert_equal, assert_raises def test_names(): # check various types of names # All names can contains alphas, but not some special chars bad_chars = '"#%\'(),={}' for name_type, dig1f in ((bp.macro_def, False), (bp.field_name, False), (bp.entry_type, False), (bp.cite_key, True)): if dig1f: # can start with digit assert_equal(name_type.parseString('2t')[0], '2t') else: assert_raises(ParseException, name_type.parseString, '2t') # All of the names cannot contain some characters for char in bad_chars: assert_raises(ParseException, name_type.parseString, char) # standard strings all OK assert_equal(name_type.parseString('simple_test')[0], 'simple_test') # Test macro ref mr = bp.macro_ref # can't start with digit assert_raises(ParseException, mr.parseString, '2t') for char in bad_chars: assert_raises(ParseException, mr.parseString, char) assert_equal(mr.parseString('simple_test')[0].name, 'simple_test') def test_numbers(): assert_equal(bp.number.parseString('1066')[0], '1066') assert_equal(bp.number.parseString('0')[0], '0') assert_raises(ParseException, bp.number.parseString, '-4') assert_raises(ParseException, bp.number.parseString, '+4') assert_raises(ParseException, bp.number.parseString, '.4') # something point something leaves a trailing .4 unmatched assert_equal(bp.number.parseString('0.4')[0], '0') def test_parse_string(): # test string building blocks assert_equal(bp.chars_no_quotecurly.parseString('x')[0], 'x') assert_equal(bp.chars_no_quotecurly.parseString("a string")[0], 'a string') assert_equal(bp.chars_no_quotecurly.parseString('a "string')[0], 'a ') assert_equal(bp.chars_no_curly.parseString('x')[0], 'x') assert_equal(bp.chars_no_curly.parseString("a string")[0], 'a string') assert_equal(bp.chars_no_curly.parseString('a {string')[0], 'a ') assert_equal(bp.chars_no_curly.parseString('a }string')[0], 'a ') # test more general strings together for obj in (bp.curly_string, bp.string, bp.field_value): assert_equal(obj.parseString('{}').asList(), []) assert_equal(obj.parseString('{a "string}')[0], 'a "string') assert_equal(obj.parseString('{a {nested} string}').asList(), ['a ', ['nested'], ' string']) assert_equal(obj.parseString('{a {double {nested}} string}').asList(), ['a ', ['double ', ['nested']], ' string']) for obj in (bp.quoted_string, bp.string, bp.field_value): assert_equal(obj.parseString('""').asList(), []) assert_equal(obj.parseString('"a string"')[0], 'a string') assert_equal(obj.parseString('"a {nested} string"').asList(), ['a ', ['nested'], ' string']) assert_equal(obj.parseString('"a {double {nested}} string"').asList(), ['a ', ['double ', ['nested']], ' string']) # check macro def in string assert_equal(bp.string.parseString('someascii')[0], Macro('someascii')) assert_raises(ParseException, bp.string.parseString, '%#= validstring') # check number in string assert_equal(bp.string.parseString('1994')[0], '1994') def test_parse_field(): # test field value - hashes included fv = bp.field_value # Macro assert_equal(fv.parseString('aname')[0], Macro('aname')) assert_equal(fv.parseString('ANAME')[0], Macro('aname')) # String and macro assert_equal(fv.parseString('aname # "some string"').asList(), [Macro('aname'), 'some string']) # Nested string assert_equal(fv.parseString('aname # {some {string}}').asList(), [Macro('aname'), 'some ', ['string']]) # String and number assert_equal(fv.parseString('"a string" # 1994').asList(), ['a string', '1994']) # String and number and macro assert_equal(fv.parseString('"a string" # 1994 # a_macro').asList(), ['a string', '1994', Macro('a_macro')]) def test_comments(): res = bp.comment.parseString('@Comment{about something}') assert_equal(res.asList(), ['comment', '{about something}']) assert_equal( bp.comment.parseString('@COMMENT{about something').asList(), ['comment', '{about something']) assert_equal( bp.comment.parseString('@comment(about something').asList(), ['comment', '(about something']) assert_equal( bp.comment.parseString('@COMment about something').asList(), ['comment', ' about something']) assert_raises(ParseException, bp.comment.parseString, '@commentabout something') assert_raises(ParseException, bp.comment.parseString, '@comment+about something') assert_raises(ParseException, bp.comment.parseString, '@comment"about something') def test_preamble(): res = bp.preamble.parseString('@preamble{"about something"}') assert_equal(res.asList(), ['preamble', 'about something']) assert_equal(bp.preamble.parseString( '@PREamble{{about something}}').asList(), ['preamble', 'about something']) assert_equal(bp.preamble.parseString("""@PREamble{ {about something} }""").asList(), ['preamble', 'about something']) def test_macro(): res = bp.macro.parseString('@string{ANAME = "about something"}') assert_equal(res.asList(), ['string', 'aname', 'about something']) assert_equal( bp.macro.parseString('@string{aname = {about something}}').asList(), ['string', 'aname', 'about something']) def test_entry(): txt = """@some_entry{akey, aname = "about something", another={something else}}""" res = bp.entry.parseString(txt) assert_equal(res.asList(), ['some_entry', 'akey', ['aname', 'about something'], ['another', 'something else']]) # Case conversion txt = """@SOME_ENTRY{akey, ANAME = "about something", another={something else}}""" res = bp.entry.parseString(txt) assert_equal(res.asList(), ['some_entry', 'akey', ['aname', 'about something'], ['another', 'something else']]) def test_bibfile(): txt = """@some_entry{akey, aname = "about something", another={something else}}""" res = bp.bibfile.parseString(txt) assert_equal(res.asList(), [['some_entry', 'akey', ['aname', 'about something'], ['another', 'something else']]]) def test_bib1(): # First pass whole bib-like tests txt = """ Some introductory text (implicit comment) @ARTICLE{Brett2002marsbar, author = {Matthew Brett and Jean-Luc Anton and Romain Valabregue and Jean-Baptise Poline}, title = {{Region of interest analysis using an SPM toolbox}}, journal = {Neuroimage}, year = {2002}, volume = {16}, pages = {1140--1141}, number = {2} } @some_entry{akey, aname = "about something", another={something else}} """ res = bp.bibfile.parseString(txt) assert_equal(len(res), 3) res2 = bp.parse_str(txt) assert_equal(res.asList(), res2.asList()) res3 = [r.asList()[0] for r, start, end in bp.definitions.scanString(txt)] assert_equal(res.asList(), res3) if __name__ == '__main__': import nose nose.main() pyparsing-2.0.3/examples/dfmparse.py0000664000175000017500000001542512171425201016545 0ustar barrybarry""" This module can parse a Delphi Form (dfm) file. The main is used in experimenting (to find which files fail to parse, and where), but isn't useful for anything else. """ __version__ = "1.0" __author__ = "Daniel 'Dang' Griffith " from pyparsing import Literal, CaselessLiteral, Word, delimitedList \ , Optional, Combine, Group, alphas, nums, alphanums, Forward \ , oneOf, sglQuotedString, OneOrMore, ZeroOrMore, CharsNotIn # This converts DFM character constants into Python string (unicode) values. def to_chr(x): """chr(x) if 0 < x < 128 ; unicode(x) if x > 127.""" return 0 < x < 128 and chr(x) or eval("u'\\u%d'" % x ) ################# # BEGIN GRAMMAR ################# COLON = Literal(":").suppress() CONCAT = Literal("+").suppress() EQUALS = Literal("=").suppress() LANGLE = Literal("<").suppress() LBRACE = Literal("[").suppress() LPAREN = Literal("(").suppress() PERIOD = Literal(".").suppress() RANGLE = Literal(">").suppress() RBRACE = Literal("]").suppress() RPAREN = Literal(")").suppress() CATEGORIES = CaselessLiteral("categories").suppress() END = CaselessLiteral("end").suppress() FONT = CaselessLiteral("font").suppress() HINT = CaselessLiteral("hint").suppress() ITEM = CaselessLiteral("item").suppress() OBJECT = CaselessLiteral("object").suppress() attribute_value_pair = Forward() # this is recursed in item_list_entry simple_identifier = Word(alphas, alphanums + "_") identifier = Combine( simple_identifier + ZeroOrMore( Literal(".") + simple_identifier )) object_name = identifier object_type = identifier # Integer and floating point values are converted to Python longs and floats, respectively. int_value = Combine(Optional("-") + Word(nums)).setParseAction(lambda s,l,t: [ int(t[0]) ] ) float_value = Combine(Optional("-") + Optional(Word(nums)) + "." + Word(nums)).setParseAction(lambda s,l,t: [ float(t[0]) ] ) number_value = float_value | int_value # Base16 constants are left in string form, including the surrounding braces. base16_value = Combine(Literal("{") + OneOrMore(Word("0123456789ABCDEFabcdef")) + Literal("}"), adjacent=False) # This is the first part of a hack to convert the various delphi partial sglQuotedStrings # into a single sglQuotedString equivalent. The gist of it is to combine # all sglQuotedStrings (with their surrounding quotes removed (suppressed)) # with sequences of #xyz character constants, with "strings" concatenated # with a '+' sign. unquoted_sglQuotedString = Combine( Literal("'").suppress() + ZeroOrMore( CharsNotIn("'\n\r") ) + Literal("'").suppress() ) # The parse action on this production converts repetitions of constants into a single string. pound_char = Combine( OneOrMore((Literal("#").suppress()+Word(nums) ).setParseAction( lambda s, l, t: to_chr(int(t[0]) )))) # This is the second part of the hack. It combines the various "unquoted" # partial strings into a single one. Then, the parse action puts # a single matched pair of quotes around it. delphi_string = Combine( OneOrMore(CONCAT | pound_char | unquoted_sglQuotedString) , adjacent=False ).setParseAction(lambda s, l, t: "'%s'" % t[0]) string_value = delphi_string | base16_value list_value = LBRACE + Optional(Group(delimitedList(identifier | number_value | string_value))) + RBRACE paren_list_value = LPAREN + ZeroOrMore(identifier | number_value | string_value) + RPAREN item_list_entry = ITEM + ZeroOrMore(attribute_value_pair) + END item_list = LANGLE + ZeroOrMore(item_list_entry) + RANGLE generic_value = identifier value = item_list | number_value | string_value | list_value | paren_list_value | generic_value category_attribute = CATEGORIES + PERIOD + oneOf("strings itemsvisibles visibles", True) event_attribute = oneOf("onactivate onclosequery onclose oncreate ondeactivate onhide onshow", True) font_attribute = FONT + PERIOD + oneOf("charset color height name style", True) hint_attribute = HINT layout_attribute = oneOf("left top width height", True) generic_attribute = identifier attribute = (category_attribute | event_attribute | font_attribute | hint_attribute | layout_attribute | generic_attribute) category_attribute_value_pair = category_attribute + EQUALS + paren_list_value event_attribute_value_pair = event_attribute + EQUALS + value font_attribute_value_pair = font_attribute + EQUALS + value hint_attribute_value_pair = hint_attribute + EQUALS + value layout_attribute_value_pair = layout_attribute + EQUALS + value generic_attribute_value_pair = attribute + EQUALS + value attribute_value_pair << Group( category_attribute_value_pair | event_attribute_value_pair | font_attribute_value_pair | hint_attribute_value_pair | layout_attribute_value_pair | generic_attribute_value_pair ) object_declaration = Group((OBJECT + object_name + COLON + object_type)) object_attributes = Group(ZeroOrMore(attribute_value_pair)) nested_object = Forward() object_definition = object_declaration + object_attributes + ZeroOrMore(nested_object) + END nested_object << Group(object_definition) ################# # END GRAMMAR ################# def printer(s, loc, tok): print(tok, end=' ') return tok def get_filename_list(tf): import sys, glob if tf == None: tf = sys.argv[1:] elif type(tf) == str: tf = [tf] testfiles = [] for arg in tf: for i in glob.glob(arg): testfiles.append(i) return testfiles def main(testfiles=None, action=printer): """testfiles can be None, in which case the command line arguments are used as filenames. testfiles can be a string, in which case that file is parsed. testfiles can be a list. In all cases, the filenames will be globbed. If more than one file is parsed successfully, a dictionary of ParseResults is returned. Otherwise, a simple ParseResults is returned. """ testfiles = get_filename_list(testfiles) if action: for i in (simple_identifier, value, item_list): i.setParseAction(action) success = 0 failures = [] retval = {} for f in testfiles: try: retval[f] = object_definition.parseFile(f) success += 1 except: failures.append(f) if failures: print('\nfailed while processing %s' % ', '.join(failures)) print('\nsucceeded on %d of %d files' %(success, len(testfiles))) if len(retval) == 1 and len(testfiles) == 1: # if only one file is parsed, return the parseResults directly return retval[list(retval.keys())[0]] # else, return a dictionary of parseResults return retval if __name__ == "__main__": main()pyparsing-2.0.3/examples/verilogParse.py0000664000175000017500000007614712171425201017416 0ustar barrybarry# # verilogParse.py # # an example of using the pyparsing module to be able to process Verilog files # uses BNF defined at http://www.verilog.com/VerilogBNF.html # # Copyright (c) 2004-2011 Paul T. McGuire. All rights reserved. # # 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. # # If you find this software to be useful, please make a donation to one # of the following charities: # - the Red Cross (http://www.redcross.org) # - Hospice Austin (http://www.hospiceaustin.org) # # DISCLAIMER: # THIS SOFTWARE IS PROVIDED BY PAUL T. McGUIRE ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL T. McGUIRE OR CO-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OFUSE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # For questions or inquiries regarding this license, or commercial use of # this software, contact the author via e-mail: ptmcg@users.sourceforge.net # # Todo: # - add pre-process pass to implement compilerDirectives (ifdef, include, etc.) # # Revision History: # # 1.0 - Initial release # 1.0.1 - Fixed grammar errors: # . real declaration was incorrect # . tolerant of '=>' for '*>' operator # . tolerant of '?' as hex character # . proper handling of mintypmax_expr within path delays # 1.0.2 - Performance tuning (requires pyparsing 1.3) # 1.0.3 - Performance updates, using Regex (requires pyparsing 1.4) # 1.0.4 - Performance updates, enable packrat parsing (requires pyparsing 1.4.2) # 1.0.5 - Converted keyword Literals to Keywords, added more use of Group to # group parsed results tokens # 1.0.6 - Added support for module header with no ports list (thanks, Thomas Dejanovic!) # 1.0.7 - Fixed erroneous '<<' Forward definition in timCheckCond, omitting ()'s # 1.0.8 - Re-released under MIT license # 1.0.9 - Enhanced udpInstance to handle identifiers with leading '\' and subscripting # 1.0.10 - Fixed change added in 1.0.9 to work for all identifiers, not just those used # for udpInstance. # 1.0.11 - Fixed bug in inst_args, content alternatives were reversed # import pdb import time import pprint import sys __version__ = "1.0.11" from pyparsing import Literal, CaselessLiteral, Keyword, Word, Upcase, OneOrMore, ZeroOrMore, \ Forward, NotAny, delimitedList, Group, Optional, Combine, alphas, nums, restOfLine, cStyleComment, \ alphanums, printables, dblQuotedString, empty, ParseException, ParseResults, MatchFirst, oneOf, GoToColumn, \ ParseResults,StringEnd, FollowedBy, ParserElement, And, Regex, cppStyleComment#,__version__ import pyparsing usePackrat = False usePsyco = False packratOn = False psycoOn = False if usePackrat: try: ParserElement.enablePackrat() except: pass else: packratOn = True # comment out this section to disable psyco function compilation if usePsyco: try: import psyco psyco.full() except: print("failed to import psyco Python optimizer") else: psycoOn = True def dumpTokens(s,l,t): import pprint pprint.pprint( t.asList() ) verilogbnf = None def Verilog_BNF(): global verilogbnf if verilogbnf is None: # compiler directives compilerDirective = Combine( "`" + \ oneOf("define undef ifdef else endif default_nettype " "include resetall timescale unconnected_drive " "nounconnected_drive celldefine endcelldefine") + \ restOfLine ).setName("compilerDirective") # primitives SEMI,COLON,LPAR,RPAR,LBRACE,RBRACE,LBRACK,RBRACK,DOT,COMMA,EQ = map(Literal,";:(){}[].,=") identLead = alphas+"$_" identBody = alphanums+"$_" identifier1 = Regex( r"\.?["+identLead+"]["+identBody+"]*(\.["+identLead+"]["+identBody+"]*)*" ).setName("baseIdent") identifier2 = Regex(r"\\\S+").setParseAction(lambda t:t[0][1:]).setName("escapedIdent")#.setDebug() identifier = identifier1 | identifier2 assert(identifier2 == r'\abc') hexnums = nums + "abcdefABCDEF" + "_?" base = Regex("'[bBoOdDhH]").setName("base") basedNumber = Combine( Optional( Word(nums + "_") ) + base + Word(hexnums+"xXzZ"), joinString=" ", adjacent=False ).setName("basedNumber") #~ number = ( basedNumber | Combine( Word( "+-"+spacedNums, spacedNums ) + #~ Optional( DOT + Optional( Word( spacedNums ) ) ) + #~ Optional( e + Word( "+-"+spacedNums, spacedNums ) ) ).setName("numeric") ) number = ( basedNumber | \ Regex(r"[+-]?[0-9_]+(\.[0-9_]*)?([Ee][+-]?[0-9_]+)?") \ ).setName("numeric") #~ decnums = nums + "_" #~ octnums = "01234567" + "_" expr = Forward().setName("expr") concat = Group( LBRACE + delimitedList( expr ) + RBRACE ) multiConcat = Group("{" + expr + concat + "}").setName("multiConcat") funcCall = Group(identifier + LPAR + Optional( delimitedList( expr ) ) + RPAR).setName("funcCall") subscrRef = Group(LBRACK + delimitedList( expr, COLON ) + RBRACK) subscrIdentifier = Group( identifier + Optional( subscrRef ) ) #~ scalarConst = "0" | (( FollowedBy('1') + oneOf("1'b0 1'b1 1'bx 1'bX 1'B0 1'B1 1'Bx 1'BX 1") )) scalarConst = Regex("0|1('[Bb][01xX])?") mintypmaxExpr = Group( expr + COLON + expr + COLON + expr ).setName("mintypmax") primary = ( number | (LPAR + mintypmaxExpr + RPAR ) | ( LPAR + Group(expr) + RPAR ).setName("nestedExpr") | multiConcat | concat | dblQuotedString | funcCall | subscrIdentifier ) unop = oneOf( "+ - ! ~ & ~& | ^| ^ ~^" ).setName("unop") binop = oneOf( "+ - * / % == != === !== && " "|| < <= > >= & | ^ ^~ >> << ** <<< >>>" ).setName("binop") expr << ( ( unop + expr ) | # must be first! ( primary + "?" + expr + COLON + expr ) | ( primary + Optional( binop + expr ) ) ) lvalue = subscrIdentifier | concat # keywords if_ = Keyword("if") else_ = Keyword("else") edge = Keyword("edge") posedge = Keyword("posedge") negedge = Keyword("negedge") specify = Keyword("specify") endspecify = Keyword("endspecify") fork = Keyword("fork") join = Keyword("join") begin = Keyword("begin") end = Keyword("end") default = Keyword("default") forever = Keyword("forever") repeat = Keyword("repeat") while_ = Keyword("while") for_ = Keyword("for") case = oneOf( "case casez casex" ) endcase = Keyword("endcase") wait = Keyword("wait") disable = Keyword("disable") deassign = Keyword("deassign") force = Keyword("force") release = Keyword("release") assign = Keyword("assign") eventExpr = Forward() eventTerm = ( posedge + expr ) | ( negedge + expr ) | expr | ( LPAR + eventExpr + RPAR ) eventExpr << ( Group( delimitedList( eventTerm, Keyword("or") ) ) ) eventControl = Group( "@" + ( ( LPAR + eventExpr + RPAR ) | identifier | "*" ) ).setName("eventCtrl") delayArg = ( number | Word(alphanums+"$_") | #identifier | ( LPAR + Group( delimitedList( mintypmaxExpr | expr ) ) + RPAR ) ).setName("delayArg")#.setDebug() delay = Group( "#" + delayArg ).setName("delay")#.setDebug() delayOrEventControl = delay | eventControl assgnmt = Group( lvalue + EQ + Optional( delayOrEventControl ) + expr ).setName( "assgnmt" ) nbAssgnmt = Group(( lvalue + "<=" + Optional( delay ) + expr ) | ( lvalue + "<=" + Optional( eventControl ) + expr )).setName( "nbassgnmt" ) range = LBRACK + expr + COLON + expr + RBRACK paramAssgnmt = Group( identifier + EQ + expr ).setName("paramAssgnmt") parameterDecl = Group( "parameter" + Optional( range ) + delimitedList( paramAssgnmt ) + SEMI).setName("paramDecl") inputDecl = Group( "input" + Optional( range ) + delimitedList( identifier ) + SEMI ) outputDecl = Group( "output" + Optional( range ) + delimitedList( identifier ) + SEMI ) inoutDecl = Group( "inout" + Optional( range ) + delimitedList( identifier ) + SEMI ) regIdentifier = Group( identifier + Optional( LBRACK + expr + COLON + expr + RBRACK ) ) regDecl = Group( "reg" + Optional("signed") + Optional( range ) + delimitedList( regIdentifier ) + SEMI ).setName("regDecl") timeDecl = Group( "time" + delimitedList( regIdentifier ) + SEMI ) integerDecl = Group( "integer" + delimitedList( regIdentifier ) + SEMI ) strength0 = oneOf("supply0 strong0 pull0 weak0 highz0") strength1 = oneOf("supply1 strong1 pull1 weak1 highz1") driveStrength = Group( LPAR + ( ( strength0 + COMMA + strength1 ) | ( strength1 + COMMA + strength0 ) ) + RPAR ).setName("driveStrength") nettype = oneOf("wire tri tri1 supply0 wand triand tri0 supply1 wor trior trireg") expandRange = Optional( oneOf("scalared vectored") ) + range realDecl = Group( "real" + delimitedList( identifier ) + SEMI ) eventDecl = Group( "event" + delimitedList( identifier ) + SEMI ) blockDecl = ( parameterDecl | regDecl | integerDecl | realDecl | timeDecl | eventDecl ) stmt = Forward().setName("stmt")#.setDebug() stmtOrNull = stmt | SEMI caseItem = ( delimitedList( expr ) + COLON + stmtOrNull ) | \ ( default + Optional(":") + stmtOrNull ) stmt << Group( ( begin + Group( ZeroOrMore( stmt ) ) + end ).setName("begin-end") | ( if_ + Group(LPAR + expr + RPAR) + stmtOrNull + Optional( else_ + stmtOrNull ) ).setName("if") | ( delayOrEventControl + stmtOrNull ) | ( case + LPAR + expr + RPAR + OneOrMore( caseItem ) + endcase ) | ( forever + stmt ) | ( repeat + LPAR + expr + RPAR + stmt ) | ( while_ + LPAR + expr + RPAR + stmt ) | ( for_ + LPAR + assgnmt + SEMI + Group( expr ) + SEMI + assgnmt + RPAR + stmt ) | ( fork + ZeroOrMore( stmt ) + join ) | ( fork + COLON + identifier + ZeroOrMore( blockDecl ) + ZeroOrMore( stmt ) + end ) | ( wait + LPAR + expr + RPAR + stmtOrNull ) | ( "->" + identifier + SEMI ) | ( disable + identifier + SEMI ) | ( assign + assgnmt + SEMI ) | ( deassign + lvalue + SEMI ) | ( force + assgnmt + SEMI ) | ( release + lvalue + SEMI ) | ( begin + COLON + identifier + ZeroOrMore( blockDecl ) + ZeroOrMore( stmt ) + end ).setName("begin:label-end") | # these *have* to go at the end of the list!!! ( assgnmt + SEMI ) | ( nbAssgnmt + SEMI ) | ( Combine( Optional("$") + identifier ) + Optional( LPAR + delimitedList(expr|empty) + RPAR ) + SEMI ) ).setName("stmtBody") """ x::= ; x||= ; x||= if ( ) x||= if ( ) else x||= case ( ) + endcase x||= casez ( ) + endcase x||= casex ( ) + endcase x||= forever x||= repeat ( ) x||= while ( ) x||= for ( ; ; ) x||= x||= wait ( ) x||= -> ; x||= x||= x||= x||= x||= disable ; x||= disable ; x||= assign ; x||= deassign ; x||= force ; x||= release ; """ alwaysStmt = Group( "always" + Optional(eventControl) + stmt ).setName("alwaysStmt") initialStmt = Group( "initial" + stmt ).setName("initialStmt") chargeStrength = Group( LPAR + oneOf( "small medium large" ) + RPAR ).setName("chargeStrength") continuousAssign = Group( assign + Optional( driveStrength ) + Optional( delay ) + delimitedList( assgnmt ) + SEMI ).setName("continuousAssign") tfDecl = ( parameterDecl | inputDecl | outputDecl | inoutDecl | regDecl | timeDecl | integerDecl | realDecl ) functionDecl = Group( "function" + Optional( range | "integer" | "real" ) + identifier + SEMI + Group( OneOrMore( tfDecl ) ) + Group( ZeroOrMore( stmt ) ) + "endfunction" ) inputOutput = oneOf("input output") netDecl1Arg = ( nettype + Optional( expandRange ) + Optional( delay ) + Group( delimitedList( ~inputOutput + identifier ) ) ) netDecl2Arg = ( "trireg" + Optional( chargeStrength ) + Optional( expandRange ) + Optional( delay ) + Group( delimitedList( ~inputOutput + identifier ) ) ) netDecl3Arg = ( nettype + Optional( driveStrength ) + Optional( expandRange ) + Optional( delay ) + Group( delimitedList( assgnmt ) ) ) netDecl1 = Group(netDecl1Arg + SEMI).setName("netDecl1") netDecl2 = Group(netDecl2Arg + SEMI).setName("netDecl2") netDecl3 = Group(netDecl3Arg + SEMI).setName("netDecl3") gateType = oneOf("and nand or nor xor xnor buf bufif0 bufif1 " "not notif0 notif1 pulldown pullup nmos rnmos " "pmos rpmos cmos rcmos tran rtran tranif0 " "rtranif0 tranif1 rtranif1" ) gateInstance = Optional( Group( identifier + Optional( range ) ) ) + \ LPAR + Group( delimitedList( expr ) ) + RPAR gateDecl = Group( gateType + Optional( driveStrength ) + Optional( delay ) + delimitedList( gateInstance) + SEMI ) udpInstance = Group( Group( identifier + Optional(range | subscrRef) ) + LPAR + Group( delimitedList( expr ) ) + RPAR ) udpInstantiation = Group( identifier - Optional( driveStrength ) + Optional( delay ) + delimitedList( udpInstance ) + SEMI ).setName("udpInstantiation") parameterValueAssignment = Group( Literal("#") + LPAR + Group( delimitedList( expr ) ) + RPAR ) namedPortConnection = Group( DOT + identifier + LPAR + expr + RPAR ).setName("namedPortConnection")#.setDebug() assert(r'.\abc (abc )' == namedPortConnection) modulePortConnection = expr | empty #~ moduleInstance = Group( Group ( identifier + Optional(range) ) + #~ ( delimitedList( modulePortConnection ) | #~ delimitedList( namedPortConnection ) ) ) inst_args = Group( LPAR + (delimitedList( namedPortConnection ) | delimitedList( modulePortConnection )) + RPAR).setName("inst_args") moduleInstance = Group( Group ( identifier + Optional(range) ) + inst_args ).setName("moduleInstance")#.setDebug() moduleInstantiation = Group( identifier + Optional( parameterValueAssignment ) + delimitedList( moduleInstance ).setName("moduleInstanceList") + SEMI ).setName("moduleInstantiation") parameterOverride = Group( "defparam" + delimitedList( paramAssgnmt ) + SEMI ) task = Group( "task" + identifier + SEMI + ZeroOrMore( tfDecl ) + stmtOrNull + "endtask" ) specparamDecl = Group( "specparam" + delimitedList( paramAssgnmt ) + SEMI ) pathDescr1 = Group( LPAR + subscrIdentifier + "=>" + subscrIdentifier + RPAR ) pathDescr2 = Group( LPAR + Group( delimitedList( subscrIdentifier ) ) + "*>" + Group( delimitedList( subscrIdentifier ) ) + RPAR ) pathDescr3 = Group( LPAR + Group( delimitedList( subscrIdentifier ) ) + "=>" + Group( delimitedList( subscrIdentifier ) ) + RPAR ) pathDelayValue = Group( ( LPAR + Group( delimitedList( mintypmaxExpr | expr ) ) + RPAR ) | mintypmaxExpr | expr ) pathDecl = Group( ( pathDescr1 | pathDescr2 | pathDescr3 ) + EQ + pathDelayValue + SEMI ).setName("pathDecl") portConditionExpr = Forward() portConditionTerm = Optional(unop) + subscrIdentifier portConditionExpr << portConditionTerm + Optional( binop + portConditionExpr ) polarityOp = oneOf("+ -") levelSensitivePathDecl1 = Group( if_ + Group(LPAR + portConditionExpr + RPAR) + subscrIdentifier + Optional( polarityOp ) + "=>" + subscrIdentifier + EQ + pathDelayValue + SEMI ) levelSensitivePathDecl2 = Group( if_ + Group(LPAR + portConditionExpr + RPAR) + LPAR + Group( delimitedList( subscrIdentifier ) ) + Optional( polarityOp ) + "*>" + Group( delimitedList( subscrIdentifier ) ) + RPAR + EQ + pathDelayValue + SEMI ) levelSensitivePathDecl = levelSensitivePathDecl1 | levelSensitivePathDecl2 edgeIdentifier = posedge | negedge edgeSensitivePathDecl1 = Group( Optional( if_ + Group(LPAR + expr + RPAR) ) + LPAR + Optional( edgeIdentifier ) + subscrIdentifier + "=>" + LPAR + subscrIdentifier + Optional( polarityOp ) + COLON + expr + RPAR + RPAR + EQ + pathDelayValue + SEMI ) edgeSensitivePathDecl2 = Group( Optional( if_ + Group(LPAR + expr + RPAR) ) + LPAR + Optional( edgeIdentifier ) + subscrIdentifier + "*>" + LPAR + delimitedList( subscrIdentifier ) + Optional( polarityOp ) + COLON + expr + RPAR + RPAR + EQ + pathDelayValue + SEMI ) edgeSensitivePathDecl = edgeSensitivePathDecl1 | edgeSensitivePathDecl2 edgeDescr = oneOf("01 10 0x x1 1x x0").setName("edgeDescr") timCheckEventControl = Group( posedge | negedge | (edge + LBRACK + delimitedList( edgeDescr ) + RBRACK )) timCheckCond = Forward() timCondBinop = oneOf("== === != !==") timCheckCondTerm = ( expr + timCondBinop + scalarConst ) | ( Optional("~") + expr ) timCheckCond << ( ( LPAR + timCheckCond + RPAR ) | timCheckCondTerm ) timCheckEvent = Group( Optional( timCheckEventControl ) + subscrIdentifier + Optional( "&&&" + timCheckCond ) ) timCheckLimit = expr controlledTimingCheckEvent = Group( timCheckEventControl + subscrIdentifier + Optional( "&&&" + timCheckCond ) ) notifyRegister = identifier systemTimingCheck1 = Group( "$setup" + LPAR + timCheckEvent + COMMA + timCheckEvent + COMMA + timCheckLimit + Optional( COMMA + notifyRegister ) + RPAR + SEMI ) systemTimingCheck2 = Group( "$hold" + LPAR + timCheckEvent + COMMA + timCheckEvent + COMMA + timCheckLimit + Optional( COMMA + notifyRegister ) + RPAR + SEMI ) systemTimingCheck3 = Group( "$period" + LPAR + controlledTimingCheckEvent + COMMA + timCheckLimit + Optional( COMMA + notifyRegister ) + RPAR + SEMI ) systemTimingCheck4 = Group( "$width" + LPAR + controlledTimingCheckEvent + COMMA + timCheckLimit + Optional( COMMA + expr + COMMA + notifyRegister ) + RPAR + SEMI ) systemTimingCheck5 = Group( "$skew" + LPAR + timCheckEvent + COMMA + timCheckEvent + COMMA + timCheckLimit + Optional( COMMA + notifyRegister ) + RPAR + SEMI ) systemTimingCheck6 = Group( "$recovery" + LPAR + controlledTimingCheckEvent + COMMA + timCheckEvent + COMMA + timCheckLimit + Optional( COMMA + notifyRegister ) + RPAR + SEMI ) systemTimingCheck7 = Group( "$setuphold" + LPAR + timCheckEvent + COMMA + timCheckEvent + COMMA + timCheckLimit + COMMA + timCheckLimit + Optional( COMMA + notifyRegister ) + RPAR + SEMI ) systemTimingCheck = (FollowedBy('$') + ( systemTimingCheck1 | systemTimingCheck2 | systemTimingCheck3 | systemTimingCheck4 | systemTimingCheck5 | systemTimingCheck6 | systemTimingCheck7 )).setName("systemTimingCheck") sdpd = if_ + Group(LPAR + expr + RPAR) + \ ( pathDescr1 | pathDescr2 ) + EQ + pathDelayValue + SEMI specifyItem = ~Keyword("endspecify") +( specparamDecl | pathDecl | levelSensitivePathDecl | edgeSensitivePathDecl | systemTimingCheck | sdpd ) """ x::= x||= x||= x||= x||= x||= """ specifyBlock = Group( "specify" + ZeroOrMore( specifyItem ) + "endspecify" ).setName("specifyBlock") moduleItem = ~Keyword("endmodule") + ( parameterDecl | inputDecl | outputDecl | inoutDecl | regDecl | netDecl3 | netDecl1 | netDecl2 | timeDecl | integerDecl | realDecl | eventDecl | gateDecl | parameterOverride | continuousAssign | specifyBlock | initialStmt | alwaysStmt | task | functionDecl | # these have to be at the end - they start with identifiers moduleInstantiation | udpInstantiation ) """ All possible moduleItems, from Verilog grammar spec x::= x||= x||= x||= ?||= (spec does not seem consistent for this item) x||= x||= x||= x||= x||= x||= x||= x||= x||= x||= x||= x||= x||= x||= x||= """ portRef = subscrIdentifier portExpr = portRef | Group( LBRACE + delimitedList( portRef ) + RBRACE ) port = portExpr | Group( ( DOT + identifier + LPAR + portExpr + RPAR ) ) moduleHdr = Group ( oneOf("module macromodule") + identifier + Optional( LPAR + Group( Optional( delimitedList( Group(oneOf("input output") + (netDecl1Arg | netDecl2Arg | netDecl3Arg) ) | port ) ) ) + RPAR ) + SEMI ).setName("moduleHdr") module = Group( moduleHdr + Group( ZeroOrMore( moduleItem ) ) + "endmodule" ).setName("module")#.setDebug() udpDecl = outputDecl | inputDecl | regDecl #~ udpInitVal = oneOf("1'b0 1'b1 1'bx 1'bX 1'B0 1'B1 1'Bx 1'BX 1 0 x X") udpInitVal = (Regex("1'[bB][01xX]") | Regex("[01xX]")).setName("udpInitVal") udpInitialStmt = Group( "initial" + identifier + EQ + udpInitVal + SEMI ).setName("udpInitialStmt") levelSymbol = oneOf("0 1 x X ? b B") levelInputList = Group( OneOrMore( levelSymbol ).setName("levelInpList") ) outputSymbol = oneOf("0 1 x X") combEntry = Group( levelInputList + COLON + outputSymbol + SEMI ) edgeSymbol = oneOf("r R f F p P n N *") edge = Group( LPAR + levelSymbol + levelSymbol + RPAR ) | \ Group( edgeSymbol ) edgeInputList = Group( ZeroOrMore( levelSymbol ) + edge + ZeroOrMore( levelSymbol ) ) inputList = levelInputList | edgeInputList seqEntry = Group( inputList + COLON + levelSymbol + COLON + ( outputSymbol | "-" ) + SEMI ).setName("seqEntry") udpTableDefn = Group( "table" + OneOrMore( combEntry | seqEntry ) + "endtable" ).setName("table") """ ::= primitive ( <,>* ) ; + ? endprimitive """ udp = Group( "primitive" + identifier + LPAR + Group( delimitedList( identifier ) ) + RPAR + SEMI + OneOrMore( udpDecl ) + Optional( udpInitialStmt ) + udpTableDefn + "endprimitive" ) verilogbnf = OneOrMore( module | udp ) + StringEnd() verilogbnf.ignore( cppStyleComment ) verilogbnf.ignore( compilerDirective ) return verilogbnf def test( strng ): tokens = [] try: tokens = Verilog_BNF().parseString( strng ) except ParseException as err: print(err.line) print(" "*(err.column-1) + "^") print(err) return tokens #~ if __name__ == "__main__": if 0: import pprint toptest = """ module TOP( in, out ); input [7:0] in; output [5:0] out; COUNT_BITS8 count_bits( .IN( in ), .C( out ) ); endmodule""" pprint.pprint( test(toptest).asList() ) else: def main(): print("Verilog parser test (V %s)" % __version__) print(" - using pyparsing version", pyparsing.__version__) print(" - using Python version", sys.version) if packratOn: print(" - using packrat parsing") if psycoOn: print(" - using psyco runtime optimization") print() import os import gc failCount = 0 Verilog_BNF() numlines = 0 startTime = time.clock() fileDir = "verilog" #~ fileDir = "verilog/new" #~ fileDir = "verilog/new2" #~ fileDir = "verilog/new3" allFiles = [f for f in os.listdir(fileDir) if f.endswith(".v")] #~ allFiles = [ "list_path_delays_test.v" ] #~ allFiles = [ "escapedIdent.v" ] #~ allFiles = filter( lambda f : f.startswith("a") and f.endswith(".v"), os.listdir(fileDir) ) #~ allFiles = filter( lambda f : f.startswith("c") and f.endswith(".v"), os.listdir(fileDir) ) #~ allFiles = [ "ff.v" ] pp = pprint.PrettyPrinter( indent=2 ) totalTime = 0 for vfile in allFiles: gc.collect() fnam = fileDir + "/"+vfile infile = open(fnam) filelines = infile.readlines() infile.close() print(fnam, len(filelines), end=' ') numlines += len(filelines) teststr = "".join(filelines) time1 = time.clock() tokens = test( teststr ) time2 = time.clock() elapsed = time2-time1 totalTime += elapsed if ( len( tokens ) ): print("OK", elapsed) #~ print "tokens=" #~ pp.pprint( tokens.asList() ) #~ print ofnam = fileDir + "/parseOutput/" + vfile + ".parsed.txt" outfile = open(ofnam,"w") outfile.write( teststr ) outfile.write("\n") outfile.write("\n") outfile.write(pp.pformat(tokens.asList())) outfile.write("\n") outfile.close() else: print("failed", elapsed) failCount += 1 for i,line in enumerate(filelines,1): print("%4d: %s" % (i,line.rstrip())) endTime = time.clock() print("Total parse time:", totalTime) print("Total source lines:", numlines) print("Average lines/sec:", ( "%.1f" % (float(numlines)/(totalTime+.05 ) ) )) if failCount: print("FAIL - %d files failed to parse" % failCount) else: print("SUCCESS - all files parsed") return 0 #~ from line_profiler import LineProfiler #~ from pyparsing import ParseResults #~ lp = LineProfiler(ParseResults.__init__) main() #~ lp.print_stats() #~ import hotshot #~ p = hotshot.Profile("vparse.prof",1,1) #~ p.start() #~ main() #~ p.stop() #~ p.close() pyparsing-2.0.3/examples/parseResultsSumExample.py0000664000175000017500000000147312171425202021440 0ustar barrybarry# # parseResultsSumExample.py # # Sample script showing the value in merging ParseResults retrieved by searchString, # using Python's builtin sum() method # samplestr1 = "garbage;DOB 10-10-2010;more garbage\nID PARI12345678;more garbage" samplestr2 = "garbage;ID PARI12345678;more garbage\nDOB 10-10-2010;more garbage" samplestr3 = "garbage;DOB 10-10-2010" samplestr4 = "garbage;ID PARI12345678;more garbage- I am cool" from pyparsing import * dob_ref = "DOB" + Regex(r"\d{2}-\d{2}-\d{4}")("dob") id_ref = "ID" + Word(alphanums,exact=12)("id") info_ref = "-" + restOfLine("info") person_data = dob_ref | id_ref | info_ref for test in (samplestr1,samplestr2,samplestr3,samplestr4,): person = sum(person_data.searchString(test)) print(person.id) print(person.dump()) print() pyparsing-2.0.3/examples/cLibHeader.py0000664000175000017500000000144612171425201016724 0ustar barrybarry# # cLibHeader.py # # A simple parser to extract API doc info from a C header file # # Copyright, 2012 - Paul McGuire # from pyparsing import Word, alphas, alphanums, Combine, oneOf, Optional, delimitedList, Group, Keyword testdata = """ int func1(float *vec, int len, double arg1); int func2(float **arr, float *vec, int len, double arg1, double arg2); """ ident = Word(alphas, alphanums + "_") vartype = Combine( oneOf("float double int char") + Optional(Word("*")), adjacent = False) arglist = delimitedList(Group(vartype("type") + ident("name"))) functionCall = Keyword("int") + ident("name") + "(" + arglist("args") + ")" + ";" for fn,s,e in functionCall.scanString(testdata): print(fn.name) for a in fn.args: print(" - %(name)s (%(type)s)" % a) pyparsing-2.0.3/examples/builtin_parse_action_demo.py0000664000175000017500000000156512171425201022145 0ustar barrybarry# # builtin_parse_action_demo.py # Copyright, 2012 - Paul McGuire # # Simple example of using builtin functions as parse actions. # from pyparsing import * integer = Word(nums).setParseAction(lambda t : int(t[0])) # make an expression that will match a list of ints (which # will be converted to actual ints by the parse action attached # to integer) nums = OneOrMore(integer) test = "2 54 34 2 211 66 43 2 0" print(test) # try each of these builtins as parse actions for fn in (sum, max, min, len, sorted, reversed, list, tuple, set, any, all): fn_name = fn.__name__ if fn is reversed: # reversed returns an iterator, we really want to show the list of items fn = lambda x : list(reversed(x)) # show how each builtin works as a free-standing parse action print(fn_name, nums.setParseAction(fn).parseString(test)) pyparsing-2.0.3/examples/tagCapture.py0000664000175000017500000000200312171425201017027 0ustar barrybarry# # tagCapture.py # # Simple demo showing how to match HTML tags # from pyparsing import * src = "this is test bold text normal text " def matchingCloseTag(other): ret = Forward() ret << anyCloseTag.copy() def setupMatchingClose(tokens): opentag = tokens[0] def mustMatch(tokens): if tokens[0][0].strip('<>/') != opentag: raise ParseException("",0,"") ret.setParseAction(mustMatch) other.addParseAction(setupMatchingClose) return ret for m in originalTextFor(anyOpenTag + SkipTo(matchingCloseTag(anyOpenTag), include=True, failOn=anyOpenTag) ).searchString(src): print(m.dump()) for m in originalTextFor(anyOpenTag + SkipTo(matchingCloseTag(anyOpenTag), include=True) ).searchString(src): print(m.dump()) pyparsing-2.0.3/examples/TAP.py0000664000175000017500000001645312171425202015373 0ustar barrybarry# # TAP.py - TAP parser # # A pyparsing parser to process the output of the Perl # "Test Anything Protocol" # (http://search.cpan.org/~petdance/TAP-1.00/TAP.pm) # # TAP output lines are preceded or followed by a test number range: # 1..n # with 'n' TAP output lines. # # The general format of a TAP output line is: # ok/not ok (required) # Test number (recommended) # Description (recommended) # Directive (only when necessary) # # A TAP output line may also indicate abort of the test suit with the line: # Bail out! # optionally followed by a reason for bailing # # Copyright 2008, by Paul McGuire # from pyparsing import ParserElement,LineEnd,Optional,Word,nums,Regex,\ Literal,CaselessLiteral,Group,OneOrMore,Suppress,restOfLine,\ FollowedBy,empty __all__ = ['tapOutputParser', 'TAPTest', 'TAPSummary'] # newlines are significant whitespace, so set default skippable # whitespace to just spaces and tabs ParserElement.setDefaultWhitespaceChars(" \t") NL = LineEnd().suppress() integer = Word(nums) plan = '1..' + integer("ubound") OK,NOT_OK = map(Literal,['ok','not ok']) testStatus = (OK | NOT_OK) description = Regex("[^#\n]+") description.setParseAction(lambda t:t[0].lstrip('- ')) TODO,SKIP = map(CaselessLiteral,'TODO SKIP'.split()) directive = Group(Suppress('#') + (TODO + restOfLine | FollowedBy(SKIP) + restOfLine.copy().setParseAction(lambda t:['SKIP',t[0]]) )) commentLine = Suppress("#") + empty + restOfLine testLine = Group( Optional(OneOrMore(commentLine + NL))("comments") + testStatus("passed") + Optional(integer)("testNumber") + Optional(description)("description") + Optional(directive)("directive") ) bailLine = Group(Literal("Bail out!")("BAIL") + empty + Optional(restOfLine)("reason")) tapOutputParser = Optional(Group(plan)("plan") + NL) & \ Group(OneOrMore((testLine|bailLine) + NL))("tests") class TAPTest(object): def __init__(self,results): self.num = results.testNumber self.passed = (results.passed=="ok") self.skipped = self.todo = False if results.directive: self.skipped = (results.directive[0][0]=='SKIP') self.todo = (results.directive[0][0]=='TODO') @classmethod def bailedTest(cls,num): ret = TAPTest(empty.parseString("")) ret.num = num ret.skipped = True return ret class TAPSummary(object): def __init__(self,results): self.passedTests = [] self.failedTests = [] self.skippedTests = [] self.todoTests = [] self.bonusTests = [] self.bail = False if results.plan: expected = list(range(1, int(results.plan.ubound)+1)) else: expected = list(range(1,len(results.tests)+1)) for i,res in enumerate(results.tests): # test for bail out if res.BAIL: #~ print "Test suite aborted: " + res.reason #~ self.failedTests += expected[i:] self.bail = True self.skippedTests += [ TAPTest.bailedTest(ii) for ii in expected[i:] ] self.bailReason = res.reason break #~ print res.dump() testnum = i+1 if res.testNumber != "": if testnum != int(res.testNumber): print("ERROR! test %(testNumber)s out of sequence" % res) testnum = int(res.testNumber) res["testNumber"] = testnum test = TAPTest(res) if test.passed: self.passedTests.append(test) else: self.failedTests.append(test) if test.skipped: self.skippedTests.append(test) if test.todo: self.todoTests.append(test) if test.todo and test.passed: self.bonusTests.append(test) self.passedSuite = not self.bail and (set(self.failedTests)-set(self.todoTests) == set()) def summary(self, showPassed=False, showAll=False): testListStr = lambda tl : "[" + ",".join(str(t.num) for t in tl) + "]" summaryText = [] if showPassed or showAll: summaryText.append( "PASSED: %s" % testListStr(self.passedTests) ) if self.failedTests or showAll: summaryText.append( "FAILED: %s" % testListStr(self.failedTests) ) if self.skippedTests or showAll: summaryText.append( "SKIPPED: %s" % testListStr(self.skippedTests) ) if self.todoTests or showAll: summaryText.append( "TODO: %s" % testListStr(self.todoTests) ) if self.bonusTests or showAll: summaryText.append( "BONUS: %s" % testListStr(self.bonusTests) ) if self.passedSuite: summaryText.append( "PASSED" ) else: summaryText.append( "FAILED" ) return "\n".join(summaryText) # create TAPSummary objects from tapOutput parsed results, by setting # class as parse action tapOutputParser.setParseAction(TAPSummary) if __name__ == "__main__": test1 = """\ 1..4 ok 1 - Input file opened not ok 2 - First line of the input valid ok 3 - Read the rest of the file not ok 4 - Summarized correctly # TODO Not written yet """ test2 = """\ ok 1 not ok 2 some description # TODO with a directive ok 3 a description only, no directive ok 4 # TODO directive only ok a description only, no directive ok # Skipped only a directive, no description ok """ test3 = """\ ok - created Board ok ok not ok ok ok ok ok # +------+------+------+------+ # | |16G | |05C | # | |G N C | |C C G | # | | G | | C +| # +------+------+------+------+ # |10C |01G | |03C | # |R N G |G A G | |C C C | # | R | G | | C +| # +------+------+------+------+ # | |01G |17C |00C | # | |G A G |G N R |R N R | # | | G | R | G | # +------+------+------+------+ ok - board has 7 tiles + starter tile 1..9 """ test4 = """\ 1..4 ok 1 - Creating test program ok 2 - Test program runs, no error not ok 3 - infinite loop # TODO halting problem unsolved not ok 4 - infinite loop 2 # TODO halting problem unsolved """ test5 = """\ 1..20 ok - database handle not ok - failed database login Bail out! Couldn't connect to database. """ test6 = """\ ok 1 - retrieving servers from the database # need to ping 6 servers ok 2 - pinged diamond ok 3 - pinged ruby not ok 4 - pinged sapphire ok 5 - pinged onyx not ok 6 - pinged quartz ok 7 - pinged gold 1..7 """ for test in (test1,test2,test3,test4,test5,test6): print(test) tapResult = tapOutputParser.parseString(test)[0] print(tapResult.summary(showAll=True)) print() pyparsing-2.0.3/examples/mozillaCalendarParser.py0000664000175000017500000000521412171425201021215 0ustar barrybarryfrom pyparsing import Optional, oneOf, Dict, Literal, Word, printables, Group, OneOrMore, ZeroOrMore """ A simple parser for calendar (*.ics) files, as exported by the Mozilla calendar. Any suggestions and comments welcome. Version: 0.1 Copyright: Petri Savolainen License: Free for any use """ # TERMINALS BEGIN = Literal("BEGIN:").suppress() END = Literal("END:").suppress() str = printables + "\xe4\xf6\xe5\xd6\xc4\xc5" valstr = str + " " EQ = Literal("=").suppress() SEMI = Literal(";").suppress() COLON = Literal(":").suppress() EVENT = Literal("VEVENT").suppress() CALENDAR = Literal("VCALENDAR").suppress() ALARM = Literal("VALARM").suppress() # TOKENS CALPROP = oneOf("VERSION PRODID METHOD") ALMPROP = oneOf("TRIGGER") EVTPROP = oneOf("X-MOZILLA-RECUR-DEFAULT-INTERVAL \ X-MOZILLA-RECUR-DEFAULT-UNITS \ UID DTSTAMP LAST-MODIFIED X RRULE EXDATE") propval = Word(valstr) typeval = Word(valstr) typename = oneOf("VALUE MEMBER FREQ UNTIL INTERVAL") proptype = Group(SEMI + typename + EQ + typeval).suppress() calprop = Group(CALPROP + ZeroOrMore(proptype) + COLON + propval) almprop = Group(ALMPROP + ZeroOrMore(proptype) + COLON + propval) evtprop = Group(EVTPROP + ZeroOrMore(proptype) + COLON + propval).suppress() \ | "CATEGORIES" + COLON + propval.setResultsName("categories") \ | "CLASS" + COLON + propval.setResultsName("class") \ | "DESCRIPTION" + COLON + propval.setResultsName("description") \ | "DTSTART" + proptype + COLON + propval.setResultsName("begin") \ | "DTEND" + proptype + COLON + propval.setResultsName("end") \ | "LOCATION" + COLON + propval.setResultsName("location") \ | "PRIORITY" + COLON + propval.setResultsName("priority") \ | "STATUS" + COLON + propval.setResultsName("status") \ | "SUMMARY" + COLON + propval.setResultsName("summary") \ | "URL" + COLON + propval.setResultsName("url") \ calprops = Group(OneOrMore(calprop)).suppress() evtprops = Group(OneOrMore(evtprop)) almprops = Group(OneOrMore(almprop)).suppress() alarm = BEGIN + ALARM + almprops + END + ALARM event = BEGIN + EVENT + evtprops + Optional(alarm) + END + EVENT events = Group(OneOrMore(event)) calendar = BEGIN + CALENDAR + calprops + ZeroOrMore(event) + END + CALENDAR calendars = OneOrMore(calendar) # PARSE ACTIONS def gotEvent(s,loc,toks): for event in toks: print (event['summary'], "from", event["begin"], "to", event["end"]) event.setParseAction(gotEvent) # MAIN PROGRAM if __name__=="__main__": calendars.parseFile("mozilla.ics") pyparsing-2.0.3/examples/oc.py0000664000175000017500000000743712171425201015351 0ustar barrybarry# oc.py # # A subset-C parser, (BNF taken from 1996 International Obfuscated C Code Contest) # # Copyright, 2010, Paul McGuire # """ http://www.ioccc.org/1996/august.hint The following is a description of the OC grammar: OC grammar ========== Terminals are in quotes, () is used for bracketing. program: decl* decl: vardecl fundecl vardecl: type NAME ; type NAME "[" INT "]" ; fundecl: type NAME "(" args ")" "{" body "}" args: /*empty*/ ( arg "," )* arg arg: type NAME body: vardecl* stmt* stmt: ifstmt whilestmt dowhilestmt "return" expr ";" expr ";" "{" stmt* "}" ";" ifstmt: "if" "(" expr ")" stmt "if" "(" expr ")" stmt "else" stmt whilestmt: "while" "(" expr ")" stmt dowhilestmt: "do" stmt "while" "(" expr ")" ";" expr: expr binop expr unop expr expr "[" expr "]" "(" expr ")" expr "(" exprs ")" NAME INT CHAR STRING exprs: /*empty*/ (expr ",")* expr binop: "+" | "-" | "*" | "/" | "%" | "=" | "<" | "==" | "!=" unop: "!" | "-" | "*" type: "int" stars "char" stars stars: "*"* """ from pyparsing import * LPAR,RPAR,LBRACK,RBRACK,LBRACE,RBRACE,SEMI,COMMA = map(Suppress, "()[]{};,") INT = Keyword("int") CHAR = Keyword("char") WHILE = Keyword("while") DO = Keyword("do") IF = Keyword("if") ELSE = Keyword("else") RETURN = Keyword("return") NAME = Word(alphas+"_", alphanums+"_") integer = Regex(r"[+-]?\d+") char = Regex(r"'.'") string_ = dblQuotedString INT = Keyword("int") CHAR = Keyword("char") TYPE = Group((INT | CHAR) + ZeroOrMore("*")) expr = Forward() operand = NAME | integer | char | string_ expr << (operatorPrecedence(operand, [ (oneOf('! - *'), 1, opAssoc.RIGHT), (oneOf('++ --'), 1, opAssoc.RIGHT), (oneOf('++ --'), 1, opAssoc.LEFT), (oneOf('* / %'), 2, opAssoc.LEFT), (oneOf('+ -'), 2, opAssoc.LEFT), (oneOf('< == > <= >= !='), 2, opAssoc.LEFT), (Regex(r'=[^=]'), 2, opAssoc.LEFT), ]) + Optional( LBRACK + expr + RBRACK | LPAR + Group(Optional(delimitedList(expr))) + RPAR ) ) stmt = Forward() ifstmt = IF - LPAR + expr + RPAR + stmt + Optional(ELSE + stmt) whilestmt = WHILE - LPAR + expr + RPAR + stmt dowhilestmt = DO - stmt + WHILE + LPAR + expr + RPAR + SEMI returnstmt = RETURN - expr + SEMI stmt << Group( ifstmt | whilestmt | dowhilestmt | returnstmt | expr + SEMI | LBRACE + ZeroOrMore(stmt) + RBRACE | SEMI) vardecl = Group(TYPE + NAME + Optional(LBRACK + integer + RBRACK)) + SEMI arg = Group(TYPE + NAME) body = ZeroOrMore(vardecl) + ZeroOrMore(stmt) fundecl = Group(TYPE + NAME + LPAR + Optional(Group(delimitedList(arg))) + RPAR + LBRACE + Group(body) + RBRACE) decl = fundecl | vardecl program = ZeroOrMore(decl) program.ignore(cStyleComment) # set parser element names for vname in ("ifstmt whilestmt dowhilestmt returnstmt TYPE " "NAME fundecl vardecl program arg body stmt".split()): v = vars()[vname] v.setName(vname) #~ for vname in "fundecl stmt".split(): #~ v = vars()[vname] #~ v.setDebug() test = r""" /* A factorial program */ int putstr(char *s) { while(*s) putchar(*s++); } int fac(int n) { if (n == 0) return 1; else return n*fac(n-1); } int putn(int n) { if (9 < n) putn(n / 10); putchar((n%10) + '0'); } int facpr(int n) { putstr("factorial "); putn(n); putstr(" = "); putn(fac(n)); putstr("\n"); } int main() { int i; i = 0; while(i < 10) facpr(i++); return 0; } """ ast = program.parseString(test,parseAll=True) import pprint pprint.pprint(ast.asList()) pyparsing-2.0.3/examples/gen_ctypes.py0000664000175000017500000001206712171425202017104 0ustar barrybarryfrom pyparsing import * typemap = { "byte" : "c_byte", "char" : "c_char", "char *" : "c_char_p", "double" : "c_double", "float" : "c_float", "int" : "c_int", "int16" : "c_int16", "int32" : "c_int32", "int64" : "c_int64", "int8" : "c_int8", "long" : "c_long", "longlong" : "c_longlong", "short" : "c_short", "size_t" : "c_size_t", "ubyte" : "c_ubyte", "uchar" : "c_ubyte", "u_char" : "c_ubyte", "uint" : "c_uint", "u_int" : "c_uint", "uint16" : "c_uint16", "uint32" : "c_uint32", "uint64" : "c_uint64", "uint8" : "c_uint8", "u_long" : "c_ulong", "ulong" : "c_ulong", "ulonglong" : "c_ulonglong", "ushort" : "c_ushort", "u_short" : "c_ushort", "void *" : "c_void_p", "voidp" : "c_voidp", "wchar" : "c_wchar", "wchar *" : "c_wchar_p", "Bool" : "c_bool", "void" : "None", } LPAR,RPAR,LBRACE,RBRACE,COMMA,SEMI = map(Suppress,"(){},;") ident = Word(alphas, alphanums + "_") integer = Regex(r"[+-]?\d+") hexinteger = Regex(r"0x[0-9a-fA-F]+") const = Suppress("const") primitiveType = oneOf(t for t in typemap if not t.endswith("*")) structType = Suppress("struct") + ident vartype = (Optional(const) + (primitiveType | structType | ident) + Optional(Word("*")("ptr"))) def normalizetype(t): if isinstance(t, ParseResults): return ' '.join(t) #~ ret = ParseResults([' '.join(t)]) #~ return ret vartype.setParseAction(normalizetype) arg = Group(vartype("argtype") + Optional(ident("argname"))) func_def = (vartype("fn_type") + ident("fn_name") + LPAR + Optional(delimitedList(arg|"..."))("fn_args") + RPAR + SEMI) def derivefields(t): if t.fn_args and t.fn_args[-1] == "...": t["varargs"]=True func_def.setParseAction(derivefields) fn_typedef = "typedef" + func_def var_typedef = "typedef" + primitiveType("primType") + ident("name") + SEMI enum_def = (Keyword("enum") + LBRACE + delimitedList(Group(ident("name") + '=' + (hexinteger|integer)("value")))("evalues") + Optional(COMMA) + RBRACE) c_header = open("snmp_api.h").read() module = "pynetsnmp" user_defined_types = set() typedefs = [] fn_typedefs = [] functions = [] enum_constants = [] # add structures commonly included from std lib headers def addStdType(t,namespace=""): fullname = namespace+'_'+t if namespace else t typemap[t] = fullname user_defined_types.add(t) addStdType("fd_set", "sys_select") addStdType("timeval", "sys_time") def getUDType(typestr): key = typestr.rstrip(" *") if key not in typemap: user_defined_types.add(key) typemap[key] = "%s_%s" % (module, key) def typeAsCtypes(typestr): if typestr in typemap: return typemap[typestr] if typestr.endswith("*"): return "POINTER(%s)" % typeAsCtypes(typestr.rstrip(" *")) return typestr # scan input header text for primitive typedefs for td,_,_ in var_typedef.scanString(c_header): typedefs.append( (td.name, td.primType) ) # add typedef type to typemap to map to itself typemap[td.name] = td.name # scan input header text for function typedefs fn_typedefs = fn_typedef.searchString(c_header) # add each function typedef to typemap to map to itself for fntd in fn_typedefs: typemap[fntd.fn_name] = fntd.fn_name # scan input header text, and keep running list of user-defined types for fn,_,_ in (cStyleComment.suppress() | fn_typedef.suppress() | func_def).scanString(c_header): if not fn: continue getUDType(fn.fn_type) for arg in fn.fn_args: if arg != "...": if arg.argtype not in typemap: getUDType(arg.argtype) functions.append(fn) # scan input header text for enums enum_def.ignore(cppStyleComment) for en_,_,_ in enum_def.scanString(c_header): for ev in en_.evalues: enum_constants.append( (ev.name, ev.value) ) print("from ctypes import *") print("%s = CDLL('%s.dll')" % (module, module)) print() print("# user defined types") for tdname,tdtyp in typedefs: print("%s = %s" % (tdname, typemap[tdtyp])) for fntd in fn_typedefs: print("%s = CFUNCTYPE(%s)" % (fntd.fn_name, ',\n '.join(typeAsCtypes(a.argtype) for a in fntd.fn_args))) for udtype in user_defined_types: print("class %s(Structure): pass" % typemap[udtype]) print() print("# constant definitions") for en,ev in enum_constants: print("%s = %s" % (en,ev)) print() print("# functions") for fn in functions: prefix = "%s.%s" % (module, fn.fn_name) print("%s.restype = %s" % (prefix, typeAsCtypes(fn.fn_type))) if fn.varargs: print("# warning - %s takes variable argument list" % prefix) del fn.fn_args[-1] if fn.fn_args.asList() != [['void']]: print("%s.argtypes = (%s,)" % (prefix, ','.join(typeAsCtypes(a.argtype) for a in fn.fn_args))) else: print("%s.argtypes = ()" % (prefix)) pyparsing-2.0.3/examples/invRegex.py0000664000175000017500000001674412171425201016540 0ustar barrybarry# # invRegex.py # # Copyright 2008, Paul McGuire # # pyparsing script to expand a regular expression into all possible matching strings # Supports: # - {n} and {m,n} repetition, but not unbounded + or * repetition # - ? optional elements # - [] character ranges # - () grouping # - | alternation # __all__ = ["count","invert"] from pyparsing import (Literal, oneOf, printables, ParserElement, Combine, SkipTo, operatorPrecedence, ParseFatalException, Word, nums, opAssoc, Suppress, ParseResults, srange) class CharacterRangeEmitter(object): def __init__(self,chars): # remove duplicate chars in character range, but preserve original order seen = set() self.charset = "".join( seen.add(c) or c for c in chars if c not in seen ) def __str__(self): return '['+self.charset+']' def __repr__(self): return '['+self.charset+']' def makeGenerator(self): def genChars(): for s in self.charset: yield s return genChars class OptionalEmitter(object): def __init__(self,expr): self.expr = expr def makeGenerator(self): def optionalGen(): yield "" for s in self.expr.makeGenerator()(): yield s return optionalGen class DotEmitter(object): def makeGenerator(self): def dotGen(): for c in printables: yield c return dotGen class GroupEmitter(object): def __init__(self,exprs): self.exprs = ParseResults(exprs) def makeGenerator(self): def groupGen(): def recurseList(elist): if len(elist)==1: for s in elist[0].makeGenerator()(): yield s else: for s in elist[0].makeGenerator()(): for s2 in recurseList(elist[1:]): yield s + s2 if self.exprs: for s in recurseList(self.exprs): yield s return groupGen class AlternativeEmitter(object): def __init__(self,exprs): self.exprs = exprs def makeGenerator(self): def altGen(): for e in self.exprs: for s in e.makeGenerator()(): yield s return altGen class LiteralEmitter(object): def __init__(self,lit): self.lit = lit def __str__(self): return "Lit:"+self.lit def __repr__(self): return "Lit:"+self.lit def makeGenerator(self): def litGen(): yield self.lit return litGen def handleRange(toks): return CharacterRangeEmitter(srange(toks[0])) def handleRepetition(toks): toks=toks[0] if toks[1] in "*+": raise ParseFatalException("",0,"unbounded repetition operators not supported") if toks[1] == "?": return OptionalEmitter(toks[0]) if "count" in toks: return GroupEmitter([toks[0]] * int(toks.count)) if "minCount" in toks: mincount = int(toks.minCount) maxcount = int(toks.maxCount) optcount = maxcount - mincount if optcount: opt = OptionalEmitter(toks[0]) for i in range(1,optcount): opt = OptionalEmitter(GroupEmitter([toks[0],opt])) return GroupEmitter([toks[0]] * mincount + [opt]) else: return [toks[0]] * mincount def handleLiteral(toks): lit = "" for t in toks: if t[0] == "\\": if t[1] == "t": lit += '\t' else: lit += t[1] else: lit += t return LiteralEmitter(lit) def handleMacro(toks): macroChar = toks[0][1] if macroChar == "d": return CharacterRangeEmitter("0123456789") elif macroChar == "w": return CharacterRangeEmitter(srange("[A-Za-z0-9_]")) elif macroChar == "s": return LiteralEmitter(" ") else: raise ParseFatalException("",0,"unsupported macro character (" + macroChar + ")") def handleSequence(toks): return GroupEmitter(toks[0]) def handleDot(): return CharacterRangeEmitter(printables) def handleAlternative(toks): return AlternativeEmitter(toks[0]) _parser = None def parser(): global _parser if _parser is None: ParserElement.setDefaultWhitespaceChars("") lbrack,rbrack,lbrace,rbrace,lparen,rparen = map(Literal,"[]{}()") reMacro = Combine("\\" + oneOf(list("dws"))) escapedChar = ~reMacro + Combine("\\" + oneOf(list(printables))) reLiteralChar = "".join(c for c in printables if c not in r"\[]{}().*?+|") + " \t" reRange = Combine(lbrack + SkipTo(rbrack,ignore=escapedChar) + rbrack) reLiteral = ( escapedChar | oneOf(list(reLiteralChar)) ) reDot = Literal(".") repetition = ( ( lbrace + Word(nums).setResultsName("count") + rbrace ) | ( lbrace + Word(nums).setResultsName("minCount")+","+ Word(nums).setResultsName("maxCount") + rbrace ) | oneOf(list("*+?")) ) reRange.setParseAction(handleRange) reLiteral.setParseAction(handleLiteral) reMacro.setParseAction(handleMacro) reDot.setParseAction(handleDot) reTerm = ( reLiteral | reRange | reMacro | reDot ) reExpr = operatorPrecedence( reTerm, [ (repetition, 1, opAssoc.LEFT, handleRepetition), (None, 2, opAssoc.LEFT, handleSequence), (Suppress('|'), 2, opAssoc.LEFT, handleAlternative), ] ) _parser = reExpr return _parser def count(gen): """Simple function to count the number of elements returned by a generator.""" i = 0 for s in gen: i += 1 return i def invert(regex): """Call this routine as a generator to return all the strings that match the input regular expression. for s in invert("[A-Z]{3}\d{3}"): print s """ invReGenerator = GroupEmitter(parser().parseString(regex)).makeGenerator() return invReGenerator() def main(): tests = r""" [A-EA] [A-D]* [A-D]{3} X[A-C]{3}Y X[A-C]{3}\( X\d foobar\d\d foobar{2} foobar{2,9} fooba[rz]{2} (foobar){2} ([01]\d)|(2[0-5]) ([01]\d\d)|(2[0-4]\d)|(25[0-5]) [A-C]{1,2} [A-C]{0,3} [A-C]\s[A-C]\s[A-C] [A-C]\s?[A-C][A-C] [A-C]\s([A-C][A-C]) [A-C]\s([A-C][A-C])? [A-C]{2}\d{2} @|TH[12] @(@|TH[12])? @(@|TH[12]|AL[12]|SP[123]|TB(1[0-9]?|20?|[3-9]))? @(@|TH[12]|AL[12]|SP[123]|TB(1[0-9]?|20?|[3-9])|OH(1[0-9]?|2[0-9]?|30?|[4-9]))? (([ECMP]|HA|AK)[SD]|HS)T [A-CV]{2} A[cglmrstu]|B[aehikr]?|C[adeflmorsu]?|D[bsy]|E[rsu]|F[emr]?|G[ade]|H[efgos]?|I[nr]?|Kr?|L[airu]|M[dgnot]|N[abdeiop]?|Os?|P[abdmortu]?|R[abefghnu]|S[bcegimnr]?|T[abcehilm]|Uu[bhopqst]|U|V|W|Xe|Yb?|Z[nr] (a|b)|(x|y) (a|b) (x|y) """.split('\n') for t in tests: t = t.strip() if not t: continue print('-'*50) print(t) try: print(count(invert(t))) for s in invert(t): print(s) except ParseFatalException as pfe: print(pfe.msg) print() continue print() if __name__ == "__main__": main() pyparsing-2.0.3/examples/httpServerLogParser.py0000664000175000017500000000677112171425201020735 0ustar barrybarry# httpServerLogParser.py # """ Parser for HTTP server log output, of the form: 195.146.134.15 - - [20/Jan/2003:08:55:36 -0800] "GET /path/to/page.html HTTP/1.0" 200 4649 "http://www.somedomain.com/020602/page.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" 127.0.0.1 - u.surname@domain.com [12/Sep/2006:14:13:53 +0300] "GET /skins/monobook/external.png HTTP/1.0" 304 - "http://wiki.mysite.com/skins/monobook/main.css" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6" You can then break it up as follows: IP ADDRESS - - Server Date / Time [SPACE] "GET /path/to/page HTTP/Type Request" Success Code Bytes Sent To Client Referer Client Software """ from pyparsing import alphas,nums, dblQuotedString, Combine, Word, Group, delimitedList, Suppress, removeQuotes import string def getCmdFields( s, l, t ): t["method"],t["requestURI"],t["protocolVersion"] = t[0].strip('"').split() logLineBNF = None def getLogLineBNF(): global logLineBNF if logLineBNF is None: integer = Word( nums ) ipAddress = delimitedList( integer, ".", combine=True ) timeZoneOffset = Word("+-",nums) month = Word(string.uppercase, string.lowercase, exact=3) serverDateTime = Group( Suppress("[") + Combine( integer + "/" + month + "/" + integer + ":" + integer + ":" + integer + ":" + integer ) + timeZoneOffset + Suppress("]") ) logLineBNF = ( ipAddress.setResultsName("ipAddr") + Suppress("-") + ("-" | Word( alphas+nums+"@._" )).setResultsName("auth") + serverDateTime.setResultsName("timestamp") + dblQuotedString.setResultsName("cmd").setParseAction(getCmdFields) + (integer | "-").setResultsName("statusCode") + (integer | "-").setResultsName("numBytesSent") + dblQuotedString.setResultsName("referrer").setParseAction(removeQuotes) + dblQuotedString.setResultsName("clientSfw").setParseAction(removeQuotes) ) return logLineBNF testdata = """ 195.146.134.15 - - [20/Jan/2003:08:55:36 -0800] "GET /path/to/page.html HTTP/1.0" 200 4649 "http://www.somedomain.com/020602/page.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" 111.111.111.11 - - [16/Feb/2004:04:09:49 -0800] "GET /ads/redirectads/336x280redirect.htm HTTP/1.1" 304 - "http://www.foobarp.org/theme_detail.php?type=vs&cat=0&mid=27512" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" 11.111.11.111 - - [16/Feb/2004:10:35:12 -0800] "GET /ads/redirectads/468x60redirect.htm HTTP/1.1" 200 541 "http://11.11.111.11/adframe.php?n=ad1f311a&what=zone:56" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Opera 7.20 [ru\"]" 127.0.0.1 - u.surname@domain.com [12/Sep/2006:14:13:53 +0300] "GET /skins/monobook/external.png HTTP/1.0" 304 - "http://wiki.mysite.com/skins/monobook/main.css" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6" """ for line in testdata.split("\n"): if not line: continue fields = getLogLineBNF().parseString(line) print(fields.dump()) #~ print repr(fields) #~ for k in fields.keys(): #~ print "fields." + k + " =", fields[k] print(fields.asXML("LOG")) print() pyparsing-2.0.3/examples/wordsToNum.py0000664000175000017500000000627312171425201017066 0ustar barrybarry# wordsToNum.py # Copyright 2006, Paul McGuire # # Sample parser grammar to read a number given in words, and return the numeric value. # from pyparsing import * from operator import mul from functools import reduce def makeLit(s,val): ret = CaselessLiteral(s).setName(s) return ret.setParseAction( replaceWith(val) ) unitDefinitions = [ ("zero", 0), ("oh", 0), ("zip", 0), ("zilch", 0), ("nada", 0), ("bupkis", 0), ("one", 1), ("two", 2), ("three", 3), ("four", 4), ("five", 5), ("six", 6), ("seven", 7), ("eight", 8), ("nine", 9), ("ten", 10), ("eleven", 11), ("twelve", 12), ("thirteen", 13), ("fourteen", 14), ("fifteen", 15), ("sixteen", 16), ("seventeen", 17), ("eighteen", 18), ("nineteen", 19), ] units = Or( [ makeLit(s,v) for s,v in unitDefinitions ] ) tensDefinitions = [ ("ten", 10), ("twenty", 20), ("thirty", 30), ("forty", 40), ("fourty", 40), # for the spelling-challenged... ("fifty", 50), ("sixty", 60), ("seventy", 70), ("eighty", 80), ("ninety", 90), ] tens = Or( [ makeLit(s,v) for s,v in tensDefinitions ] ) hundreds = makeLit("hundred", 100) majorDefinitions = [ ("thousand", int(1e3)), ("million", int(1e6)), ("billion", int(1e9)), ("trillion", int(1e12)), ("quadrillion", int(1e15)), ("quintillion", int(1e18)), ] mag = Or( [ makeLit(s,v) for s,v in majorDefinitions ] ) wordprod = lambda t: reduce(mul,t) wordsum = lambda t: sum(t) numPart = (((( units + Optional(hundreds) ).setParseAction(wordprod) + Optional(tens)).setParseAction(wordsum) ^ tens ) + Optional(units) ).setParseAction(wordsum) numWords = OneOrMore( (numPart + Optional(mag)).setParseAction(wordprod) ).setParseAction(wordsum) + StringEnd() numWords.ignore("-") numWords.ignore(CaselessLiteral("and")) def test(s,expected): try: val = numWords.parseString(s)[0] except ParseException as pe: print("Parsing failed:") print(s) print("%s^" % (' '*(pe.col-1))) print(pe.msg) else: print("'%s' -> %d" % (s, val), end=' ') if val == expected: print("CORRECT") else: print("***WRONG***, expected %d" % expected) test("one hundred twenty hundred", 120) test("one hundred and twennty", 120) test("one hundred and twenty", 120) test("one hundred and three", 103) test("one hundred twenty-three", 123) test("one hundred and twenty three", 123) test("one hundred twenty three million", 123000000) test("one hundred and twenty three million", 123000000) test("one hundred twenty three million and three", 123000003) test("fifteen hundred and sixty five", 1565) test("seventy-seven thousand eight hundred and nineteen", 77819) test("seven hundred seventy-seven thousand seven hundred and seventy-seven", 777777) test("zero", 0) test("forty two", 42) test("fourty two", 42)pyparsing-2.0.3/examples/dictExample2.py0000664000175000017500000000422612171425201017262 0ustar barrybarry# # dictExample2.py # # Illustration of using pyparsing's Dict class to process tabular data # Enhanced Dict example, courtesy of Mike Kelly # # Copyright (c) 2004, Paul McGuire # from pyparsing import Literal, Word, Group, Dict, ZeroOrMore, alphas, nums, delimitedList import pprint testData = """ +-------+------+------+------+------+------+------+------+------+ | | A1 | B1 | C1 | D1 | A2 | B2 | C2 | D2 | +=======+======+======+======+======+======+======+======+======+ | min | 7 | 43 | 7 | 15 | 82 | 98 | 1 | 37 | | max | 11 | 52 | 10 | 17 | 85 | 112 | 4 | 39 | | ave | 9 | 47 | 8 | 16 | 84 | 106 | 3 | 38 | | sdev | 1 | 3 | 1 | 1 | 1 | 3 | 1 | 1 | +-------+------+------+------+------+------+------+------+------+ """ # define grammar for datatable underline = Word("-=") number = Word(nums).setParseAction( lambda t : int(t[0]) ) vert = Literal("|").suppress() rowDelim = ("+" + ZeroOrMore( underline + "+" ) ).suppress() columnHeader = Group(vert + vert + delimitedList(Word(alphas + nums), "|") + vert) heading = rowDelim + columnHeader.setResultsName("columns") + rowDelim rowData = Group( vert + Word(alphas) + vert + delimitedList(number,"|") + vert ) trailing = rowDelim datatable = heading + Dict( ZeroOrMore(rowData) ) + trailing # now parse data and print results data = datatable.parseString(testData) print(data) print(data.asXML("DATA")) pprint.pprint(data.asList()) print("data keys=", list(data.keys())) print("data['min']=", data['min']) print("sum(data['min']) =", sum(data['min'])) print("data.max =", data.max) print("sum(data.max) =", sum(data.max)) # now print transpose of data table, using column labels read from table header and # values from data lists print() print(" " * 5, end=' ') for i in range(1,len(data)): print("|%5s" % data[i][0], end=' ') print() print(("-" * 6) + ("+------" * (len(data)-1))) for i in range(len(data.columns)): print("%5s" % data.columns[i], end=' ') for j in range(len(data) - 1): print('|%5s' % data[j + 1][i + 1], end=' ') print() pyparsing-2.0.3/examples/dictExample.py0000664000175000017500000000311412171425201017173 0ustar barrybarry# # dictExample.py # # Illustration of using pyparsing's Dict class to process tabular data # # Copyright (c) 2003, Paul McGuire # from pyparsing import Literal, Word, Group, Dict, ZeroOrMore, alphas, nums, delimitedList import pprint testData = """ +-------+------+------+------+------+------+------+------+------+ | | A1 | B1 | C1 | D1 | A2 | B2 | C2 | D2 | +=======+======+======+======+======+======+======+======+======+ | min | 7 | 43 | 7 | 15 | 82 | 98 | 1 | 37 | | max | 11 | 52 | 10 | 17 | 85 | 112 | 4 | 39 | | ave | 9 | 47 | 8 | 16 | 84 | 106 | 3 | 38 | | sdev | 1 | 3 | 1 | 1 | 1 | 3 | 1 | 1 | +-------+------+------+------+------+------+------+------+------+ """ # define grammar for datatable heading = (Literal( "+-------+------+------+------+------+------+------+------+------+") + "| | A1 | B1 | C1 | D1 | A2 | B2 | C2 | D2 |" + "+=======+======+======+======+======+======+======+======+======+").suppress() vert = Literal("|").suppress() number = Word(nums) rowData = Group( vert + Word(alphas) + vert + delimitedList(number,"|") + vert ) trailing = Literal( "+-------+------+------+------+------+------+------+------+------+").suppress() datatable = heading + Dict( ZeroOrMore(rowData) ) + trailing # now parse data and print results data = datatable.parseString(testData) print(data) pprint.pprint(data.asList()) print("data keys=", list(data.keys())) print("data['min']=", data['min']) print("data.max", data.max) pyparsing-2.0.3/examples/listAllMatches.py0000664000175000017500000000337412171425201017655 0ustar barrybarry# listAllMatches.py # # Sample program showing how/when to use listAllMatches to get all matching tokens in a results name. # # copyright 2006, Paul McGuire # from pyparsing import oneOf, OneOrMore, printables, StringEnd test = "The quick brown fox named 'Aloysius' lives at 123 Main Street (and jumps over lazy dogs in his spare time)." nonAlphas = [ c for c in printables if not c.isalpha() ] print("Extract vowels, consonants, and special characters from this test string:") print("'" + test + "'") print() print("Define grammar using normal results names") print("(only last matching symbol is saved)") vowels = oneOf(list("aeiouy"), caseless=True).setResultsName("vowels") cons = oneOf(list("bcdfghjklmnpqrstvwxz"), caseless=True).setResultsName("cons") other = oneOf(list(nonAlphas)).setResultsName("others") letters = OneOrMore(cons | vowels | other) + StringEnd() results = letters.parseString(test) print(results) print(results.vowels) print(results.cons) print(results.others) print() print("Define grammar using results names, with listAllMatches=True") print("(all matching symbols are saved)") vowels = oneOf(list("aeiouy"), caseless=True).setResultsName("vowels",listAllMatches=True) cons = oneOf(list("bcdfghjklmnpqrstvwxz"), caseless=True).setResultsName("cons",listAllMatches=True) other = oneOf(list(nonAlphas)).setResultsName("others",listAllMatches=True) letters = OneOrMore(cons | vowels | other) + StringEnd() results = letters.parseString(test) print(results) print(sorted(list(set(results)))) print() print(results.vowels) print(sorted(list(set(results.vowels)))) print() print(results.cons) print(sorted(list(set(results.cons)))) print() print(results.others) print(sorted(list(set(results.others)))) pyparsing-2.0.3/pyparsing.py0000664000175000017500000046506012373564277015173 0ustar barrybarry# module pyparsing.py # # Copyright (c) 2003-2013 Paul T. McGuire # # 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. # __doc__ = \ """ pyparsing module - Classes and methods to define and execute parsing grammars The pyparsing module is an alternative approach to creating and executing simple grammars, vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you don't need to learn a new syntax for defining grammars or matching expressions - the parsing module provides a library of classes that you use to construct the grammar directly in Python. Here is a program to parse "Hello, World!" (or any greeting of the form C{", !"}):: from pyparsing import Word, alphas # define grammar of a greeting greet = Word( alphas ) + "," + Word( alphas ) + "!" hello = "Hello, World!" print (hello, "->", greet.parseString( hello )) The program outputs the following:: Hello, World! -> ['Hello', ',', 'World', '!'] The Python representation of the grammar is quite readable, owing to the self-explanatory class names, and the use of '+', '|' and '^' operators. The parsed results returned from C{parseString()} can be accessed as a nested list, a dictionary, or an object with named attributes. The pyparsing module handles some of the problems that are typically vexing when writing text parsers: - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) - quoted strings - embedded comments """ __version__ = "2.0.3" __versionTime__ = "16 Aug 2014 00:12" __author__ = "Paul McGuire " import string from weakref import ref as wkref import copy import sys import warnings import re import sre_constants import collections import pprint #~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) __all__ = [ 'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', 'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', 'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', 'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', 'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', 'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', 'Upcase', 'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', 'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', 'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', 'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', 'htmlComment', 'javaStyleComment', 'keepOriginalText', 'line', 'lineEnd', 'lineStart', 'lineno', 'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', 'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', 'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', 'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', 'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', 'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', ] PY_3 = sys.version.startswith('3') if PY_3: _MAX_INT = sys.maxsize basestring = str unichr = chr _ustr = str # build list of single arg builtins, that can be used as parse actions singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] else: _MAX_INT = sys.maxint range = xrange def _ustr(obj): """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It then < returns the unicode object | encodes it with the default encoding | ... >. """ if isinstance(obj,unicode): return obj try: # If this works, then _ustr(obj) has the same behaviour as str(obj), so # it won't break any existing code. return str(obj) except UnicodeEncodeError: # The Python docs (http://docs.python.org/ref/customization.html#l2h-182) # state that "The return value must be a string object". However, does a # unicode object (being a subclass of basestring) count as a "string # object"? # If so, then return a unicode object: return unicode(obj) # Else encode it... but how? There are many choices... :) # Replace unprintables with escape codes? #return unicode(obj).encode(sys.getdefaultencoding(), 'backslashreplace_errors') # Replace unprintables with question marks? #return unicode(obj).encode(sys.getdefaultencoding(), 'replace') # ... # build list of single arg builtins, tolerant of Python version, that can be used as parse actions singleArgBuiltins = [] import __builtin__ for fname in "sum len sorted reversed list tuple set any all min max".split(): try: singleArgBuiltins.append(getattr(__builtin__,fname)) except AttributeError: continue _generatorType = type((y for y in range(1))) def _xml_escape(data): """Escape &, <, >, ", ', etc. in a string of data.""" # ampersand must be replaced first from_symbols = '&><"\'' to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) for from_,to_ in zip(from_symbols, to_symbols): data = data.replace(from_, to_) return data class _Constants(object): pass alphas = string.ascii_lowercase + string.ascii_uppercase nums = "0123456789" hexnums = nums + "ABCDEFabcdef" alphanums = alphas + nums _bslash = chr(92) printables = "".join(c for c in string.printable if c not in string.whitespace) class ParseBaseException(Exception): """base exception class for all parsing runtime exceptions""" # Performance tuning: we construct a *lot* of these, so keep this # constructor as small and fast as possible def __init__( self, pstr, loc=0, msg=None, elem=None ): self.loc = loc if msg is None: self.msg = pstr self.pstr = "" else: self.msg = msg self.pstr = pstr self.parserElement = elem def __getattr__( self, aname ): """supported attributes by name are: - lineno - returns the line number of the exception text - col - returns the column number of the exception text - line - returns the line containing the exception text """ if( aname == "lineno" ): return lineno( self.loc, self.pstr ) elif( aname in ("col", "column") ): return col( self.loc, self.pstr ) elif( aname == "line" ): return line( self.loc, self.pstr ) else: raise AttributeError(aname) def __str__( self ): return "%s (at char %d), (line:%d, col:%d)" % \ ( self.msg, self.loc, self.lineno, self.column ) def __repr__( self ): return _ustr(self) def markInputline( self, markerString = ">!<" ): """Extracts the exception line from the input string, and marks the location of the exception with a special symbol. """ line_str = self.line line_column = self.column - 1 if markerString: line_str = "".join((line_str[:line_column], markerString, line_str[line_column:])) return line_str.strip() def __dir__(self): return "loc msg pstr parserElement lineno col line " \ "markInputline __str__ __repr__".split() class ParseException(ParseBaseException): """exception thrown when parse expressions don't match class; supported attributes by name are: - lineno - returns the line number of the exception text - col - returns the column number of the exception text - line - returns the line containing the exception text """ pass class ParseFatalException(ParseBaseException): """user-throwable exception thrown when inconsistent parse content is found; stops all parsing immediately""" pass class ParseSyntaxException(ParseFatalException): """just like C{L{ParseFatalException}}, but thrown internally when an C{L{ErrorStop}} ('-' operator) indicates that parsing is to stop immediately because an unbacktrackable syntax error has been found""" def __init__(self, pe): super(ParseSyntaxException, self).__init__( pe.pstr, pe.loc, pe.msg, pe.parserElement) #~ class ReparseException(ParseBaseException): #~ """Experimental class - parse actions can raise this exception to cause #~ pyparsing to reparse the input string: #~ - with a modified input string, and/or #~ - with a modified start location #~ Set the values of the ReparseException in the constructor, and raise the #~ exception in a parse action to cause pyparsing to use the new string/location. #~ Setting the values as None causes no change to be made. #~ """ #~ def __init_( self, newstring, restartLoc ): #~ self.newParseText = newstring #~ self.reparseLoc = restartLoc class RecursiveGrammarException(Exception): """exception thrown by C{validate()} if the grammar could be improperly recursive""" def __init__( self, parseElementList ): self.parseElementTrace = parseElementList def __str__( self ): return "RecursiveGrammarException: %s" % self.parseElementTrace class _ParseResultsWithOffset(object): def __init__(self,p1,p2): self.tup = (p1,p2) def __getitem__(self,i): return self.tup[i] def __repr__(self): return repr(self.tup) def setOffset(self,i): self.tup = (self.tup[0],i) class ParseResults(object): """Structured parse results, to provide multiple means of access to the parsed data: - as a list (C{len(results)}) - by list index (C{results[0], results[1]}, etc.) - by attribute (C{results.}) """ def __new__(cls, toklist, name=None, asList=True, modal=True ): if isinstance(toklist, cls): return toklist retobj = object.__new__(cls) retobj.__doinit = True return retobj # Performance tuning: we construct a *lot* of these, so keep this # constructor as small and fast as possible def __init__( self, toklist, name=None, asList=True, modal=True, isinstance=isinstance ): if self.__doinit: self.__doinit = False self.__name = None self.__parent = None self.__accumNames = {} if isinstance(toklist, list): self.__toklist = toklist[:] elif isinstance(toklist, _generatorType): self.__toklist = list(toklist) else: self.__toklist = [toklist] self.__tokdict = dict() if name is not None and name: if not modal: self.__accumNames[name] = 0 if isinstance(name,int): name = _ustr(name) # will always return a str, but use _ustr for consistency self.__name = name if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): if isinstance(toklist,basestring): toklist = [ toklist ] if asList: if isinstance(toklist,ParseResults): self[name] = _ParseResultsWithOffset(toklist.copy(),0) else: self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) self[name].__name = name else: try: self[name] = toklist[0] except (KeyError,TypeError,IndexError): self[name] = toklist def __getitem__( self, i ): if isinstance( i, (int,slice) ): return self.__toklist[i] else: if i not in self.__accumNames: return self.__tokdict[i][-1][0] else: return ParseResults([ v[0] for v in self.__tokdict[i] ]) def __setitem__( self, k, v, isinstance=isinstance ): if isinstance(v,_ParseResultsWithOffset): self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] sub = v[0] elif isinstance(k,int): self.__toklist[k] = v sub = v else: self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] sub = v if isinstance(sub,ParseResults): sub.__parent = wkref(self) def __delitem__( self, i ): if isinstance(i,(int,slice)): mylen = len( self.__toklist ) del self.__toklist[i] # convert int to slice if isinstance(i, int): if i < 0: i += mylen i = slice(i, i+1) # get removed indices removed = list(range(*i.indices(mylen))) removed.reverse() # fixup indices in token dictionary for name in self.__tokdict: occurrences = self.__tokdict[name] for j in removed: for k, (value, position) in enumerate(occurrences): occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) else: del self.__tokdict[i] def __contains__( self, k ): return k in self.__tokdict def __len__( self ): return len( self.__toklist ) def __bool__(self): return len( self.__toklist ) > 0 __nonzero__ = __bool__ def __iter__( self ): return iter( self.__toklist ) def __reversed__( self ): return iter( self.__toklist[::-1] ) def iterkeys( self ): """Returns all named result keys.""" if hasattr(self.__tokdict, "iterkeys"): return self.__tokdict.iterkeys() else: return iter(self.__tokdict) def itervalues( self ): """Returns all named result values.""" return (self[k] for k in self.iterkeys()) def iteritems( self ): return ((k, self[k]) for k in self.iterkeys()) if PY_3: keys = iterkeys values = itervalues items = iteritems else: def keys( self ): """Returns all named result keys.""" return list(self.iterkeys()) def values( self ): """Returns all named result values.""" return list(self.itervalues()) def items( self ): """Returns all named result keys and values as a list of tuples.""" return list(self.iteritems()) def haskeys( self ): """Since keys() returns an iterator, this method is helpful in bypassing code that looks for the existence of any defined results names.""" return bool(self.__tokdict) def pop( self, *args, **kwargs): """Removes and returns item at specified index (default=last). Supports both list and dict semantics for pop(). If passed no argument or an integer argument, it will use list semantics and pop tokens from the list of parsed tokens. If passed a non-integer argument (most likely a string), it will use dict semantics and pop the corresponding value from any defined results names. A second default return value argument is supported, just as in dict.pop().""" if not args: args = [-1] for k,v in kwargs.items(): if k == 'default': args = (args[0], v) else: raise TypeError("pop() got an unexpected keyword argument '%s'" % k) if (isinstance(args[0], int) or len(args) == 1 or args[0] in self): index = args[0] ret = self[index] del self[index] return ret else: defaultvalue = args[1] return defaultvalue def get(self, key, defaultValue=None): """Returns named result matching the given key, or if there is no such name, then returns the given C{defaultValue} or C{None} if no C{defaultValue} is specified.""" if key in self: return self[key] else: return defaultValue def insert( self, index, insStr ): """Inserts new element at location index in the list of parsed tokens.""" self.__toklist.insert(index, insStr) # fixup indices in token dictionary for name in self.__tokdict: occurrences = self.__tokdict[name] for k, (value, position) in enumerate(occurrences): occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) def append( self, item ): """Add single element to end of ParseResults list of elements.""" self.__toklist.append(item) def extend( self, itemseq ): """Add sequence of elements to end of ParseResults list of elements.""" if isinstance(itemseq, ParseResults): self += itemseq else: self.__toklist.extend(itemseq) def clear( self ): """Clear all elements and results names.""" del self.__toklist[:] self.__tokdict.clear() def __getattr__( self, name ): try: return self[name] except KeyError: return "" if name in self.__tokdict: if name not in self.__accumNames: return self.__tokdict[name][-1][0] else: return ParseResults([ v[0] for v in self.__tokdict[name] ]) else: return "" def __add__( self, other ): ret = self.copy() ret += other return ret def __iadd__( self, other ): if other.__tokdict: offset = len(self.__toklist) addoffset = ( lambda a: (a<0 and offset) or (a+offset) ) otheritems = other.__tokdict.items() otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) for (k,vlist) in otheritems for v in vlist] for k,v in otherdictitems: self[k] = v if isinstance(v[0],ParseResults): v[0].__parent = wkref(self) self.__toklist += other.__toklist self.__accumNames.update( other.__accumNames ) return self def __radd__(self, other): if isinstance(other,int) and other == 0: return self.copy() def __repr__( self ): return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) def __str__( self ): out = [] for i in self.__toklist: if isinstance(i, ParseResults): out.append(_ustr(i)) else: out.append(repr(i)) return '[' + ', '.join(out) + ']' def _asStringList( self, sep='' ): out = [] for item in self.__toklist: if out and sep: out.append(sep) if isinstance( item, ParseResults ): out += item._asStringList() else: out.append( _ustr(item) ) return out def asList( self ): """Returns the parse results as a nested list of matching tokens, all converted to strings.""" out = [] for res in self.__toklist: if isinstance(res,ParseResults): out.append( res.asList() ) else: out.append( res ) return out def asDict( self ): """Returns the named parse results as dictionary.""" if PY_3: return dict( self.items() ) else: return dict( self.iteritems() ) def copy( self ): """Returns a new copy of a C{ParseResults} object.""" ret = ParseResults( self.__toklist ) ret.__tokdict = self.__tokdict.copy() ret.__parent = self.__parent ret.__accumNames.update( self.__accumNames ) ret.__name = self.__name return ret def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): """Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.""" nl = "\n" out = [] namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() for v in vlist) nextLevelIndent = indent + " " # collapse out indents if formatting is not desired if not formatted: indent = "" nextLevelIndent = "" nl = "" selfTag = None if doctag is not None: selfTag = doctag else: if self.__name: selfTag = self.__name if not selfTag: if namedItemsOnly: return "" else: selfTag = "ITEM" out += [ nl, indent, "<", selfTag, ">" ] worklist = self.__toklist for i,res in enumerate(worklist): if isinstance(res,ParseResults): if i in namedItems: out += [ res.asXML(namedItems[i], namedItemsOnly and doctag is None, nextLevelIndent, formatted)] else: out += [ res.asXML(None, namedItemsOnly and doctag is None, nextLevelIndent, formatted)] else: # individual token, see if there is a name for it resTag = None if i in namedItems: resTag = namedItems[i] if not resTag: if namedItemsOnly: continue else: resTag = "ITEM" xmlBodyText = _xml_escape(_ustr(res)) out += [ nl, nextLevelIndent, "<", resTag, ">", xmlBodyText, "" ] out += [ nl, indent, "" ] return "".join(out) def __lookup(self,sub): for k,vlist in self.__tokdict.items(): for v,loc in vlist: if sub is v: return k return None def getName(self): """Returns the results name for this token expression.""" if self.__name: return self.__name elif self.__parent: par = self.__parent() if par: return par.__lookup(self) else: return None elif (len(self) == 1 and len(self.__tokdict) == 1 and self.__tokdict.values()[0][0][1] in (0,-1)): return self.__tokdict.keys()[0] else: return None def dump(self,indent='',depth=0): """Diagnostic method for listing out the contents of a C{ParseResults}. Accepts an optional C{indent} argument so that this string can be embedded in a nested display of other data.""" out = [] NL = '\n' out.append( indent+_ustr(self.asList()) ) items = sorted(self.items()) for k,v in items: if out: out.append(NL) out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) if isinstance(v,ParseResults): if v: if v.haskeys(): out.append( v.dump(indent,depth+1) ) elif any(isinstance(vv,ParseResults) for vv in v): for i,vv in enumerate(v): if isinstance(vv,ParseResults): out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth+1)),i,indent,(' '*(depth+2)),vv.dump(indent,depth+2) )) else: out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth+1)),i,indent,(' '*(depth+2)),_ustr(vv))) else: out.append(_ustr(v)) else: out.append(_ustr(v)) else: out.append(_ustr(v)) return "".join(out) def pprint(self, *args, **kwargs): """Pretty-printer for parsed results as a list, using the C{pprint} module. Accepts additional positional or keyword args as defined for the C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint})""" pprint.pprint(self.asList(), *args, **kwargs) # add support for pickle protocol def __getstate__(self): return ( self.__toklist, ( self.__tokdict.copy(), self.__parent is not None and self.__parent() or None, self.__accumNames, self.__name ) ) def __setstate__(self,state): self.__toklist = state[0] (self.__tokdict, par, inAccumNames, self.__name) = state[1] self.__accumNames = {} self.__accumNames.update(inAccumNames) if par is not None: self.__parent = wkref(par) else: self.__parent = None def __dir__(self): return dir(super(ParseResults,self)) + list(self.keys()) collections.MutableMapping.register(ParseResults) def col (loc,strg): """Returns current column within a string, counting newlines as line separators. The first column is number 1. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{ParserElement.parseString}} for more information on parsing strings containing C{}s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. """ return (loc} for more information on parsing strings containing C{}s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. """ return strg.count("\n",0,loc) + 1 def line( loc, strg ): """Returns the line of text containing loc within a string, counting newlines as line separators. """ lastCR = strg.rfind("\n", 0, loc) nextCR = strg.find("\n", loc) if nextCR >= 0: return strg[lastCR+1:nextCR] else: return strg[lastCR+1:] def _defaultStartDebugAction( instring, loc, expr ): print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) def _defaultExceptionDebugAction( instring, loc, expr, exc ): print ("Exception raised:" + _ustr(exc)) def nullDebugAction(*args): """'Do-nothing' debug action, to suppress debugging output during parsing.""" pass # Only works on Python 3.x - nonlocal is toxic to Python 2 installs #~ 'decorator to trim function calls to match the arity of the target' #~ def _trim_arity(func, maxargs=3): #~ if func in singleArgBuiltins: #~ return lambda s,l,t: func(t) #~ limit = 0 #~ foundArity = False #~ def wrapper(*args): #~ nonlocal limit,foundArity #~ while 1: #~ try: #~ ret = func(*args[limit:]) #~ foundArity = True #~ return ret #~ except TypeError: #~ if limit == maxargs or foundArity: #~ raise #~ limit += 1 #~ continue #~ return wrapper # this version is Python 2.x-3.x cross-compatible 'decorator to trim function calls to match the arity of the target' def _trim_arity(func, maxargs=2): if func in singleArgBuiltins: return lambda s,l,t: func(t) limit = [0] foundArity = [False] def wrapper(*args): while 1: try: ret = func(*args[limit[0]:]) foundArity[0] = True return ret except TypeError: if limit[0] <= maxargs and not foundArity[0]: limit[0] += 1 continue raise return wrapper class ParserElement(object): """Abstract base level parser element class.""" DEFAULT_WHITE_CHARS = " \n\t\r" verbose_stacktrace = False def setDefaultWhitespaceChars( chars ): """Overrides the default whitespace chars """ ParserElement.DEFAULT_WHITE_CHARS = chars setDefaultWhitespaceChars = staticmethod(setDefaultWhitespaceChars) def inlineLiteralsUsing(cls): """ Set class to be used for inclusion of string literals into a parser. """ ParserElement.literalStringClass = cls inlineLiteralsUsing = staticmethod(inlineLiteralsUsing) def __init__( self, savelist=False ): self.parseAction = list() self.failAction = None #~ self.name = "" # don't define self.name, let subclasses try/except upcall self.strRepr = None self.resultsName = None self.saveAsList = savelist self.skipWhitespace = True self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS self.copyDefaultWhiteChars = True self.mayReturnEmpty = False # used when checking for left-recursion self.keepTabs = False self.ignoreExprs = list() self.debug = False self.streamlined = False self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index self.errmsg = "" self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) self.debugActions = ( None, None, None ) #custom debug actions self.re = None self.callPreparse = True # used to avoid redundant calls to preParse self.callDuringTry = False def copy( self ): """Make a copy of this C{ParserElement}. Useful for defining different parse actions for the same parsing pattern, using copies of the original parse element.""" cpy = copy.copy( self ) cpy.parseAction = self.parseAction[:] cpy.ignoreExprs = self.ignoreExprs[:] if self.copyDefaultWhiteChars: cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS return cpy def setName( self, name ): """Define name for this expression, for use in debugging.""" self.name = name self.errmsg = "Expected " + self.name if hasattr(self,"exception"): self.exception.msg = self.errmsg return self def setResultsName( self, name, listAllMatches=False ): """Define name for referencing matching tokens as a nested attribute of the returned parse results. NOTE: this returns a *copy* of the original C{ParserElement} object; this is so that the client can define a basic element, such as an integer, and reference it in multiple places with different names. You can also set results names using the abbreviated syntax, C{expr("name")} in place of C{expr.setResultsName("name")} - see L{I{__call__}<__call__>}. """ newself = self.copy() if name.endswith("*"): name = name[:-1] listAllMatches=True newself.resultsName = name newself.modalResults = not listAllMatches return newself def setBreak(self,breakFlag = True): """Method to invoke the Python pdb debugger when this element is about to be parsed. Set C{breakFlag} to True to enable, False to disable. """ if breakFlag: _parseMethod = self._parse def breaker(instring, loc, doActions=True, callPreParse=True): import pdb pdb.set_trace() return _parseMethod( instring, loc, doActions, callPreParse ) breaker._originalParseMethod = _parseMethod self._parse = breaker else: if hasattr(self._parse,"_originalParseMethod"): self._parse = self._parse._originalParseMethod return self def setParseAction( self, *fns, **kwargs ): """Define action to perform when successfully matching parse element definition. Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: - s = the original string being parsed (see note below) - loc = the location of the matching substring - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object If the functions in fns modify the tokens, they can return them as the return value from fn, and the modified list of tokens will replace the original. Otherwise, fn does not need to return any value. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{parseString}} for more information on parsing strings containing C{}s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. """ self.parseAction = list(map(_trim_arity, list(fns))) self.callDuringTry = ("callDuringTry" in kwargs and kwargs["callDuringTry"]) return self def addParseAction( self, *fns, **kwargs ): """Add parse action to expression's list of parse actions. See L{I{setParseAction}}.""" self.parseAction += list(map(_trim_arity, list(fns))) self.callDuringTry = self.callDuringTry or ("callDuringTry" in kwargs and kwargs["callDuringTry"]) return self def setFailAction( self, fn ): """Define action to perform if parsing fails at this expression. Fail acton fn is a callable function that takes the arguments C{fn(s,loc,expr,err)} where: - s = string being parsed - loc = location where expression match was attempted and failed - expr = the parse expression that failed - err = the exception thrown The function returns no value. It may throw C{L{ParseFatalException}} if it is desired to stop parsing immediately.""" self.failAction = fn return self def _skipIgnorables( self, instring, loc ): exprsFound = True while exprsFound: exprsFound = False for e in self.ignoreExprs: try: while 1: loc,dummy = e._parse( instring, loc ) exprsFound = True except ParseException: pass return loc def preParse( self, instring, loc ): if self.ignoreExprs: loc = self._skipIgnorables( instring, loc ) if self.skipWhitespace: wt = self.whiteChars instrlen = len(instring) while loc < instrlen and instring[loc] in wt: loc += 1 return loc def parseImpl( self, instring, loc, doActions=True ): return loc, [] def postParse( self, instring, loc, tokenlist ): return tokenlist #~ @profile def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): debugging = ( self.debug ) #and doActions ) if debugging or self.failAction: #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) if (self.debugActions[0] ): self.debugActions[0]( instring, loc, self ) if callPreParse and self.callPreparse: preloc = self.preParse( instring, loc ) else: preloc = loc tokensStart = preloc try: try: loc,tokens = self.parseImpl( instring, preloc, doActions ) except IndexError: raise ParseException( instring, len(instring), self.errmsg, self ) except ParseBaseException as err: #~ print ("Exception raised:", err) if self.debugActions[2]: self.debugActions[2]( instring, tokensStart, self, err ) if self.failAction: self.failAction( instring, tokensStart, self, err ) raise else: if callPreParse and self.callPreparse: preloc = self.preParse( instring, loc ) else: preloc = loc tokensStart = preloc if self.mayIndexError or loc >= len(instring): try: loc,tokens = self.parseImpl( instring, preloc, doActions ) except IndexError: raise ParseException( instring, len(instring), self.errmsg, self ) else: loc,tokens = self.parseImpl( instring, preloc, doActions ) tokens = self.postParse( instring, loc, tokens ) retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) if self.parseAction and (doActions or self.callDuringTry): if debugging: try: for fn in self.parseAction: tokens = fn( instring, tokensStart, retTokens ) if tokens is not None: retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), modal=self.modalResults ) except ParseBaseException as err: #~ print "Exception raised in user parse action:", err if (self.debugActions[2] ): self.debugActions[2]( instring, tokensStart, self, err ) raise else: for fn in self.parseAction: tokens = fn( instring, tokensStart, retTokens ) if tokens is not None: retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), modal=self.modalResults ) if debugging: #~ print ("Matched",self,"->",retTokens.asList()) if (self.debugActions[1] ): self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) return loc, retTokens def tryParse( self, instring, loc ): try: return self._parse( instring, loc, doActions=False )[0] except ParseFatalException: raise ParseException( instring, loc, self.errmsg, self) # this method gets repeatedly called during backtracking with the same arguments - # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): lookup = (self,instring,loc,callPreParse,doActions) if lookup in ParserElement._exprArgCache: value = ParserElement._exprArgCache[ lookup ] if isinstance(value, Exception): raise value return (value[0],value[1].copy()) else: try: value = self._parseNoCache( instring, loc, doActions, callPreParse ) ParserElement._exprArgCache[ lookup ] = (value[0],value[1].copy()) return value except ParseBaseException as pe: pe.__traceback__ = None ParserElement._exprArgCache[ lookup ] = pe raise _parse = _parseNoCache # argument cache for optimizing repeated calls when backtracking through recursive expressions _exprArgCache = {} def resetCache(): ParserElement._exprArgCache.clear() resetCache = staticmethod(resetCache) _packratEnabled = False def enablePackrat(): """Enables "packrat" parsing, which adds memoizing to the parsing logic. Repeated parse attempts at the same string location (which happens often in many complex grammars) can immediately return a cached value, instead of re-executing parsing/validating code. Memoizing is done of both valid results and parsing exceptions. This speedup may break existing programs that use parse actions that have side-effects. For this reason, packrat parsing is disabled when you first import pyparsing. To activate the packrat feature, your program must call the class method C{ParserElement.enablePackrat()}. If your program uses C{psyco} to "compile as you go", you must call C{enablePackrat} before calling C{psyco.full()}. If you do not do this, Python will crash. For best results, call C{enablePackrat()} immediately after importing pyparsing. """ if not ParserElement._packratEnabled: ParserElement._packratEnabled = True ParserElement._parse = ParserElement._parseCache enablePackrat = staticmethod(enablePackrat) def parseString( self, instring, parseAll=False ): """Execute the parse expression with the given string. This is the main interface to the client code, once the complete expression has been built. If you want the grammar to require that the entire input string be successfully parsed, then set C{parseAll} to True (equivalent to ending the grammar with C{L{StringEnd()}}). Note: C{parseString} implicitly calls C{expandtabs()} on the input string, in order to report proper column numbers in parse actions. If the input string contains tabs and the grammar uses parse actions that use the C{loc} argument to index into the string being parsed, you can ensure you have a consistent view of the input string by: - calling C{parseWithTabs} on your grammar before calling C{parseString} (see L{I{parseWithTabs}}) - define your parse action using the full C{(s,loc,toks)} signature, and reference the input string using the parse action's C{s} argument - explictly expand the tabs in your input string before calling C{parseString} """ ParserElement.resetCache() if not self.streamlined: self.streamline() #~ self.saveAsList = True for e in self.ignoreExprs: e.streamline() if not self.keepTabs: instring = instring.expandtabs() try: loc, tokens = self._parse( instring, 0 ) if parseAll: loc = self.preParse( instring, loc ) se = Empty() + StringEnd() se._parse( instring, loc ) except ParseBaseException as exc: if ParserElement.verbose_stacktrace: raise else: # catch and re-raise exception from here, clears out pyparsing internal stack trace raise exc else: return tokens def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): """Scan the input string for expression matches. Each match will return the matching tokens, start location, and end location. May be called with optional C{maxMatches} argument, to clip scanning after 'n' matches are found. If C{overlap} is specified, then overlapping matches will be reported. Note that the start and end locations are reported relative to the string being parsed. See L{I{parseString}} for more information on parsing strings with embedded tabs.""" if not self.streamlined: self.streamline() for e in self.ignoreExprs: e.streamline() if not self.keepTabs: instring = _ustr(instring).expandtabs() instrlen = len(instring) loc = 0 preparseFn = self.preParse parseFn = self._parse ParserElement.resetCache() matches = 0 try: while loc <= instrlen and matches < maxMatches: try: preloc = preparseFn( instring, loc ) nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) except ParseException: loc = preloc+1 else: if nextLoc > loc: matches += 1 yield tokens, preloc, nextLoc if overlap: nextloc = preparseFn( instring, loc ) if nextloc > loc: loc = nextLoc else: loc += 1 else: loc = nextLoc else: loc = preloc+1 except ParseBaseException as exc: if ParserElement.verbose_stacktrace: raise else: # catch and re-raise exception from here, clears out pyparsing internal stack trace raise exc def transformString( self, instring ): """Extension to C{L{scanString}}, to modify matching text with modified tokens that may be returned from a parse action. To use C{transformString}, define a grammar and attach a parse action to it that modifies the returned token list. Invoking C{transformString()} on a target string will then scan for matches, and replace the matched text patterns according to the logic in the parse action. C{transformString()} returns the resulting transformed string.""" out = [] lastE = 0 # force preservation of s, to minimize unwanted transformation of string, and to # keep string locs straight between transformString and scanString self.keepTabs = True try: for t,s,e in self.scanString( instring ): out.append( instring[lastE:s] ) if t: if isinstance(t,ParseResults): out += t.asList() elif isinstance(t,list): out += t else: out.append(t) lastE = e out.append(instring[lastE:]) out = [o for o in out if o] return "".join(map(_ustr,_flatten(out))) except ParseBaseException as exc: if ParserElement.verbose_stacktrace: raise else: # catch and re-raise exception from here, clears out pyparsing internal stack trace raise exc def searchString( self, instring, maxMatches=_MAX_INT ): """Another extension to C{L{scanString}}, simplifying the access to the tokens found to match the given parse expression. May be called with optional C{maxMatches} argument, to clip searching after 'n' matches are found. """ try: return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) except ParseBaseException as exc: if ParserElement.verbose_stacktrace: raise else: # catch and re-raise exception from here, clears out pyparsing internal stack trace raise exc def __add__(self, other ): """Implementation of + operator - returns C{L{And}}""" if isinstance( other, basestring ): other = ParserElement.literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return And( [ self, other ] ) def __radd__(self, other ): """Implementation of + operator when left operand is not a C{L{ParserElement}}""" if isinstance( other, basestring ): other = ParserElement.literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other + self def __sub__(self, other): """Implementation of - operator, returns C{L{And}} with error stop""" if isinstance( other, basestring ): other = ParserElement.literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return And( [ self, And._ErrorStop(), other ] ) def __rsub__(self, other ): """Implementation of - operator when left operand is not a C{L{ParserElement}}""" if isinstance( other, basestring ): other = ParserElement.literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other - self def __mul__(self,other): """Implementation of * operator, allows use of C{expr * 3} in place of C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples may also include C{None} as in: - C{expr*(n,None)} or C{expr*(n,)} is equivalent to C{expr*n + L{ZeroOrMore}(expr)} (read as "at least n instances of C{expr}") - C{expr*(None,n)} is equivalent to C{expr*(0,n)} (read as "0 to n instances of C{expr}") - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} Note that C{expr*(None,n)} does not raise an exception if more than n exprs exist in the input stream; that is, C{expr*(None,n)} does not enforce a maximum number of expr occurrences. If this behavior is desired, then write C{expr*(None,n) + ~expr} """ if isinstance(other,int): minElements, optElements = other,0 elif isinstance(other,tuple): other = (other + (None, None))[:2] if other[0] is None: other = (0, other[1]) if isinstance(other[0],int) and other[1] is None: if other[0] == 0: return ZeroOrMore(self) if other[0] == 1: return OneOrMore(self) else: return self*other[0] + ZeroOrMore(self) elif isinstance(other[0],int) and isinstance(other[1],int): minElements, optElements = other optElements -= minElements else: raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) else: raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) if minElements < 0: raise ValueError("cannot multiply ParserElement by negative value") if optElements < 0: raise ValueError("second tuple value must be greater or equal to first tuple value") if minElements == optElements == 0: raise ValueError("cannot multiply ParserElement by 0 or (0,0)") if (optElements): def makeOptionalList(n): if n>1: return Optional(self + makeOptionalList(n-1)) else: return Optional(self) if minElements: if minElements == 1: ret = self + makeOptionalList(optElements) else: ret = And([self]*minElements) + makeOptionalList(optElements) else: ret = makeOptionalList(optElements) else: if minElements == 1: ret = self else: ret = And([self]*minElements) return ret def __rmul__(self, other): return self.__mul__(other) def __or__(self, other ): """Implementation of | operator - returns C{L{MatchFirst}}""" if isinstance( other, basestring ): other = ParserElement.literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return MatchFirst( [ self, other ] ) def __ror__(self, other ): """Implementation of | operator when left operand is not a C{L{ParserElement}}""" if isinstance( other, basestring ): other = ParserElement.literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other | self def __xor__(self, other ): """Implementation of ^ operator - returns C{L{Or}}""" if isinstance( other, basestring ): other = ParserElement.literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return Or( [ self, other ] ) def __rxor__(self, other ): """Implementation of ^ operator when left operand is not a C{L{ParserElement}}""" if isinstance( other, basestring ): other = ParserElement.literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other ^ self def __and__(self, other ): """Implementation of & operator - returns C{L{Each}}""" if isinstance( other, basestring ): other = ParserElement.literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return Each( [ self, other ] ) def __rand__(self, other ): """Implementation of & operator when left operand is not a C{L{ParserElement}}""" if isinstance( other, basestring ): other = ParserElement.literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other & self def __invert__( self ): """Implementation of ~ operator - returns C{L{NotAny}}""" return NotAny( self ) def __call__(self, name=None): """Shortcut for C{L{setResultsName}}, with C{listAllMatches=default}:: userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") could be written as:: userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be passed as C{True}. If C{name} is omitted, same as calling C{L{copy}}. """ if name is not None: return self.setResultsName(name) else: return self.copy() def suppress( self ): """Suppresses the output of this C{ParserElement}; useful to keep punctuation from cluttering up returned output. """ return Suppress( self ) def leaveWhitespace( self ): """Disables the skipping of whitespace before matching the characters in the C{ParserElement}'s defined pattern. This is normally only used internally by the pyparsing module, but may be needed in some whitespace-sensitive grammars. """ self.skipWhitespace = False return self def setWhitespaceChars( self, chars ): """Overrides the default whitespace chars """ self.skipWhitespace = True self.whiteChars = chars self.copyDefaultWhiteChars = False return self def parseWithTabs( self ): """Overrides default behavior to expand C{}s to spaces before parsing the input string. Must be called before C{parseString} when the input grammar contains elements that match C{} characters.""" self.keepTabs = True return self def ignore( self, other ): """Define expression to be ignored (e.g., comments) while doing pattern matching; may be called repeatedly, to define multiple comment or other ignorable patterns. """ if isinstance( other, Suppress ): if other not in self.ignoreExprs: self.ignoreExprs.append( other.copy() ) else: self.ignoreExprs.append( Suppress( other.copy() ) ) return self def setDebugActions( self, startAction, successAction, exceptionAction ): """Enable display of debugging messages while doing pattern matching.""" self.debugActions = (startAction or _defaultStartDebugAction, successAction or _defaultSuccessDebugAction, exceptionAction or _defaultExceptionDebugAction) self.debug = True return self def setDebug( self, flag=True ): """Enable display of debugging messages while doing pattern matching. Set C{flag} to True to enable, False to disable.""" if flag: self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) else: self.debug = False return self def __str__( self ): return self.name def __repr__( self ): return _ustr(self) def streamline( self ): self.streamlined = True self.strRepr = None return self def checkRecursion( self, parseElementList ): pass def validate( self, validateTrace=[] ): """Check defined expressions for valid structure, check for infinite recursive definitions.""" self.checkRecursion( [] ) def parseFile( self, file_or_filename, parseAll=False ): """Execute the parse expression on the given file or filename. If a filename is specified (instead of a file object), the entire file is opened, read, and closed before parsing. """ try: file_contents = file_or_filename.read() except AttributeError: f = open(file_or_filename, "r") file_contents = f.read() f.close() try: return self.parseString(file_contents, parseAll) except ParseBaseException as exc: if ParserElement.verbose_stacktrace: raise else: # catch and re-raise exception from here, clears out pyparsing internal stack trace raise exc def __eq__(self,other): if isinstance(other, ParserElement): return self is other or self.__dict__ == other.__dict__ elif isinstance(other, basestring): try: self.parseString(_ustr(other), parseAll=True) return True except ParseBaseException: return False else: return super(ParserElement,self)==other def __ne__(self,other): return not (self == other) def __hash__(self): return hash(id(self)) def __req__(self,other): return self == other def __rne__(self,other): return not (self == other) class Token(ParserElement): """Abstract C{ParserElement} subclass, for defining atomic matching patterns.""" def __init__( self ): super(Token,self).__init__( savelist=False ) def setName(self, name): s = super(Token,self).setName(name) self.errmsg = "Expected " + self.name return s class Empty(Token): """An empty token, will always match.""" def __init__( self ): super(Empty,self).__init__() self.name = "Empty" self.mayReturnEmpty = True self.mayIndexError = False class NoMatch(Token): """A token that will never match.""" def __init__( self ): super(NoMatch,self).__init__() self.name = "NoMatch" self.mayReturnEmpty = True self.mayIndexError = False self.errmsg = "Unmatchable token" def parseImpl( self, instring, loc, doActions=True ): raise ParseException(instring, loc, self.errmsg, self) class Literal(Token): """Token to exactly match a specified string.""" def __init__( self, matchString ): super(Literal,self).__init__() self.match = matchString self.matchLen = len(matchString) try: self.firstMatchChar = matchString[0] except IndexError: warnings.warn("null string passed to Literal; use Empty() instead", SyntaxWarning, stacklevel=2) self.__class__ = Empty self.name = '"%s"' % _ustr(self.match) self.errmsg = "Expected " + self.name self.mayReturnEmpty = False self.mayIndexError = False # Performance tuning: this routine gets called a *lot* # if this is a single character match string and the first character matches, # short-circuit as quickly as possible, and avoid calling startswith #~ @profile def parseImpl( self, instring, loc, doActions=True ): if (instring[loc] == self.firstMatchChar and (self.matchLen==1 or instring.startswith(self.match,loc)) ): return loc+self.matchLen, self.match raise ParseException(instring, loc, self.errmsg, self) _L = Literal ParserElement.literalStringClass = Literal class Keyword(Token): """Token to exactly match a specified string as a keyword, that is, it must be immediately followed by a non-keyword character. Compare with C{L{Literal}}:: Literal("if") will match the leading C{'if'} in C{'ifAndOnlyIf'}. Keyword("if") will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} Accepts two optional constructor arguments in addition to the keyword string: C{identChars} is a string of characters that would be valid identifier characters, defaulting to all alphanumerics + "_" and "$"; C{caseless} allows case-insensitive matching, default is C{False}. """ DEFAULT_KEYWORD_CHARS = alphanums+"_$" def __init__( self, matchString, identChars=DEFAULT_KEYWORD_CHARS, caseless=False ): super(Keyword,self).__init__() self.match = matchString self.matchLen = len(matchString) try: self.firstMatchChar = matchString[0] except IndexError: warnings.warn("null string passed to Keyword; use Empty() instead", SyntaxWarning, stacklevel=2) self.name = '"%s"' % self.match self.errmsg = "Expected " + self.name self.mayReturnEmpty = False self.mayIndexError = False self.caseless = caseless if caseless: self.caselessmatch = matchString.upper() identChars = identChars.upper() self.identChars = set(identChars) def parseImpl( self, instring, loc, doActions=True ): if self.caseless: if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and (loc == 0 or instring[loc-1].upper() not in self.identChars) ): return loc+self.matchLen, self.match else: if (instring[loc] == self.firstMatchChar and (self.matchLen==1 or instring.startswith(self.match,loc)) and (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and (loc == 0 or instring[loc-1] not in self.identChars) ): return loc+self.matchLen, self.match raise ParseException(instring, loc, self.errmsg, self) def copy(self): c = super(Keyword,self).copy() c.identChars = Keyword.DEFAULT_KEYWORD_CHARS return c def setDefaultKeywordChars( chars ): """Overrides the default Keyword chars """ Keyword.DEFAULT_KEYWORD_CHARS = chars setDefaultKeywordChars = staticmethod(setDefaultKeywordChars) class CaselessLiteral(Literal): """Token to match a specified string, ignoring case of letters. Note: the matched results will always be in the case of the given match string, NOT the case of the input text. """ def __init__( self, matchString ): super(CaselessLiteral,self).__init__( matchString.upper() ) # Preserve the defining literal. self.returnString = matchString self.name = "'%s'" % self.returnString self.errmsg = "Expected " + self.name def parseImpl( self, instring, loc, doActions=True ): if instring[ loc:loc+self.matchLen ].upper() == self.match: return loc+self.matchLen, self.returnString raise ParseException(instring, loc, self.errmsg, self) class CaselessKeyword(Keyword): def __init__( self, matchString, identChars=Keyword.DEFAULT_KEYWORD_CHARS ): super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) def parseImpl( self, instring, loc, doActions=True ): if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): return loc+self.matchLen, self.match raise ParseException(instring, loc, self.errmsg, self) class Word(Token): """Token for matching words composed of allowed character sets. Defined with string containing all allowed initial characters, an optional string containing allowed body characters (if omitted, defaults to the initial character set), and an optional minimum, maximum, and/or exact length. The default value for C{min} is 1 (a minimum value < 1 is not valid); the default values for C{max} and C{exact} are 0, meaning no maximum or exact length restriction. An optional C{exclude} parameter can list characters that might be found in the input C{bodyChars} string; useful to define a word of all printables except for one or two characters, for instance. """ def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): super(Word,self).__init__() if excludeChars: initChars = ''.join(c for c in initChars if c not in excludeChars) if bodyChars: bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) self.initCharsOrig = initChars self.initChars = set(initChars) if bodyChars : self.bodyCharsOrig = bodyChars self.bodyChars = set(bodyChars) else: self.bodyCharsOrig = initChars self.bodyChars = set(initChars) self.maxSpecified = max > 0 if min < 1: raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") self.minLen = min if max > 0: self.maxLen = max else: self.maxLen = _MAX_INT if exact > 0: self.maxLen = exact self.minLen = exact self.name = _ustr(self) self.errmsg = "Expected " + self.name self.mayIndexError = False self.asKeyword = asKeyword if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): if self.bodyCharsOrig == self.initCharsOrig: self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) elif len(self.bodyCharsOrig) == 1: self.reString = "%s[%s]*" % \ (re.escape(self.initCharsOrig), _escapeRegexRangeChars(self.bodyCharsOrig),) else: self.reString = "[%s][%s]*" % \ (_escapeRegexRangeChars(self.initCharsOrig), _escapeRegexRangeChars(self.bodyCharsOrig),) if self.asKeyword: self.reString = r"\b"+self.reString+r"\b" try: self.re = re.compile( self.reString ) except: self.re = None def parseImpl( self, instring, loc, doActions=True ): if self.re: result = self.re.match(instring,loc) if not result: raise ParseException(instring, loc, self.errmsg, self) loc = result.end() return loc, result.group() if not(instring[ loc ] in self.initChars): raise ParseException(instring, loc, self.errmsg, self) start = loc loc += 1 instrlen = len(instring) bodychars = self.bodyChars maxloc = start + self.maxLen maxloc = min( maxloc, instrlen ) while loc < maxloc and instring[loc] in bodychars: loc += 1 throwException = False if loc - start < self.minLen: throwException = True if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: throwException = True if self.asKeyword: if (start>0 and instring[start-1] in bodychars) or (loc4: return s[:4]+"..." else: return s if ( self.initCharsOrig != self.bodyCharsOrig ): self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) else: self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) return self.strRepr class Regex(Token): """Token for matching strings that match a given regular expression. Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. """ compiledREtype = type(re.compile("[A-Z]")) def __init__( self, pattern, flags=0): """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" super(Regex,self).__init__() if isinstance(pattern, basestring): if len(pattern) == 0: warnings.warn("null string passed to Regex; use Empty() instead", SyntaxWarning, stacklevel=2) self.pattern = pattern self.flags = flags try: self.re = re.compile(self.pattern, self.flags) self.reString = self.pattern except sre_constants.error: warnings.warn("invalid pattern (%s) passed to Regex" % pattern, SyntaxWarning, stacklevel=2) raise elif isinstance(pattern, Regex.compiledREtype): self.re = pattern self.pattern = \ self.reString = str(pattern) self.flags = flags else: raise ValueError("Regex may only be constructed with a string or a compiled RE object") self.name = _ustr(self) self.errmsg = "Expected " + self.name self.mayIndexError = False self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): result = self.re.match(instring,loc) if not result: raise ParseException(instring, loc, self.errmsg, self) loc = result.end() d = result.groupdict() ret = ParseResults(result.group()) if d: for k in d: ret[k] = d[k] return loc,ret def __str__( self ): try: return super(Regex,self).__str__() except: pass if self.strRepr is None: self.strRepr = "Re:(%s)" % repr(self.pattern) return self.strRepr class QuotedString(Token): """Token for matching strings that are delimited by quoting characters. """ def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None): """ Defined with the following parameters: - quoteChar - string of one or more characters defining the quote delimiting string - escChar - character to escape quotes, typically backslash (default=None) - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=None) - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) """ super(QuotedString,self).__init__() # remove white space from quote chars - wont work anyway quoteChar = quoteChar.strip() if len(quoteChar) == 0: warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) raise SyntaxError() if endQuoteChar is None: endQuoteChar = quoteChar else: endQuoteChar = endQuoteChar.strip() if len(endQuoteChar) == 0: warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) raise SyntaxError() self.quoteChar = quoteChar self.quoteCharLen = len(quoteChar) self.firstQuoteChar = quoteChar[0] self.endQuoteChar = endQuoteChar self.endQuoteCharLen = len(endQuoteChar) self.escChar = escChar self.escQuote = escQuote self.unquoteResults = unquoteResults if multiline: self.flags = re.MULTILINE | re.DOTALL self.pattern = r'%s(?:[^%s%s]' % \ ( re.escape(self.quoteChar), _escapeRegexRangeChars(self.endQuoteChar[0]), (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) else: self.flags = 0 self.pattern = r'%s(?:[^%s\n\r%s]' % \ ( re.escape(self.quoteChar), _escapeRegexRangeChars(self.endQuoteChar[0]), (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) if len(self.endQuoteChar) > 1: self.pattern += ( '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), _escapeRegexRangeChars(self.endQuoteChar[i])) for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' ) if escQuote: self.pattern += (r'|(?:%s)' % re.escape(escQuote)) if escChar: self.pattern += (r'|(?:%s.)' % re.escape(escChar)) self.escCharReplacePattern = re.escape(self.escChar)+"(.)" self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) try: self.re = re.compile(self.pattern, self.flags) self.reString = self.pattern except sre_constants.error: warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, SyntaxWarning, stacklevel=2) raise self.name = _ustr(self) self.errmsg = "Expected " + self.name self.mayIndexError = False self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None if not result: raise ParseException(instring, loc, self.errmsg, self) loc = result.end() ret = result.group() if self.unquoteResults: # strip off quotes ret = ret[self.quoteCharLen:-self.endQuoteCharLen] if isinstance(ret,basestring): # replace escaped characters if self.escChar: ret = re.sub(self.escCharReplacePattern,"\g<1>",ret) # replace escaped quotes if self.escQuote: ret = ret.replace(self.escQuote, self.endQuoteChar) return loc, ret def __str__( self ): try: return super(QuotedString,self).__str__() except: pass if self.strRepr is None: self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) return self.strRepr class CharsNotIn(Token): """Token for matching words composed of characters *not* in a given set. Defined with string containing all disallowed characters, and an optional minimum, maximum, and/or exact length. The default value for C{min} is 1 (a minimum value < 1 is not valid); the default values for C{max} and C{exact} are 0, meaning no maximum or exact length restriction. """ def __init__( self, notChars, min=1, max=0, exact=0 ): super(CharsNotIn,self).__init__() self.skipWhitespace = False self.notChars = notChars if min < 1: raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") self.minLen = min if max > 0: self.maxLen = max else: self.maxLen = _MAX_INT if exact > 0: self.maxLen = exact self.minLen = exact self.name = _ustr(self) self.errmsg = "Expected " + self.name self.mayReturnEmpty = ( self.minLen == 0 ) self.mayIndexError = False def parseImpl( self, instring, loc, doActions=True ): if instring[loc] in self.notChars: raise ParseException(instring, loc, self.errmsg, self) start = loc loc += 1 notchars = self.notChars maxlen = min( start+self.maxLen, len(instring) ) while loc < maxlen and \ (instring[loc] not in notchars): loc += 1 if loc - start < self.minLen: raise ParseException(instring, loc, self.errmsg, self) return loc, instring[start:loc] def __str__( self ): try: return super(CharsNotIn, self).__str__() except: pass if self.strRepr is None: if len(self.notChars) > 4: self.strRepr = "!W:(%s...)" % self.notChars[:4] else: self.strRepr = "!W:(%s)" % self.notChars return self.strRepr class White(Token): """Special matching class for matching whitespace. Normally, whitespace is ignored by pyparsing grammars. This class is included when some whitespace structures are significant. Define with a string containing the whitespace characters to be matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, as defined for the C{L{Word}} class.""" whiteStrs = { " " : "", "\t": "", "\n": "", "\r": "", "\f": "", } def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): super(White,self).__init__() self.matchWhite = ws self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) #~ self.leaveWhitespace() self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) self.mayReturnEmpty = True self.errmsg = "Expected " + self.name self.minLen = min if max > 0: self.maxLen = max else: self.maxLen = _MAX_INT if exact > 0: self.maxLen = exact self.minLen = exact def parseImpl( self, instring, loc, doActions=True ): if not(instring[ loc ] in self.matchWhite): raise ParseException(instring, loc, self.errmsg, self) start = loc loc += 1 maxloc = start + self.maxLen maxloc = min( maxloc, len(instring) ) while loc < maxloc and instring[loc] in self.matchWhite: loc += 1 if loc - start < self.minLen: raise ParseException(instring, loc, self.errmsg, self) return loc, instring[start:loc] class _PositionToken(Token): def __init__( self ): super(_PositionToken,self).__init__() self.name=self.__class__.__name__ self.mayReturnEmpty = True self.mayIndexError = False class GoToColumn(_PositionToken): """Token to advance to a specific column of input text; useful for tabular report scraping.""" def __init__( self, colno ): super(GoToColumn,self).__init__() self.col = colno def preParse( self, instring, loc ): if col(loc,instring) != self.col: instrlen = len(instring) if self.ignoreExprs: loc = self._skipIgnorables( instring, loc ) while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : loc += 1 return loc def parseImpl( self, instring, loc, doActions=True ): thiscol = col( loc, instring ) if thiscol > self.col: raise ParseException( instring, loc, "Text not in expected column", self ) newloc = loc + self.col - thiscol ret = instring[ loc: newloc ] return newloc, ret class LineStart(_PositionToken): """Matches if current position is at the beginning of a line within the parse string""" def __init__( self ): super(LineStart,self).__init__() self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) self.errmsg = "Expected start of line" def preParse( self, instring, loc ): preloc = super(LineStart,self).preParse(instring,loc) if instring[preloc] == "\n": loc += 1 return loc def parseImpl( self, instring, loc, doActions=True ): if not( loc==0 or (loc == self.preParse( instring, 0 )) or (instring[loc-1] == "\n") ): #col(loc, instring) != 1: raise ParseException(instring, loc, self.errmsg, self) return loc, [] class LineEnd(_PositionToken): """Matches if current position is at the end of a line within the parse string""" def __init__( self ): super(LineEnd,self).__init__() self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) self.errmsg = "Expected end of line" def parseImpl( self, instring, loc, doActions=True ): if loc len(instring): return loc, [] else: raise ParseException(instring, loc, self.errmsg, self) class WordStart(_PositionToken): """Matches if the current position is at the beginning of a Word, and is not preceded by any character in a given set of C{wordChars} (default=C{printables}). To emulate the C{\b} behavior of regular expressions, use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of the string being parsed, or at the beginning of a line. """ def __init__(self, wordChars = printables): super(WordStart,self).__init__() self.wordChars = set(wordChars) self.errmsg = "Not at the start of a word" def parseImpl(self, instring, loc, doActions=True ): if loc != 0: if (instring[loc-1] in self.wordChars or instring[loc] not in self.wordChars): raise ParseException(instring, loc, self.errmsg, self) return loc, [] class WordEnd(_PositionToken): """Matches if the current position is at the end of a Word, and is not followed by any character in a given set of C{wordChars} (default=C{printables}). To emulate the C{\b} behavior of regular expressions, use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of the string being parsed, or at the end of a line. """ def __init__(self, wordChars = printables): super(WordEnd,self).__init__() self.wordChars = set(wordChars) self.skipWhitespace = False self.errmsg = "Not at the end of a word" def parseImpl(self, instring, loc, doActions=True ): instrlen = len(instring) if instrlen>0 and loc maxExcLoc: maxException = err maxExcLoc = err.loc except IndexError: if len(instring) > maxExcLoc: maxException = ParseException(instring,len(instring),e.errmsg,self) maxExcLoc = len(instring) else: if loc2 > maxMatchLoc: maxMatchLoc = loc2 maxMatchExp = e if maxMatchLoc < 0: if maxException is not None: raise maxException else: raise ParseException(instring, loc, "no defined alternatives to match", self) return maxMatchExp._parse( instring, loc, doActions ) def __ixor__(self, other ): if isinstance( other, basestring ): other = ParserElement.literalStringClass( other ) return self.append( other ) #Or( [ self, other ] ) def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" return self.strRepr def checkRecursion( self, parseElementList ): subRecCheckList = parseElementList[:] + [ self ] for e in self.exprs: e.checkRecursion( subRecCheckList ) class MatchFirst(ParseExpression): """Requires that at least one C{ParseExpression} is found. If two expressions match, the first one listed is the one that will match. May be constructed using the C{'|'} operator. """ def __init__( self, exprs, savelist = False ): super(MatchFirst,self).__init__(exprs, savelist) if self.exprs: self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) else: self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): maxExcLoc = -1 maxException = None for e in self.exprs: try: ret = e._parse( instring, loc, doActions ) return ret except ParseException as err: if err.loc > maxExcLoc: maxException = err maxExcLoc = err.loc except IndexError: if len(instring) > maxExcLoc: maxException = ParseException(instring,len(instring),e.errmsg,self) maxExcLoc = len(instring) # only got here if no expression matched, raise exception for match that made it the furthest else: if maxException is not None: raise maxException else: raise ParseException(instring, loc, "no defined alternatives to match", self) def __ior__(self, other ): if isinstance( other, basestring ): other = ParserElement.literalStringClass( other ) return self.append( other ) #MatchFirst( [ self, other ] ) def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" return self.strRepr def checkRecursion( self, parseElementList ): subRecCheckList = parseElementList[:] + [ self ] for e in self.exprs: e.checkRecursion( subRecCheckList ) class Each(ParseExpression): """Requires all given C{ParseExpression}s to be found, but in any order. Expressions may be separated by whitespace. May be constructed using the C{'&'} operator. """ def __init__( self, exprs, savelist = True ): super(Each,self).__init__(exprs, savelist) self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) self.skipWhitespace = True self.initExprGroups = True def parseImpl( self, instring, loc, doActions=True ): if self.initExprGroups: opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] opt2 = [ e for e in self.exprs if e.mayReturnEmpty and e not in opt1 ] self.optionals = opt1 + opt2 self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] self.required += self.multirequired self.initExprGroups = False tmpLoc = loc tmpReqd = self.required[:] tmpOpt = self.optionals[:] matchOrder = [] keepMatching = True while keepMatching: tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired failed = [] for e in tmpExprs: try: tmpLoc = e.tryParse( instring, tmpLoc ) except ParseException: failed.append(e) else: matchOrder.append(e) if e in tmpReqd: tmpReqd.remove(e) elif e in tmpOpt: tmpOpt.remove(e) if len(failed) == len(tmpExprs): keepMatching = False if tmpReqd: missing = ", ".join(_ustr(e) for e in tmpReqd) raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) # add any unmatched Optionals, in case they have default values defined matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] resultlist = [] for e in matchOrder: loc,results = e._parse(instring,loc,doActions) resultlist.append(results) finalResults = ParseResults([]) for r in resultlist: dups = {} for k in r.keys(): if k in finalResults: tmp = ParseResults(finalResults[k]) tmp += ParseResults(r[k]) dups[k] = tmp finalResults += ParseResults(r) for k,v in dups.items(): finalResults[k] = v return loc, finalResults def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" return self.strRepr def checkRecursion( self, parseElementList ): subRecCheckList = parseElementList[:] + [ self ] for e in self.exprs: e.checkRecursion( subRecCheckList ) class ParseElementEnhance(ParserElement): """Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens.""" def __init__( self, expr, savelist=False ): super(ParseElementEnhance,self).__init__(savelist) if isinstance( expr, basestring ): expr = Literal(expr) self.expr = expr self.strRepr = None if expr is not None: self.mayIndexError = expr.mayIndexError self.mayReturnEmpty = expr.mayReturnEmpty self.setWhitespaceChars( expr.whiteChars ) self.skipWhitespace = expr.skipWhitespace self.saveAsList = expr.saveAsList self.callPreparse = expr.callPreparse self.ignoreExprs.extend(expr.ignoreExprs) def parseImpl( self, instring, loc, doActions=True ): if self.expr is not None: return self.expr._parse( instring, loc, doActions, callPreParse=False ) else: raise ParseException("",loc,self.errmsg,self) def leaveWhitespace( self ): self.skipWhitespace = False self.expr = self.expr.copy() if self.expr is not None: self.expr.leaveWhitespace() return self def ignore( self, other ): if isinstance( other, Suppress ): if other not in self.ignoreExprs: super( ParseElementEnhance, self).ignore( other ) if self.expr is not None: self.expr.ignore( self.ignoreExprs[-1] ) else: super( ParseElementEnhance, self).ignore( other ) if self.expr is not None: self.expr.ignore( self.ignoreExprs[-1] ) return self def streamline( self ): super(ParseElementEnhance,self).streamline() if self.expr is not None: self.expr.streamline() return self def checkRecursion( self, parseElementList ): if self in parseElementList: raise RecursiveGrammarException( parseElementList+[self] ) subRecCheckList = parseElementList[:] + [ self ] if self.expr is not None: self.expr.checkRecursion( subRecCheckList ) def validate( self, validateTrace=[] ): tmp = validateTrace[:]+[self] if self.expr is not None: self.expr.validate(tmp) self.checkRecursion( [] ) def __str__( self ): try: return super(ParseElementEnhance,self).__str__() except: pass if self.strRepr is None and self.expr is not None: self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) return self.strRepr class FollowedBy(ParseElementEnhance): """Lookahead matching of the given parse expression. C{FollowedBy} does *not* advance the parsing position within the input string, it only verifies that the specified parse expression matches at the current position. C{FollowedBy} always returns a null token list.""" def __init__( self, expr ): super(FollowedBy,self).__init__(expr) self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): self.expr.tryParse( instring, loc ) return loc, [] class NotAny(ParseElementEnhance): """Lookahead to disallow matching with the given parse expression. C{NotAny} does *not* advance the parsing position within the input string, it only verifies that the specified parse expression does *not* match at the current position. Also, C{NotAny} does *not* skip over leading whitespace. C{NotAny} always returns a null token list. May be constructed using the '~' operator.""" def __init__( self, expr ): super(NotAny,self).__init__(expr) #~ self.leaveWhitespace() self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs self.mayReturnEmpty = True self.errmsg = "Found unwanted token, "+_ustr(self.expr) def parseImpl( self, instring, loc, doActions=True ): try: self.expr.tryParse( instring, loc ) except (ParseException,IndexError): pass else: raise ParseException(instring, loc, self.errmsg, self) return loc, [] def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "~{" + _ustr(self.expr) + "}" return self.strRepr class ZeroOrMore(ParseElementEnhance): """Optional repetition of zero or more of the given expression.""" def __init__( self, expr ): super(ZeroOrMore,self).__init__(expr) self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): tokens = [] try: loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) hasIgnoreExprs = ( len(self.ignoreExprs) > 0 ) while 1: if hasIgnoreExprs: preloc = self._skipIgnorables( instring, loc ) else: preloc = loc loc, tmptokens = self.expr._parse( instring, preloc, doActions ) if tmptokens or tmptokens.haskeys(): tokens += tmptokens except (ParseException,IndexError): pass return loc, tokens def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "[" + _ustr(self.expr) + "]..." return self.strRepr def setResultsName( self, name, listAllMatches=False ): ret = super(ZeroOrMore,self).setResultsName(name,listAllMatches) ret.saveAsList = True return ret class OneOrMore(ParseElementEnhance): """Repetition of one or more of the given expression.""" def parseImpl( self, instring, loc, doActions=True ): # must be at least one loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) try: hasIgnoreExprs = ( len(self.ignoreExprs) > 0 ) while 1: if hasIgnoreExprs: preloc = self._skipIgnorables( instring, loc ) else: preloc = loc loc, tmptokens = self.expr._parse( instring, preloc, doActions ) if tmptokens or tmptokens.haskeys(): tokens += tmptokens except (ParseException,IndexError): pass return loc, tokens def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "{" + _ustr(self.expr) + "}..." return self.strRepr def setResultsName( self, name, listAllMatches=False ): ret = super(OneOrMore,self).setResultsName(name,listAllMatches) ret.saveAsList = True return ret class _NullToken(object): def __bool__(self): return False __nonzero__ = __bool__ def __str__(self): return "" _optionalNotMatched = _NullToken() class Optional(ParseElementEnhance): """Optional matching of the given expression. A default return string can also be specified, if the optional expression is not found. """ def __init__( self, expr, default=_optionalNotMatched ): super(Optional,self).__init__( expr, savelist=False ) self.defaultValue = default self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): try: loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) except (ParseException,IndexError): if self.defaultValue is not _optionalNotMatched: if self.expr.resultsName: tokens = ParseResults([ self.defaultValue ]) tokens[self.expr.resultsName] = self.defaultValue else: tokens = [ self.defaultValue ] else: tokens = [] return loc, tokens def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "[" + _ustr(self.expr) + "]" return self.strRepr class SkipTo(ParseElementEnhance): """Token for skipping over all undefined text until the matched expression is found. If C{include} is set to true, the matched expression is also parsed (the skipped text and matched expression are returned as a 2-element list). The C{ignore} argument is used to define grammars (typically quoted strings and comments) that might contain false matches. """ def __init__( self, other, include=False, ignore=None, failOn=None ): super( SkipTo, self ).__init__( other ) self.ignoreExpr = ignore self.mayReturnEmpty = True self.mayIndexError = False self.includeMatch = include self.asList = False if failOn is not None and isinstance(failOn, basestring): self.failOn = Literal(failOn) else: self.failOn = failOn self.errmsg = "No match found for "+_ustr(self.expr) def parseImpl( self, instring, loc, doActions=True ): startLoc = loc instrlen = len(instring) expr = self.expr failParse = False while loc <= instrlen: try: if self.failOn: try: self.failOn.tryParse(instring, loc) except ParseBaseException: pass else: failParse = True raise ParseException(instring, loc, "Found expression " + str(self.failOn)) failParse = False if self.ignoreExpr is not None: while 1: try: loc = self.ignoreExpr.tryParse(instring,loc) # print("found ignoreExpr, advance to", loc) except ParseBaseException: break expr._parse( instring, loc, doActions=False, callPreParse=False ) skipText = instring[startLoc:loc] if self.includeMatch: loc,mat = expr._parse(instring,loc,doActions,callPreParse=False) if mat: skipRes = ParseResults( skipText ) skipRes += mat return loc, [ skipRes ] else: return loc, [ skipText ] else: return loc, [ skipText ] except (ParseException,IndexError): if failParse: raise else: loc += 1 raise ParseException(instring, loc, self.errmsg, self) class Forward(ParseElementEnhance): """Forward declaration of an expression to be defined later - used for recursive grammars, such as algebraic infix notation. When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. Note: take care when assigning to C{Forward} not to overlook precedence of operators. Specifically, '|' has a lower precedence than '<<', so that:: fwdExpr << a | b | c will actually be evaluated as:: (fwdExpr << a) | b | c thereby leaving b and c out as parseable alternatives. It is recommended that you explicitly group the values inserted into the C{Forward}:: fwdExpr << (a | b | c) Converting to use the '<<=' operator instead will avoid this problem. """ def __init__( self, other=None ): super(Forward,self).__init__( other, savelist=False ) def __lshift__( self, other ): if isinstance( other, basestring ): other = ParserElement.literalStringClass(other) self.expr = other self.mayReturnEmpty = other.mayReturnEmpty self.strRepr = None self.mayIndexError = self.expr.mayIndexError self.mayReturnEmpty = self.expr.mayReturnEmpty self.setWhitespaceChars( self.expr.whiteChars ) self.skipWhitespace = self.expr.skipWhitespace self.saveAsList = self.expr.saveAsList self.ignoreExprs.extend(self.expr.ignoreExprs) return self def __ilshift__(self, other): return self << other def leaveWhitespace( self ): self.skipWhitespace = False return self def streamline( self ): if not self.streamlined: self.streamlined = True if self.expr is not None: self.expr.streamline() return self def validate( self, validateTrace=[] ): if self not in validateTrace: tmp = validateTrace[:]+[self] if self.expr is not None: self.expr.validate(tmp) self.checkRecursion([]) def __str__( self ): if hasattr(self,"name"): return self.name self._revertClass = self.__class__ self.__class__ = _ForwardNoRecurse try: if self.expr is not None: retString = _ustr(self.expr) else: retString = "None" finally: self.__class__ = self._revertClass return self.__class__.__name__ + ": " + retString def copy(self): if self.expr is not None: return super(Forward,self).copy() else: ret = Forward() ret <<= self return ret class _ForwardNoRecurse(Forward): def __str__( self ): return "..." class TokenConverter(ParseElementEnhance): """Abstract subclass of C{ParseExpression}, for converting parsed results.""" def __init__( self, expr, savelist=False ): super(TokenConverter,self).__init__( expr )#, savelist ) self.saveAsList = False class Upcase(TokenConverter): """Converter to upper case all matching tokens.""" def __init__(self, *args): super(Upcase,self).__init__(*args) warnings.warn("Upcase class is deprecated, use upcaseTokens parse action instead", DeprecationWarning,stacklevel=2) def postParse( self, instring, loc, tokenlist ): return list(map( str.upper, tokenlist )) class Combine(TokenConverter): """Converter to concatenate all matching tokens to a single string. By default, the matching patterns must also be contiguous in the input string; this can be disabled by specifying C{'adjacent=False'} in the constructor. """ def __init__( self, expr, joinString="", adjacent=True ): super(Combine,self).__init__( expr ) # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself if adjacent: self.leaveWhitespace() self.adjacent = adjacent self.skipWhitespace = True self.joinString = joinString self.callPreparse = True def ignore( self, other ): if self.adjacent: ParserElement.ignore(self, other) else: super( Combine, self).ignore( other ) return self def postParse( self, instring, loc, tokenlist ): retToks = tokenlist.copy() del retToks[:] retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) if self.resultsName and retToks.haskeys(): return [ retToks ] else: return retToks class Group(TokenConverter): """Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions.""" def __init__( self, expr ): super(Group,self).__init__( expr ) self.saveAsList = True def postParse( self, instring, loc, tokenlist ): return [ tokenlist ] class Dict(TokenConverter): """Converter to return a repetitive expression as a list, but also as a dictionary. Each element can also be referenced using the first token in the expression as its key. Useful for tabular report scraping when the first column can be used as a item key. """ def __init__( self, expr ): super(Dict,self).__init__( expr ) self.saveAsList = True def postParse( self, instring, loc, tokenlist ): for i,tok in enumerate(tokenlist): if len(tok) == 0: continue ikey = tok[0] if isinstance(ikey,int): ikey = _ustr(tok[0]).strip() if len(tok)==1: tokenlist[ikey] = _ParseResultsWithOffset("",i) elif len(tok)==2 and not isinstance(tok[1],ParseResults): tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) else: dictvalue = tok.copy() #ParseResults(i) del dictvalue[0] if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) else: tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) if self.resultsName: return [ tokenlist ] else: return tokenlist class Suppress(TokenConverter): """Converter for ignoring the results of a parsed expression.""" def postParse( self, instring, loc, tokenlist ): return [] def suppress( self ): return self class OnlyOnce(object): """Wrapper for parse actions, to ensure they are only called once.""" def __init__(self, methodCall): self.callable = _trim_arity(methodCall) self.called = False def __call__(self,s,l,t): if not self.called: results = self.callable(s,l,t) self.called = True return results raise ParseException(s,l,"") def reset(self): self.called = False def traceParseAction(f): """Decorator for debugging parse actions.""" f = _trim_arity(f) def z(*paArgs): thisFunc = f.func_name s,l,t = paArgs[-3:] if len(paArgs)>3: thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc sys.stderr.write( ">>entering %s(line: '%s', %d, %s)\n" % (thisFunc,line(l,s),l,t) ) try: ret = f(*paArgs) except Exception as exc: sys.stderr.write( "<", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) try: if len(symbols)==len("".join(symbols)): return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ) else: return Regex( "|".join(re.escape(sym) for sym in symbols) ) except: warnings.warn("Exception creating Regex for oneOf, building MatchFirst", SyntaxWarning, stacklevel=2) # last resort, just use MatchFirst return MatchFirst( [ parseElementClass(sym) for sym in symbols ] ) def dictOf( key, value ): """Helper to easily and clearly define a dictionary by specifying the respective patterns for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens in the proper order. The key pattern can include delimiting markers or punctuation, as long as they are suppressed, thereby leaving the significant key text. The value pattern can include named results, so that the C{Dict} results can include named token fields. """ return Dict( ZeroOrMore( Group ( key + value ) ) ) def originalTextFor(expr, asString=True): """Helper to return the original, untokenized text for a given expression. Useful to restore the parsed fields of an HTML start tag into the raw tag text itself, or to revert separate tokens with intervening whitespace back to the original matching input text. Simpler to use than the parse action C{L{keepOriginalText}}, and does not require the inspect module to chase up the call stack. By default, returns a string containing the original parsed text. If the optional C{asString} argument is passed as C{False}, then the return value is a C{L{ParseResults}} containing any results names that were originally matched, and a single token containing the original matched text from the input string. So if the expression passed to C{L{originalTextFor}} contains expressions with defined results names, you must set C{asString} to C{False} if you want to preserve those results name values.""" locMarker = Empty().setParseAction(lambda s,loc,t: loc) endlocMarker = locMarker.copy() endlocMarker.callPreparse = False matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") if asString: extractText = lambda s,l,t: s[t._original_start:t._original_end] else: def extractText(s,l,t): del t[:] t.insert(0, s[t._original_start:t._original_end]) del t["_original_start"] del t["_original_end"] matchExpr.setParseAction(extractText) return matchExpr def ungroup(expr): """Helper to undo pyparsing's default grouping of And expressions, even if all but one are non-empty.""" return TokenConverter(expr).setParseAction(lambda t:t[0]) def locatedExpr(expr): """Helper to decorate a returned token with its starting and ending locations in the input string. This helper adds the following results names: - locn_start = location where matched expression begins - locn_end = location where matched expression ends - value = the actual parsed results Be careful if the input text contains C{} characters, you may want to call C{L{ParserElement.parseWithTabs}} """ locator = Empty().setParseAction(lambda s,l,t: l) return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) # convenience constants for positional expressions empty = Empty().setName("empty") lineStart = LineStart().setName("lineStart") lineEnd = LineEnd().setName("lineEnd") stringStart = StringStart().setName("stringStart") stringEnd = StringEnd().setName("stringEnd") _escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) _escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) _escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) _singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | Word(printables, excludeChars=r'\]', exact=1) _charRange = Group(_singleChar + Suppress("-") + _singleChar) _reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" def srange(s): r"""Helper to easily define string ranges for use in Word construction. Borrows syntax from regexp '[]' string range definitions:: srange("[0-9]") -> "0123456789" srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" The input string must be enclosed in []'s, and the returned string is the expanded character set joined into a single string. The values enclosed in the []'s may be:: a single character an escaped character with a leading backslash (such as \- or \]) an escaped hex character with a leading '\x' (\x21, which is a '!' character) (\0x## is also supported for backwards compatibility) an escaped octal character with a leading '\0' (\041, which is a '!' character) a range of any of the above, separated by a dash ('a-z', etc.) any combination of the above ('aeiouy', 'a-zA-Z0-9_$', etc.) """ _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) try: return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) except: return "" def matchOnlyAtCol(n): """Helper method for defining parse actions that require matching at a specific column in the input text. """ def verifyCol(strg,locn,toks): if col(locn,strg) != n: raise ParseException(strg,locn,"matched token not at column %d" % n) return verifyCol def replaceWith(replStr): """Helper method for common parse actions that simply return a literal value. Especially useful when used with C{L{transformString}()}. """ def _replFunc(*args): return [replStr] return _replFunc def removeQuotes(s,l,t): """Helper parse action for removing quotation marks from parsed quoted strings. To use, add this parse action to quoted string using:: quotedString.setParseAction( removeQuotes ) """ return t[0][1:-1] def upcaseTokens(s,l,t): """Helper parse action to convert tokens to upper case.""" return [ tt.upper() for tt in map(_ustr,t) ] def downcaseTokens(s,l,t): """Helper parse action to convert tokens to lower case.""" return [ tt.lower() for tt in map(_ustr,t) ] def keepOriginalText(s,startLoc,t): """DEPRECATED - use new helper method C{L{originalTextFor}}. Helper parse action to preserve original parsed text, overriding any nested parse actions.""" try: endloc = getTokensEndLoc() except ParseException: raise ParseFatalException("incorrect usage of keepOriginalText - may only be called as a parse action") del t[:] t += ParseResults(s[startLoc:endloc]) return t def getTokensEndLoc(): """Method to be called from within a parse action to determine the end location of the parsed tokens.""" import inspect fstack = inspect.stack() try: # search up the stack (through intervening argument normalizers) for correct calling routine for f in fstack[2:]: if f[3] == "_parseNoCache": endloc = f[0].f_locals["loc"] return endloc else: raise ParseFatalException("incorrect usage of getTokensEndLoc - may only be called from within a parse action") finally: del fstack def _makeTags(tagStr, xml): """Internal helper to construct opening and closing tag expressions, given a tag name""" if isinstance(tagStr,basestring): resname = tagStr tagStr = Keyword(tagStr, caseless=not xml) else: resname = tagStr.name tagAttrName = Word(alphas,alphanums+"_-:") if (xml): tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) openTag = Suppress("<") + tagStr("tag") + \ Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") else: printablesLessRAbrack = "".join(c for c in printables if c not in ">") tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) openTag = Suppress("<") + tagStr("tag") + \ Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ Optional( Suppress("=") + tagAttrValue ) ))) + \ Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") closeTag = Combine(_L("") openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % tagStr) closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("" % tagStr) openTag.tag = resname closeTag.tag = resname return openTag, closeTag def makeHTMLTags(tagStr): """Helper to construct opening and closing tag expressions for HTML, given a tag name""" return _makeTags( tagStr, False ) def makeXMLTags(tagStr): """Helper to construct opening and closing tag expressions for XML, given a tag name""" return _makeTags( tagStr, True ) def withAttribute(*args,**attrDict): """Helper to create a validating parse action to be used with start tags created with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag with a required attribute value, to avoid false matches on common tags such as C{} or C{
}. Call C{withAttribute} with a series of attribute names and values. Specify the list of filter attributes names and values as: - keyword arguments, as in C{(align="right")}, or - as an explicit dict with C{**} operator, when an attribute name is also a Python reserved word, as in C{**{"class":"Customer", "align":"right"}} - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) For attribute names with a namespace prefix, you must use the second form. Attribute names are matched insensitive to upper/lower case. To verify that the attribute exists, but without specifying a value, pass C{withAttribute.ANY_VALUE} as the value. """ if args: attrs = args[:] else: attrs = attrDict.items() attrs = [(k,v) for k,v in attrs] def pa(s,l,tokens): for attrName,attrValue in attrs: if attrName not in tokens: raise ParseException(s,l,"no matching attribute " + attrName) if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % (attrName, tokens[attrName], attrValue)) return pa withAttribute.ANY_VALUE = object() opAssoc = _Constants() opAssoc.LEFT = object() opAssoc.RIGHT = object() def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): """Helper method for constructing grammars of expressions made up of operators working in a precedence hierarchy. Operators may be unary or binary, left- or right-associative. Parse actions can also be attached to operator expressions. Parameters: - baseExpr - expression representing the most basic element for the nested - opList - list of tuples, one for each operator precedence level in the expression grammar; each tuple is of the form (opExpr, numTerms, rightLeftAssoc, parseAction), where: - opExpr is the pyparsing expression for the operator; may also be a string, which will be converted to a Literal; if numTerms is 3, opExpr is a tuple of two expressions, for the two operators separating the 3 terms - numTerms is the number of terms for this operator (must be 1, 2, or 3) - rightLeftAssoc is the indicator whether the operator is right or left associative, using the pyparsing-defined constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. - parseAction is the parse action to be associated with expressions matching this operator expression (the parse action tuple member may be omitted) - lpar - expression for matching left-parentheses (default=Suppress('(')) - rpar - expression for matching right-parentheses (default=Suppress(')')) """ ret = Forward() lastExpr = baseExpr | ( lpar + ret + rpar ) for i,operDef in enumerate(opList): opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] if arity == 3: if opExpr is None or len(opExpr) != 2: raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") opExpr1, opExpr2 = opExpr thisExpr = Forward()#.setName("expr%d" % i) if rightLeftAssoc == opAssoc.LEFT: if arity == 1: matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) elif arity == 2: if opExpr is not None: matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) else: matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) elif arity == 3: matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) else: raise ValueError("operator must be unary (1), binary (2), or ternary (3)") elif rightLeftAssoc == opAssoc.RIGHT: if arity == 1: # try to avoid LR with this extra test if not isinstance(opExpr, Optional): opExpr = Optional(opExpr) matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) elif arity == 2: if opExpr is not None: matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) else: matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) elif arity == 3: matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) else: raise ValueError("operator must be unary (1), binary (2), or ternary (3)") else: raise ValueError("operator must indicate right or left associativity") if pa: matchExpr.setParseAction( pa ) thisExpr <<= ( matchExpr | lastExpr ) lastExpr = thisExpr ret <<= lastExpr return ret operatorPrecedence = infixNotation dblQuotedString = Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*"').setName("string enclosed in double quotes") sglQuotedString = Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*'").setName("string enclosed in single quotes") quotedString = Regex(r'''(?:"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*")|(?:'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*')''').setName("quotedString using single or double quotes") unicodeString = Combine(_L('u') + quotedString.copy()) def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): """Helper method for defining nested lists enclosed in opening and closing delimiters ("(" and ")" are the default). Parameters: - opener - opening character for a nested list (default="("); can also be a pyparsing expression - closer - closing character for a nested list (default=")"); can also be a pyparsing expression - content - expression for items within the nested lists (default=None) - ignoreExpr - expression for ignoring opening and closing delimiters (default=quotedString) If an expression is not provided for the content argument, the nested expression will capture all whitespace-delimited content between delimiters as a list of separate values. Use the C{ignoreExpr} argument to define expressions that may contain opening or closing characters that should not be treated as opening or closing characters for nesting, such as quotedString or a comment expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. The default is L{quotedString}, but if no expressions are to be ignored, then pass C{None} for this argument. """ if opener == closer: raise ValueError("opening and closing strings cannot be the same") if content is None: if isinstance(opener,basestring) and isinstance(closer,basestring): if len(opener) == 1 and len(closer)==1: if ignoreExpr is not None: content = (Combine(OneOrMore(~ignoreExpr + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) else: content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS ).setParseAction(lambda t:t[0].strip())) else: if ignoreExpr is not None: content = (Combine(OneOrMore(~ignoreExpr + ~Literal(opener) + ~Literal(closer) + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) else: content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) else: raise ValueError("opening and closing arguments must be strings if no content expression is given") ret = Forward() if ignoreExpr is not None: ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) else: ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) return ret def indentedBlock(blockStatementExpr, indentStack, indent=True): """Helper method for defining space-delimited indentation blocks, such as those used to define block statements in Python source code. Parameters: - blockStatementExpr - expression defining syntax of statement that is repeated within the indented block - indentStack - list created by caller to manage indentation stack (multiple statementWithIndentedBlock expressions within a single grammar should share a common indentStack) - indent - boolean indicating whether block must be indented beyond the the current level; set to False for block of left-most statements (default=True) A valid block must contain at least one C{blockStatement}. """ def checkPeerIndent(s,l,t): if l >= len(s): return curCol = col(l,s) if curCol != indentStack[-1]: if curCol > indentStack[-1]: raise ParseFatalException(s,l,"illegal nesting") raise ParseException(s,l,"not a peer entry") def checkSubIndent(s,l,t): curCol = col(l,s) if curCol > indentStack[-1]: indentStack.append( curCol ) else: raise ParseException(s,l,"not a subentry") def checkUnindent(s,l,t): if l >= len(s): return curCol = col(l,s) if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): raise ParseException(s,l,"not an unindent") indentStack.pop() NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) INDENT = Empty() + Empty().setParseAction(checkSubIndent) PEER = Empty().setParseAction(checkPeerIndent) UNDENT = Empty().setParseAction(checkUnindent) if indent: smExpr = Group( Optional(NL) + #~ FollowedBy(blockStatementExpr) + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) else: smExpr = Group( Optional(NL) + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) blockStatementExpr.ignore(_bslash + LineEnd()) return smExpr alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:")) commonHTMLEntity = Combine(_L("&") + oneOf("gt lt amp nbsp quot").setResultsName("entity") +";").streamline() _htmlEntityMap = dict(zip("gt lt amp nbsp quot".split(),'><& "')) replaceHTMLEntity = lambda t : t.entity in _htmlEntityMap and _htmlEntityMap[t.entity] or None # it's easy to get these comment structures wrong - they're very common, so may as well make them available cStyleComment = Regex(r"/\*(?:[^*]*\*+)+?/").setName("C style comment") htmlComment = Regex(r"") restOfLine = Regex(r".*").leaveWhitespace() dblSlashComment = Regex(r"\/\/(\\\n|.)*").setName("// comment") cppStyleComment = Regex(r"/(?:\*(?:[^*]*\*+)+?/|/[^\n]*(?:\n[^\n]*)*?(?:(?" + str(tokenlist)) print ("tokens = " + str(tokens)) print ("tokens.columns = " + str(tokens.columns)) print ("tokens.tables = " + str(tokens.tables)) print (tokens.asXML("SQL",True)) except ParseBaseException as err: print (teststring + "->") print (err.line) print (" "*(err.column-1) + "^") print (err) print() selectToken = CaselessLiteral( "select" ) fromToken = CaselessLiteral( "from" ) ident = Word( alphas, alphanums + "_$" ) columnName = delimitedList( ident, ".", combine=True ).setParseAction( upcaseTokens ) columnNameList = Group( delimitedList( columnName ) )#.setName("columns") tableName = delimitedList( ident, ".", combine=True ).setParseAction( upcaseTokens ) tableNameList = Group( delimitedList( tableName ) )#.setName("tables") simpleSQL = ( selectToken + \ ( '*' | columnNameList ).setResultsName( "columns" ) + \ fromToken + \ tableNameList.setResultsName( "tables" ) ) test( "SELECT * from XYZZY, ABC" ) test( "select * from SYS.XYZZY" ) test( "Select A from Sys.dual" ) test( "Select AA,BB,CC from Sys.dual" ) test( "Select A, B, C from Sys.dual" ) test( "Select A, B, C from Sys.dual" ) test( "Xelect A, B, C from Sys.dual" ) test( "Select A, B, C frox Sys.dual" ) test( "Select" ) test( "Select ^^^ frox Sys.dual" ) test( "Select A, B, C from Sys.dual, Table2 " ) pyparsing-2.0.3/pyparsingClassDiagram.JPG0000664000175000017500000071556211170740057017425 0ustar barrybarryJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222{" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Aloou;ޱwKQ@T(T :U|-@$چ"W.' 8viaeVm|sPhM n OS[U>NBa<8Qn?Zoqvuro G"UgcAa$YSN4K}'ɎjV860WLkVw!_k=ֹ=Y8ռbz=v`y[CNXt+ =~[t^G[!}|j.ya?Ǿ,x眚Mֹ=G!_k=6)7閡ƬLHcjw@#RT>-A5?]y-] ui+ni %`z~'un?ZoW}\gXytf`2c jxv^$;I~Q6ҩ66U2 -mu@z!_k=Տ? YX ;qn-!E3<D%cc#u(t.uȎ 7;1 wn2\64rR!LFI2A Dn?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAE|K>#N=r'ˋRwۺc9'O&%{]'w>$O[ +Jj'2lD 9#Jg?oEWA@@%{]'>6^I㢀>o+lW?WR٫((((((((((((((((((((((((KMxWW-6k@JD,+*E5CZ <kC<[TV<ӕ_?5oJ?UE9QZ <kC<[TQÕ_?5oJ?UE9QZ <kC<[TQÕ_?5oJ?UE9QZ <kC<[TQÕ_?5oJ?UE9QZ <kC{ v.)bO ΋Z\P̕!Cs@@/G4?Ty~0ևy**1|kC@%{]'>6^I㢀>o+lW?WR٫((j(ItѾ>A'woVnCŵFv*Pڮ/7=VI}oo5{UO>Ě*MiѴ,({ O5Ο0$BLC"4_$$1_ đ$a"9Ö{WD[IJ4 HiPw_9|Ҹvg8YX%HWC ׃ &l%p~pa:~QDVVv{2p=k*I $9$,@KZ^e;$'NUpڒMoIi5K$E\ i9' úcBc+Xm㶅a[rYZL'n8jSnVHa-=̖acTK둃].$߽^_f] #6ڶ>} 9QQ}Qu1H.cbR1Gl_\j$s,ڪL+XKpElQQRG Hδ4 =E) S2v9ٜOj:UΗu#ٽe*VC?'7> }N3I|J#n fwN4_^By6tmEn-+`_Roe+PVkqHPXUOc[_[/yL[ιtNݼcORѵ+Bk=Nt{FL)|08s[g8Ry&tXfbi5Lwq0A.\! uK$Ce= V.VYjKjf[‘m ?&rpH țzՄ֚UbNqj'tFǒ- e8IIqJV`uB7˭iѯ` `A^i:e<]jKyG-+"A<G>NUF$bYč*ףnS+jr8gc$l{"77a^>ةk߿F3Eq M $R(dt`UGQOm~yHv1­V.aER(((((((((OzL]owjL4G{ƨV&g#TaϮ;5Eޢ0?[ 3}u, >iQ`2JY^}d(FLw2s~- ޡ`:Zl>t;bPG0tiQ >;t sN:PI-FBgc|1r6VmÍZDӬ`w1 0|l|T)OL]owjL4G{ƩޢI-WPssuj Ρqqlb,JʻULVuGNi-DE"2:qoL4G{ƨL]owj #c-Ž!2·gYUB\ oy1֟nm2YiA{L&a 򍨋bH溏L4G{ƨL]owjX}nq_9B'n'iRXe o䳂I$ֿ|>Y]m&+4 |Ĕ36w`1laϮ;5G&g#Ts;²oQX?iQ >MoQX?iQ >zL]owjL4G{ƨV&g#TaϮ;5Eޢ0?[ 3}u, >iQ`7L4G{ƨL]owjE`aϮ;5G&g#TX J? Ewuƚ+:,çqҽ [Š( (/]]hnyol3"sl@p˝z[x@0SNh/=[-o=zZzܢ?=[-o=zZzܢ0oea9krտr͗#ߛ/G(V[6_GC~l( ?=[-o=zZzܢ0oea9krտr͗#ߛ/G(V[6_GC~l( ?=[-o=zZzܢ0oea9krտr͗#ߛ/G(_Wa4vS\FAfT!`-Gohz^X_pq&K6@%{]'>6^I㢀>o+lW?WR٫((o]ꩬs$i$M4Z%Z0 7c=9WSPj H1P}%Gե)O¢=ZoC֗G-h˾#6's""ּc{"z#?47Sϔf qѾjQ/c\EI6 #pǮiBҬE럳VOAWBA4 zWЛ;Y3okEeq qnJːwیTsx Ih-}V*ŽOs[9]M#߉/ngDd!ыƀީNxcX-U4Mf3u\5Z1`k_ izrZsZ[3xڴN`&؝/1/G9qӣOz(FWQo|Os I,bm>)N2l [qG{h$f)q08ꆑ Iu!Z}Sb 0;f,P\7D͞>oƅ:]cuNֹ$٤M5: D|a۪sӁ]=St9#K>b #X!T`q>r(/%- ((((((((((((((Oa;B͞*<86qt&%A*N:t..GuEq_5MJ8O iFƍcɝG9qbAl-c rcRn}уckEq뷧WMAmnƙm+HPd)kzxHѦTݢs5 UwHwiQA:GsEq#?,,TwoCRb5ˌ1>ˎ4ډp&&wA8ƕ\:Z+MJPPFѤ t< J1sn_j<\Rs0HZEce A܏AMŧa)~'WEq:!85-6TvpǻRp2i%8'&g"O6Hny a#hS]էH#6Iqۼй22mCu[+[mIZpm<ϒ`>NHRuirM3VIt!a,Qۈ;1l/zV\zic=Ν V'Da; TX%5΢Ov$6\q7/C#9a&QEHŠ(((((((((CA/A]pA u(b ( i ?)l5=OaM;KauI5t*[Ky M4B.*I9'wF_ZIot-fLӼLYxFQ~lb=WβE.[{ A78sIE j b'2GbOy8"F,;xYkXs@(!u?< %,;Cd AГ8gLYn-˅d~Vg.RHJdU It=l.mG_M>}D%ꌶI`X3t'tUј&E4 "trwwR旫 aЎq"$BȊd^O?[9I6^fh0@qK_kvN6y%Xah[͑C?zEtWv[_=m-*O$~|Uc=#@wAc*$KXK{ZX"(W{,lKm.\l # >P 4[ky}"!-w32*F.J<`0[: }_AmLLo(@>^v#9:׉-4=-Nx]Ānչ89: 6^I㢏Wwx ; _[5t7@w?Կj(((]~ ,c$X#SIֵoTmٿF~mvsqҗ7:WԴ]~YL$s2szwbumKJ?&>|w3D_<a|_e%,~ȱHHC$OGS<7qM-YY AМ\kWIFYnfǧxCZinxA(Xf_0y>}M"}FS0 |KCWn;ZO=.;f/Wۻofs9Y;mR.- 'P@RHn=3 j~ptGm͌fF>.>kŕ-~cY#'!'y'+Nӵ{|ɥI"ŔEpJ'jfF%bkvj槖=:x^ &WiL"9Ä߂]3U`ڒMOe Flmǘ逤qtՙeMi-aYF#HG_j>0Ƌ^$q낳*(%<m=jg++moīkzEw*z<{췑N<ͻ)`NGo○SVNxkj"yAȶ+zfUGIEfkV1B&7&N0'j95f7rܕ)'lضi*sz6ETQEQEQEQEQEQEQEQEQEQEQEQEQEW?'%Uj+*E5iI"CI#"c֝Y֏OAC3ǃx%AFbIMskrZ+?ZQ5BYX1"9@`J1@zW3ǙBbl')O^<Zi'&W;ju}mdg’vz!k:uuuebt#s8g%C&nG~4yn-&ivX?^KgPFGJ̽4M*6sLN@,QH_JH,t%XZF<Ty=: 籣uد˩'ĩܰrw`\d^N7[($k"0d` 9.)}7M+e+FVye6M}ܚO]$dAcw=ٶbʂ$ JsEryܐI95˘t7ftMd̀==HtpyPU6+*(9zaV NTbS\λ)jt |[R:xb"vģQAڥ5)~|Nڏn#Yvg}9<> #1ىcc#$#;msJ{]G$#V ?pN? O\T^ Qw3GZM71F?-CxmOX"[n(̠)uYiKQof8Wjg<Ēy&((((((((((((x PWw\&%_"lf (( i[ t5x@0SNh>^,QZϹ-4DZ,78<꾽D$ѭ:4P2(%ƫVIO24Sza!z8)Z0."ICwK1d"E ֎mYeDhc8sۜl3$Wֲ$k#K*\FV-wLdehP~$wvqjoUn-:}Cz Mu,O,5#1ˉV.p>xɩc|Cq j3N]9Fx8.1Z2@ %`F"س3<2\ZоN6E*p1׭GiM"Pk op|>\nۙH5upq"myB3%h0Eei+g/crتέH%t|\uw'մP4B%,[z6 A˭鱩@<)`:*?35}cJ+[QKxdxc(geRRNJ[k޷qwoikm<piraF8UBHqI *C) zѳl k[A F*gҬ\Eik5Ͷ(Pd+8^83 NĎ{$ mH F-(tx\Zěuerr*&qǭv:fy +4r6V8`AU{Č-!u39tn맮oN.FII-(EPEPEPEPEPEPkG+E0\(GUI[c 1 Z`d۷~vnv܌--1BGDog'`sbT FPT#T DIx[qn pqkivB >Aq=6 bힼSEh^qYz^k$I݅Vp,e9IUW𕃇['F5Ӫqkz^Wax'Mڅ{tLv@8rrt&VԯQxcY1 I8/sE?k>05֣w7ni0KC*+}sV:Eiz,涷#2Dk45}Š(QEQEQEQEQEQEQEQEQEQEQEQEQEIu w$Ŀ M@ֵ]=yp^Lrvs\.xĊ2mG)FFȊXdW9(kb0ܫA!GԐ+-g}B,IjmzyqǠ`?O?lx&7̄I&!zkNTkbh;Bv}W?bǠ1@dU._L(V1e@##T>#P<gQ*#Xfˠ)K3Jʓ1Ce[J+[֐!E -7.䏼1io#; 'K˜ґ568дLӆZ9!ÂF8I.vXK)hh5vuےr 0y9&i$в$~[ 2b0y#H=ANz=C7m,x X%ٶBܷb~r0*_j3-Eg\Mpp~r:rZw+<1Y?q4jk%-pY͞E#Z+XbmqJ:l$*0\hڏxn//c)ǘfR yq;ӧdUk-HbH!Iyc1׍J( ];J`w]%szw kv6JB ( ( ( ( ( ( (>@%{]'>6^I㢀>o+lW?WR٫((((((((((((((((((((((((sӉ33VA.%! X#HEIN,gw$P p7mBxM.9mR93 `͜. pp;qi-Kn'UP=W<~8ﰚW}KSd 4N*2U2 lw:ZvW1Gk*$*!fEqN:0h[_;;V!wȻ"*)_sb3\hmc ~9R2ݬ@#]ֶȱ]jLcYO<*6vpp'ۥG7dYduVKeeYsk`>lO8۾H.|Is ~so4ΤlV!C E'Ԯq;${uϔS\8=JTVB4em)/&iJ`p0ݧ=Ĭx|u,pp0H>X]glbX! r9!մ 1jnyn&_1\4A$\YiniEQEQEQEQEQEQEQEQErA x PWw[ESQEW=OaM;KacC#ii1~y!YA# AV A#:cC*UrpS@>NDoo㾺짼mKmѤQβOk{<wlŦ iN6"nP7 dG{bi$0]+ŪE~,/ !T0Gq=sM uik}:0Ҵ 2rHCxbѴ !Ml'"A{wɒF;aϠZZzݽ&>UL wP|< Y.B$'ˍ/?h`s`8#`QwaԴ[ mNnFCp͸cto}z[ >V1 }v\·Gi}=M~C>F/1zsj> .O ۴"#Cm?'dݴt>(,63MAe~%t{"FyjI_ޛio;xDPc%C̀>\1.ybxZEP #ʯY7m#XwO}Ev 鏩i6h6}]78l?E-6?%eQCC#8<`z?+hn$k# ;!߸nB9@OqcURd.Z[dGonbH 6Nԥ]sMGPPJKفYnV3c'>/hsD:>j3zT}5ͥƬ#y#W*aHָ)4ˡG;p 8B~V7y<ۥm/{"?g)}}.#NMuF[++i$!A>OӢYڤ 0D@Bp)c\#>+m ;xoZ2 4`29@r1f,>Ǥ0KsnX1A(gzuߵb\[߸O\U7YDZtuHQBZ7z %Ym.g(2HVx$t&,5[i%W QYE DU @r>QOgo':MG=*sɷDˎp:[آI ,7`=wrH\N@] Jͼ"-D#:C 2Tr9tbO[Mqm|.s7D_ FHANُ҅þX&cѴ +f֎:$9KW(\)Ӏp}?>tJ;-ZAH,w6G\Rx&w7&k";',L@ `u7;*(w kv6J(?mt ( ( ( ( ( ( (>@%{]'>6^I㢀>o+lW?WR٫(((((((((((((((((((((((( >[.Q5+%[ "UT1}0kP֡C$o'n8d@%RuԂk{Vɽ#H.@ &v{'Mr$j-8XP#Oآzޝ,hCF7'ctN#G|T6!nu'K`X=G+͒8N:I<#lc/V56cr\-ē*У:Mnh$tbF,!R' ׽ Ucu$Rj(f,dfU@3+qzpiL̻A'\[>) 36dOR91Yx6ndV/݄bά@A] n? ē*>%[lO'4?K:iLZgۻhnۜkV5E∦[]+r.c+<'$ "F$FeP 2 E ((((((((ӿk_ ѷuW7@ֿan뤤HQEQEQEQEQEQEQE+]jr*T;(beB9J% -Kk0$J̞V2Pq=˷'}ѿo݆r!a#hr73{f Es*r޸e*Os?$9gJ{ҢX+lYںúĂdGÎ[AY:}w0Ikm,s6n#hՄs{M!kmhm&8gܕi㎆Rx!Ido-ȁF߻ 1S5gkuPm39N˿`Ro[_tZnjikkco"bL`v,u(o![L6&d#[ sntd{E>m܍>ǒ8Mucm鳬ڥ7,s"1WEo'vv871ʸu6Qciye@r ҕ9I=;J}鐉m"-yv:מ$ƎU+0Odd/Uy'F3pcM)p1S[h/#xgQO|}Kg4[Bc*J ( ( ( ( ( ( ( ( (9 J? Ewuh?P] #wGOUw6xs#UҤʯ0P)q"ɒ[Hn9sYTc,0JF:QEx@0SNk{Ɵšw@QE2(((((((((((( ];J`w]%szw kv6JDQ@Q@Q@Q@Q@Q@Q@ |mۿEk@O7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\xW_)OPn*Dlu ؊H]lixF żRVwmnb8hӃxSԮ-fOKh#d|-Թ }ђHp'ev$HbydpfcM.eإkor"%B3.i0~P37c5];hVKpL2H'5;X3/e%?ʿWUU* $FiC HnHݠqZ)ܓs̰$uHXk:.׷R:rʠ{?[k{]9 PHZKȮ$rO}deq嫗>c)xF6Ws,,ƈIS&7bV(5]3iepʛg#[\EspxA\r~a(_ZuMj[;GUHP=vb`uw]{6߼n{m..u{ mJ}_xT s rY|fpɥHen*63CsOG\ͭi.USex$ 4'ڴUֱ.aN,#ha"nQ\9-SmlfXd8 ^c>U;^Qnl2Cqn,G@rïR=ҳrIբ) (((((((4(  @H[Š( (((((((((((((((((((((((Wwxow:(º]s u/- ((((((((((((((((((((((((+*E5tIu4&ц #Nz RK4 'Hu}:ۢQR}Gk/l0LӪao?Sl3,4AT/̫a=E3ij[%$F#anT>sP2>b$v&rj-|7Z2qN 2K.ݧ*8ӥ/#Yf EEk hMTg'理K8ƣ^_:Mʒ Hb1+_{AmNѺl9(zM7fJqt>x; XnFqp8hZr +B%+ 6B->czds0h%9,LdVq{zE(e41!$1h3ҡݍO',rn.%XdrVڵݮlͨLkt[=أ79<'#Oʶa𱈝xȀQk{k[7t &q`C;x3}+ˉ;XF^LB'$+Ix1%jgLIx )xֽ4Y14"<(dYxz=W!a1 mh@ˆkmqŷ{}PuOާ\M(l@|ÿ~r;`s/}im{e!y)T;Pgk|2MJ-= )5Բ$X]0N P]vC F G5V  u}+kd#NZKq n!v] [ -Kf`R~cFwMy^d{ILar~\tEaʻ1-n rKLd XH9ϽIi]Os$W;sc8ErERQEQEQEQEQEQEQEh?P)WZoݧ8m ~Pӗ.sٱִF2P: Tl<7lz۝]+)X ٌA.Ӛσj6mpjDX0޻ c5CUuxl^w\!@l+H6O9s*ishĜ}tëe FӌR}HGwMI"TYuI"z`W9GZ'RG鯮Eu)YQ `=rzvlǩZWkήdC6FsB'F/;hI5:%ZW ebv3Nj̾f1沤6G$d3Z tH=LOk eRh2="3xЫE6FאOѪ7?TDڭPn￞cT!Piu)#iF䜡MGv+ǯIu /́yxn;;Dϱ&E4ɨ٤ iT*3U{]o2[N6M%IBd+еkkY`kipPz(WZ_ i_$P[Gyx+%rzdwYnһ4gE`L# 6[y~etUGÞNE[ԼyqkOG.aE"xR ĶbBʤS-?1N:Y Z/[km՟s;ʁB#r0TxAähmḗVH'ϕ#\Y0pvYxb;xF(-v )eCFGL;Olqu ̥yUpNz^WX}$3"(ʉ&ThЖ6xS*[J2yL\f<ٰ||-xMFE!oBxQ$rrjlGooppqpe?k 6%:m7VDhn0j&I${إ7A{Cꦷm<9ao{5Ɂ|ǖ{ΝM݋V0A{m!cʡvzơ}wH5[f@ElJʹk1N![x m ˜OڥAYL7L0o>ʅ$``:9qY[t{CH%L)l\de Ѿ{o6n}.? <[p ]_O@ݶp/ko&Ƅ~bs Dc^)cHC#`zGQY>#-IYHYیmGh^7%T`b;:cq,xPA6uYH'{O4ە6#zukhM8ϵE&mg_.đx|V$ZE'EZIn>o[@6ʹ>`>qVt ZCΣgk=6ƞd(Mĕlqvݪܛcqm#PıUG{8o{Tk'N0rwM;FB8=^*W6Qi32+yM)IY6"($ ϵT̈o -PJ(I`(c\ճj7Mq..@1Oz'g,-4Z'dvo/l("0}lZz]4{-Epm6oz5$Ɩ ţQ)œ<=|:'}|~_";sQim ¶KuT`3V[I"e!TL0PI۔N[uۼ>|4 ¸IF!4*t6qۏjJ[{\}kcT KƘ zQ۟OX1ʹ\I.P LpGV^yal-H5 e'1q'vZA"g`ێ6#W_ (O|ܠxo'>!彨2jx-7IK,ct=) ѨH$ -ți\¯m\U["]%V|+"8Y1ؚtxN_'%lc?Uk_ ǣr,Z#':'Ir>l:Lۢh±}e*Xc8oJߕI 34WWSħu8xgR΃n<+tv@AS ZTqEmᴎ$]M{=օV'[h,\[bC, #ݎI<8\Q7mdiH ه85)_BdwmۜvN+"zm~odi|)K( |йny{i5,v2@vKX֒̄%ߘZ%fO+l (8bOCgms) #WP1ʊH xEbpUۆ/*0Rp9ϰ8iZQ15_=@d1-E*7J4HbY)98zu^L K]de7ny{7j>*Ů`{d*7[j *'+a^ͼw0ۼӶ-lsN0:W=wg s[2G6Wo!#fNB3玁~,P,HF8?l>m}?,I%/x cWC+[WVZy ]AfwJ ޸Q bW#9}{MJAd#U,Oe9K}ȃ|c>\Q8:D>I0}c( <;`\mm0yѲȇ(pWZtTx}g>nluznZw̟ؒ_`U&gpBVp"xri+C(hD1J4w9^'@.\˹ER([VJ'i At ( ( ( ( ( ( ( ( ( (9 J? Ewuh?Pz`?O~3_XYDNEh&@V wqU}$` Haweq;ԙ"=:Nxk @?}zH*Y6%9}\N*ދ̯x gc >`09z^=tqlۖ "W$H'pc(~ߠ^:/SItIg &GUq ǜhZE8Qvs\_rZGpd`iDqzEBd uTmҏ6լ1'uۆRBpw>6\]G(HfV]%9ڣ\o[fk1E2L(=ANKy与@"J8 @+~R:rxzY-ۿwN]:'r4YI8un* QEQEQEQEQEQEQEQEQEQEh?PQHzӤ^Ěvw3 ke.Gl;Fyvɝ!e32PFۻG"I>ڳN"v0|EcAB-:ⴕٌINwL~s]K4Wx~jo(pK>].uY^Ӛى$򋎪$۰Gj ?Hlm+%ϔnǟvyc'WGmgZX'FBIl-T-#;)|;d$I95?oHLY(JB63Y/0Icv~tգӝe #Bd 8,9=sk's6ևS4I* 0O>ƒxmfjY-Vr][ZE d1,T{vo4̇E*As\$]0ۼ Ǯ6WZخgus##JH,t%XZF<Ty=: 籥}u8KG 's"g`1 9kI;!ڹ$n`d/ʅ'nzx{8$. c?W)g{a(-t2w]1ʮ>P|S~c:Olu Uκ.v[N˹*R}(,(((((((((4(  @H[Š( (((((((((((((((((((((((Wwxow:(º]s u/- ((((((((((((((((((((((((+*E5tIukh{K ,0>犹o:][d chVS&ц #NsMnPlxm^E pk&6)yqgu#4 n aAs5yg[1V$d e :?cVP#=,OcM[dm8V By_iUC/7o3f}kmm_RGfbO^ID%E;ytM"ݼvi98!9s7 rvAHdWpdJrĞ8I9'='Š8#7V$mmx/1G2O`k0ŵϙ]E,Is&"D̻r@9kƑ 59ؓjٲ*i]!ȺYP9d9p2~POC^YH⌢줒?3N2`RyW=[[uiMŢ.*ni@띹;\85 =]9'-ɏ|;W^3~leG?ߥ8 Q궊ii'?\7 n ԒpqU%m泗UtndhdD,Tdc>WlqyQOn8nEF%S!q!R"opqq;HlAw,  0pOyTs, kuGgPGLwPiVrN{ܙcL[a$7=9gWjɫ,.z|`f#kyQIF Vث5jҋo"TIEGG?ߥIdT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yߥrA x PWw[ESQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE+Bvl"Ύ?'N?$Q >Bvl"::+Q;\_G$ .s}GsE?'k( 3IeOН/H,Ύ?'N?$Q >Bvl"::+5KSӖV)^F`왈ݺ5eu # -Q@Q@Q@Q@s;y_]覮H~y#P#&3p0Q(ONݣ׮FBygh\L dda8W]7Yp ~[5Rpyl.Ƌ\"Asa;т`,pU[^ V.)켞b#bpqǧ\NM "6 ȃhU2pBQNG O,34xc&yYcrc)Re70,BGqyziH~+B/n$o5]OcS$#E,M6}KK 9|,fR1k[oҝiGEI7T/+=6X7m$YRI2HN#!mYnKg+%/>qR#PQIuipVTXفUV|(:)b 4I* S5X6,r$@3ŭb ˟-eQ9$GoҀ#GoҀ#GoҀ#GoҀ#GoҀ#GoҀ#GoҀ#o~/?ߥH#7@%_"4( c7QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|JnO|mۿE}?WR٫WA@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@s5ӿk բ+((OǺ4Z冗g&+p WVw <9g]ͶOv5r=Q 8nFcclrq5g`NER Q[$BI.+urO+XlD,QEdQ@Q@Q@s;y_]覮KͬWW5kxBBt* '>+kZNC /%$i?Jghc 8#!GZJG%$i?>X?tO@F]8=T)_ִ5I&m5BxrI<9nz? G?OGJCRcV_Ӈöf4q 6A!Iʞ=XJmGQ"$G3 b c;<` G?OGJM)!8Cy˹.5bv yg Fڸ``1Vl|!0kaS"FDFv}ixW z?('4I{ְ!{CPM#Fɍ 2'XIsmxgHlnIiIV[8Ab[yl t4QEQ!EPEPEPEPEP\޶%EoQ_l{eȤ$ezJuz֥RH|טC-vU Z`HWnц e-}@n( ZjІ$01'9B]^O[ޯ5+{sm}%v].|I0)(((((.+}2d(.E'#* 74i2m൫(hHv-bNs1fuz֥RH|טC-vU Z`HWnц k2x|9[[k.f+7$Jjn YY%78T /,)ee9nQ#ԼsizHKH,g杞iaPAp)W+921ƺB8v/֥_IW ɑEkG+p}9*7~,Ai8VvmK{hc8*p+;7vp,dI:L))#p%@ zY+[\;}Vm$p6nx ڟ6[ͨG2Dfhe #%)=|%[8Ăyr@E%P)IVF8a fCa3U|qUYw&_&/X^{M:8Ryg 䴃$N3ZqzTjVx̒9wƸ,#TggQ"%UURr@s׽f뛋۩n5%eL%l 9 )@BF^%΍5&[vSNT;f  9 Ty@Zʲg$`rx =XZ4 S`6#!Cݎ*+O^i3Ar_&-!(%DN34x,zޕ`A}B &Bn~KbmM6f zcg5ol2)`Ĝ9'4e%ii͍Jg<Us 4wv&W%{XGD%K;q}5>e5cdPCP@ r2zGgndI}B/#3[\:6^I㢏Wwx ; _[5t7@w?Կj(((((((((((((oH\K{4w"ȤnV_5Ep>-Uv?fɪ߻3]vp>-Uv?fɪ߻3]Y`MW񚩪YxH/u;k$V%8O\ j~!پcm#h=B/#0?d0+#M3"dgZ~jvYc5D!") ;޺ɪ߻3Ro|E5XK, #iq&EWmIYwG 5_cho 5N.ſ2j5_ck L;tnok sop96+/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \1隈It4*zbVPEPEPU:O.'gNPKN=*s;y_]覠I}oWjMtE{ƫV˜S+]'}^?5[Z(S+]'}^?5[Z(S+]'}^gu?vzܗWZ}0%1`dֺ(S+]'}^?5[Z(S+]'}^?5[Z(S+]'}^?5[Z(S+]'}^?5[Z(S+]'}^?5[Z(R;Z7K5#͜ HH%+Jak%QLG?'%Uj+/ĺlυu}.ݣYl$(gBqj%;y4GNacv@@(r(<RA\FѬt}Fh,㷍,U(' gPYEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%P'%UjԮ?Ɩ*_5HrdHQ| nHqk+2(((((((/֥_I]mr^K,#+R>6^I㢏Wwx ; _[5t7@w?Կj(((((.6]_TX{+)#Y*YdzԢ >& >& >& >& >& >& nГ<j[ /PyO vg1Oɩ)mF{QDrL۱`0TץJg;}OVmWK)̵R%vg|xWEE7pJERJak_*ׅop)*9[{ PȡԌA8IEs7O*m2[߃6q4Ygc$Ï29 m (F? dӧٟcՏ1Ѕmc0eR@`!6]i?o1|k3@,GzonS:ӓz \ʷe.m "nۺ#vSw$z._D?{{hKNsv'4Ơgdۏ9y{c-mDc8yIxO(Gvqr]ӿ\-;5ځyh vs8Eg( Bp k,/D?{{k&[^0RHl.̱^j(YdHna]q(D}w -(LŠ((( k>vg6 p Obox$1S^LdM'ӱQOi_6ğҿm'#}E.D('4IQOi_6뾢D('4IQOi_6뾢D('4IQOi_6뾢D('4IQOi_6뾢D('4IQOi_6뾢D('4IQOi_6뾢D('4IROkj^t\wE?yrC&&X5?ZEz׺z"H`VcMB8bbdxW z6\ '[H\;Hb8+xn⸷9$l]H #ԕI%l(b>@%{]'>6^I㢀>o+lW?WR٫((ֵFX4:kyoE\ $Ga?^-i(oKſ?s/"h9is :Jw$Ŀ MQixZ'eZGujzO>ۭ%mЮ}g2(AfvW7h9hoOȴs :J+oOȴixZ'eZ9Y%ixZ'eZMi n&dRH Cd,>dgWE67YcYXu1殞!IҴ"%x?<(u/ D̿J(oKſ?s/"h9is :Je ;o [ Gh9k?Y-c"wmsZVϓ2Kfvc=zQ̂(oKſ?s/"h9hAftW7h9hoOȴs :J+oOȵ'-}7\Ӭli9RSAOCN酙QEs u/-  ; _[5tQ\T:TzψH=pĐj0"'m#W;"Zwk=.iΦӿ\-;5\9Y\"Zwk=%;G:Vu5Iu%;Q"[{ I+ .#Q΃m%;G"Zwk=sgSEri?o9Y\"Zwk=%;G:Vu4WoMC\yõ6*pe7_ڴW&_)((((+*E5tIu*ַ;G!gk<㵽Es?LovCy{kz.!gk<ַ;[Qp0?[3~^ޢ~?Z/\ Cy{h?Lov`ַ;G!gk<㵽E3~^??[(?~?Z/oQE4[tv.Mܷ :p38u5%Bo5VQE1Q@Q@Q@"?ng$_ Zvr|RpX8pXo^i?'lGVlG~14̤AEG[qo,sA*H2AG9sD)[U5 whi79C ܜ,'bmW3O∵$zvrRA,,Z[y/T)cJ屹{ڛ*y<{R^>DĿG[@M5b˹4~O /섳|v=󎵛?m oѮ&c(AR @aA$j[@M5ko4OKެ gX6]_DUJJLrcKk1ʿiW|;I(@@aVh8_ _Fb"ZU5jkTGy :g:s~hcH=30Ky2ykc[ko4OK}ſ?q/#Qw{Ag:YxXsKVbAhKu'&_:u[\_Aut%s t$]PĂrz:_ko4OK}ſ?q/#Rolt7WW[&Y%e&S+)v`~EQNiumcs,G+2<<q8kW~-&'%j5.\$913b5+;KБך/,X/o/#ў7p76 |'9h8_ _FVEXAG@8Le29KzWQX?ko4OK}ſ?q/#PoWOZ_ _FsVWZO4/췏>[g;LvOLr㸥QElfQEQEQEQEQEQEQEQEQEQEQEcu<-äb {g\=W6ғI; ȯ4ii+Cg?ن `lmo/q:( (Wwxow:(º]s u/- ((/(/mlV>%E]{G`*FWxMYw5֝m=Hn!`26ȩϬAwX>֨FكAbG$c=Z\=R[HQ I `/ݸ+:Յ~׍f-\[&(< IwR¸>FZe\o?r?{-h-(WA\sa]KKf9C+Em[uHn`*FGV Ѵ{p4bH`uAԎ2>zGIhEr4H^`R+;quhMkVO6\1pϽ26I,#ԌZ-bB'Bsұu^݆aud^͑q66֑˳yji֚mPLJ.%lXMȢ}p8dcgA L H4f%A֭_j,fX (u9R>t*o%^[z+S\34̒fݛbHgh%} Z(aEP?w_)K+7OI`եI]O6"FQVHQEQEQEQEW?'%Uj+*E5jQEjQEQEQEQEQEQEQEQEqP,?uw%Bo5VQE1Q@Q@Q@Q@s'WaHںz4O‘L*;tQEbXQEQEQEQEQEQEQEWOZ쫍GZ'eT7;(3 (8χWWC\y_36H3U/O7%T~襭Ǚr?Ty~0ևy**1|kCg伎A溉JG;^B]L N<%CN?8 :' "z@`q/tOEW?_zmkNu&v$`e!I8䀹 Q;uIXIX*\4ozccV^_ڮ-8Fq DŽi?aRG%WU[Gc Ӣ/*N<%CNޢf'D_UxKUE`q/tOEQ DŽi?a[P'D_UxKUE`q/tOEW9kF-'+T3 .m'z q(D}}EVg?WR٫WA@-^'Rvse`c*ch8_ _F,k2dA+ʄ@H#_ _F~-&4aԺYA#4_ _F~-& 7x:mevU$)vϨ+7OI`եI]O6"FQVHQEQEQEQEV !ILHK3I'VǷDb`pAѯ2CMyƫGF1,NƛϿ>QȊg= Q WCϿ>G&>9yj&TȾ zd/r(fBSH 2UA"G&>>D<5_^?<5_^4hӿo39O4?MWןjO4?MWןjM;}?4hA{U5U5N}ƏM;}9s3a Miض-!-%.X"8=kz=R,H`w~5z+QE0 ( ( ( ( 4O‘th_#+jTw6袊İ(((((((79hіWOZn)lwQElfQEr襭>oMF1np = L4G{ƫM+ 3}u?0?[`7L4G{ƨL]owjE`aϮ;5G&g#TXxKQ{ç]Ѣ3*8in]?Ku5Ԯcy =´lT9߼L]owjL4G{ƪOĴMo 㿼]X\Zhy7 h.};Z+ akhV$r+LpAPXIFp_ >iQv$8'SJbt;y٦_R>nw ,o P;N9L]owjL4G{ƨm7L4G{ƨL]owj7L4G{ƨL]owjE`aϮ;5G&g#TX |Q#`kZiW9kڷE|VyV3[2[twtq+QKch(ow:(%{]'WA\sa]KKf ( (9KJ`iCjk4Frm6ono 7mw95/(/mlVRJ+ծugֶo#ӆfpKzꪅjs B=Hzd)َIdgI+xiJ,{ #ߒ.3\j%ENɎfcuA!#~b s9 ;x#n]ӍTg΁DES?s^j]oa}i$EoJHvYCG< 6I,w4ݹ*}~[:5ۢDiUV26K`׿0t Y Hڥ,G&]*K 7vzUEDT@T`T[RNחkGZ'evUG-2֜7;(39º]s u/- `[]h TQGQmRMޛ=jvSwOZ%% -Kk0$J̞V2Pq=me*Os?$9gJ{һj*y\5il$5 ij36S8O覭/ :O?'SV'u?V؉QEY!EcLng'ukM klTp@T?5oeHi\cV[6_G&C~l=bj9kտr͗#΃=bj9kտr͗#΃=bj9kտr͗#΃=bj9kտr͗#΃=bj9kտr͗#΃QixK5]V&%K|@r|?]NII&qX⾈$Q `@ؚZz~7lu3 ]~"Bg=$#hNG:jt'R-lu Fe5K,BaFC#<5uy>%$;d*cr'-dl2Wey[Iiu'R߼ vX\s9.O_[zueI4/8<:Պ[@-2-^-dgIEs^-/ D̿G2 3/ D̿G_EQ\_EKſ?s/"̂(oKſ?s/"h9hAftW7h9hoOȴs :J+oOȴixZ'eZ9Y%ixZ'eZ?[@-2-,Β[@-2-^-dgIEs^-/ D̿G2 3cD)[S[@-2-`.xVMk@["fXמnTr:¬GG'se¬GG* /Jtt{0:+Y_.U^auW'  ҿ]<7@+Ø(Og:?VxozW ه1WOZg:eIf3X[Z˰hWʚs* (9_?Rr{h a S\ *jK)^[lV֏-U1tPTr݇'*>ViL[(c9Vc72Z0C$3Ac!y<1 IE]uK{S-Q̸'q1 dMNF^OuzxHбU2 Or:#;+ cP_&?,Ds3.XFIw#u9mUyv1u=z=xPot*IflBev #|3ȌBrpKm78'͔u$-yPJK*09GQ\& WRV?,,H C$s=NΘǣtKd.5 VdA7øQ_ V^ 4ѭXDD^H\vy{+Zk"I"w kwb ;Km*mv)M7duW.o@%{]'>6^I㢀>o+lW?WR٫((oR.FVU׼9xbԴ;>S۬<=+Y_.)X(Og:?VxozW uW'  ҿ]<7@+Ø(Og:?VxozW ه1Q\* /Jtt¬GGcS7aFKOU^k_%\Yv #.FpHf'#urO*G^EQgv c8*9 ѷuXonu6tZXb dC#)lA̍Ў++ſ2jrnY}`MW?|[C&~.FCſ2j5_cha̎?|[C&~>-Uv?fFCſ2j5_cha̎>FZ|[C&~1<+{,0 BBrvsN0i(9º]s u/- m|G'UiS6w7I AAև'D_Uo__.a=#vCJFo'D_UxKUݟG#v.@38 :' "_40/F ?C(c7 Ӣ/*N<%CNVqh\nEIHdDA󟳺`[VU t2n1T )|ixYKi~۰#Nn2dҍ+[ EVӇnn|.1S_^x6VP\OiVkwf>`ɶp9%ĥ{y_j(Š(( J? Euh?Pщag.-"*nGW?`=_YH6 wLv$c^-:f]>r{}j&vUKcU#zwEYXm(b ( ( ( ( ( (9_?R`IkG5W *"FԔPEPQp.]>IEQEQEQEQEGVј]YNKIܚ((79hіWOZn)lwQElfQE|JnO|mۿE}?WR٫WA@Q@Q@Q@Q@Q@Q@WWڗKC\ 5,p%䞔ҹW-?oi򳩢oD?{{hKNsvth[-;5?ӿ\+:+KNsvD?{{hAΦӿ\-;59roD?{{hKNsvth[-;5?ӿ\+:+KNsvD?{{hAΦӿ\-;59rσsa]KKf(|[!H&bBS[PY%XOrI?ӿ\+:+KNsvD?{{hAΦӿ\-;59r o xMK"2y\\ek#GwI\MX>7L6t,,R8erd6:LHU5/;YtgQ:1Ƀ(&F2 1Y hhvY,"RUV/B;Euo4MIkj1\Tq)(p5(Q@Q@Q@Q@xW_)$ 䊵'%UjԬ\LH5?eAП/H+2H5?eAП/H( OoYEj'+zS?[_G$ ޢ0 O$Q B~" H5?eAП/H( OoYEq iH"fB>SӂG55_ eGV&GE\-=*:fԣu#bc8<?? GV3ب3 Ӣ/*N<%CNޢ,_40 Ӣ/* N<%CN?8 :' "z_40 Ӣ/* N<%CN?8 :' "z_40 Ӣ/* N<%CN?8 :' "z_40 Ӣ/* N<%CN?8 :' "z_40 Ӣ/* N<%CNMr i5h$8 »j4( pܙlwtQEj@QEQEu+;KU7=nɀoA%B_ "ºM[z-A%B? ' jψG+Ky%AVr`;Tg$`Nl^ROkqu%ūH[i"H '#@$ _A%B? ' j1=(3V8]L#Fтe%LV*,/v]n@X 5@I?V?_G [D|_MS?Wشm-<2ڬ{lqiYNW="($(ow:(%{]'WA\sa]KKf ( ( ( ( ( ( |$ K]Ur襬z( ( ( ( (0iE-hbܨW ۗ,2G'qxGA1H.3' Cb=G^mMypꭻ<`K'9\-i{k[U*=2Xc8|+oqso>E=oZG̼QNѵ=zK-O$rTH*q}+xaP$i|5C ( ( ( (8>FZ}\?r?{-k9ºo]s2t- Q@Q@Q@Q@Q@xW_)u5K.Tn"Xe!iMY𮯥۴k=񴄅 TN2} sxİ$M%jc ׵Dvլ:umndI()>I#5K\{IFKȆ?M, u+ğҿm'# G?OG}0koO\buX ;"

ki!Vuh:Vn :} 2Wty8OJWCs־02h+ưyh \K<3@U@=s[&i+mC#wxK0999Tji w-I;um Vs^0M=\̑JN\g*&OS2U&="&2IHkg9ﶵ4i){tc|Y%1xF9a' RRC/>l'{e-͐s#93Q7ilNYE9d C~az[_%mvEcI.c< 䄢RT \R-6IZ"#`? PZڥlYHIc@*zDh?PuMH# 9GW3qKZQ ]E<\m zV<[AMdoO4-6^NRr$Ũ²C"vO>1X!5N$K{/坷*!}` cw& 'h'7_I CR mɘ۔e%y; 9߆:UOơ=K<[sm *A' 7b> 'h'7_Iw ǂ']fƕ7G$B0rcjH (Gsް 'h'7_I{\%_"~ 'k‰w5ſ F7&$?pc YPR*( (uoźkC*HKWR2",Gz]'}^']Zެ25[]'}^բ8r_?Q >jG8r_?Q >jG8r_?Q >jG8r_?Q >jG8r_?Q >jG8r_?Q >jG8r_?Q >jG8r_?Q >jG8r_?V}i|CyZUXmiyv8Q]-q(D}Sl($(ow:(%{]'WA\sa]KKf ( ( ( ( ( ( ]x|-mo&*3/%EN=Mz-r襨Q'%j>h8z$o e< ̳~-&'%j7M97)'#TDĿG[@M5m3UI uKd.=0}~-&'%j2Ƴ,FD,O$ d2?1O '%j>h8zPc[@M5ko4OKն%Љʪ?0 =iDĿG[@M5oS"9Iadet9 B(~-&'%jVW#5%GDfp%N8 4DĿG[@M5nR7 d 4̱Jಡ<1b}ſ?q/#QDĿ["GN3dEt`e9z_ _F~-&[@M5ko4OKսEy6/[\i_o}߼wD뜞kGZ'ewմv3?/WMk_AT (((((/:.o-f8ĥ"V zV_E@SNkVRh^-/ D̿[TsQh9hoOȵE9Qh9hoOȵE9Qh9hoOȵE9Qh9hoOȵE9Qh9hoOȵE9Qh9k'᷈eP垹 $r$1U vu_ eGUM%chButx55ԓRF4ATCz+Р}s~lQɍU1A&4fm/ i__ ?>g>߱SȇCiVO?G&Эv~YϤQ ?9s3_ +kݧ}} bD?6mom/ iA~`H?أ39M[[?KB}g>߱G,(ACiVO?G&Эv~YϤQ ?9s3_ +kݧ}} bD?6mom/ iA~`H?أ39M[[?KB}g>߱G,(ACiVO?G&Эv~YϤQ ?9s3_o ϊ;짳[6(hG}n}} b8xFP)&MEU((% ?Y5nͽvԢy08nqI >-Uv?fpw-I}`MW?|[C&~.FCſ2j5_cha̎?|[C&~>-Uv?fFCſ2j5_cha̎ J? E>-Uv?fs×^5R\fy[yK5Q"QLM(B(WO7`_X>襭fEPEPEP ڶ;_jF)9r~߅<sFDV3_j]=ۿHmk g-&F-F}6[F"xAb2:4fcXom˛d:9>մu9ԚH ^+!YLr59##sɠi677 ukp%Hz-2R3]Ҵl-L_8rd۷vq*4;$-4m:81C'ڜZ[O#;=ގbx9FA](lx]uvw' eILǸ?/Z#Jӗl-F x'׽vi4e,;hV5-dgϵ-tQE ( ( |Q#`k]q(D}}EVaEPkG+hCw-mbH+ ~W+']Z΢.=voiqw%ԑS#j푟ZQ7mͰ8iceSq* 8c/.pDr5`9{U{}+W&MV2Ћ6!vBQqaF+"]4oϦjkkeY{$sn#o_ۆOӵ; ^H&mdC6m ~g<֊j%% -Kk0$J̞V2Pq=me*Os?$9gJ{һj)s1+m.,rvx+V"2BZk"#e N37rSH3^ Eo%c7ͻ #:`dkK-u 'Dݔ,_54S\^_%y"h9UڅcyA9}Ar #V{kin&P[Z zLc;QK|Y2i5h^eY<*d;2`tn=ao5Ri.ɯw>W*;AE/C-/4EnngiD`$`rᕋcc75mJOT\'ӳa9{s[TQ}nh^M{kgQ=̅!]T62x+[@ 4[rF4c2ĠJ֕^J);)QEq(D}>FZ}[Cc9ns2t- e ;o [ tB ( ( ( ( (9 i[ j7' qq*C ZI#TQy $w8 :' "9z_40 Ӣ/*F DŽi?aG'D_Uz_Y7fqdb)o0lEbO cO ֻKyRhe$l]HG޴2=v( l9hрM R m998?7tM+ X2ʁo`?bsGW3~^??[xM+Cq#G$E?pXqWܳm!@#5o!gk<ַ;[RCy{kմ{m'ZO٥7O1-yzxA^\o?r?{-j;(3 (>@%{]'>6^I㢀>o+lW?WR٫((((((_?RU\m/ \\D*.JFNMEr<7@+  ҿ]O+(Og:?VxozW ه1Q\* /Jtt¬GGc?U^Y_.fYEr<7@+  ҿ]9VxozW g:=se¬GG* /Jtt{0:+Y_.U^auW'  ҿ]<7@+Ø(:}IYt1u{KP   ҿ]9VxozW g:=se¬GG* /Jtt{0!GZ'ewY|=tٌV/##򮾭++_A\ma]7Ka((((({ƿšwZ_AaM;Kak,[LeDfrcu99㷭g=ZE'd٭E5+(Hc#^}S*R];]u2m720voemp:!8l  oc&42 S0>'5\OReEpJ rڇu M&&o.=$e|24HFߏ7}YЬEӠvG*904I3sa4R衵z-c66R|8F2Cuj[-߇ :+\1q4gBpO WUuiWMeq*Mn$eRHO@*;w6qkTu` (# 0OAF SZC<ddc?3vCXj<޳Gm#2nlO86oM:fvC1h#·''֚^aj_0B8\qM:[6OqYG#ha/+<5G0$qVosuVCd3[DҬr NM73wt0EIR "%UEfڊ v`S*c񞄎_AY_hQ@Q@rA x PUreEEPEP-/]WQɫv% ?Y5nsUv8'8|MM*{=@h".~*\c 7\RE,ku AJ_Uu#ibXdn_P{h[zUGg+:wxzLxr<p |==G{/ i2)f5)7y Otm{52//O޶1o Zd 1TF!;;iVϞ X$o*|ѱݖ<`}Zk="/wu!v"qXgT 1f4αugG-ԆK&@D*Luy 9!ktny%aȐȇ Kp:tZzY\o|GmX$[Z&U!I]rt5i5Xot{i P3†##N@h?P6^I㢏Wwx ; _[5t7@w?Կj(((((((ס* |$ KS)Xi\ ߃kcG'~C?UjQS 2; z a51J(ew?Q ߃kcZQ51ס*() ߃kcG'~C?UjQGS/ס*NC^Ԣh_'~C?U?0UE9LNC^?; z aR=r?0Tw?V{@8 ¶=O]':{kO-Щ[?0UE9LNC^?; z aR=r?0Tw?V{@+%u6uBJrHRN2@ϸJ/Uxkc???F fa b>ZGwgkc???F 9o'D_UxKUݟG#v.@38 :' "_40/F ?C(c7 Ӣ/*N<%CNnzO}???Ž@38 :' "⫌U<7Z.-IWeu AGz_F >:|*MOQP }=* }QT AmS=?[3~^ڹJeOx "_`9}A*{?~?Z/+뗊 PK!Fm{pWʨ3Ul V->:'B.T_j^Cr [n8Qz{fqZ?[3~^ڲ͵el.7\rF9cFr/Cy{h?LovnW62*Y??,m NѦ0gs8.tڹ J? ET7&[QZQEQEyE%Xj\U6G>$?&XNZ'7_I.+dջX7'7_I-މy&q?doO4}ſ?O/$\ xz' > 'kz.<[AMdoO5E-މy&(q\[j|BbC01G]rA nL;( (|$ K[i1,-4{;6;xmbYUTo羗y"e#7?K<GH̎Š}/Eo羗y"F(?O?$Q{'(a̎Š}/Eo羗y"F(?O?$Q{'(a̎Š}/Eo羗y"F(?O?$Q{'(a̎Š}/Eo羗y"F(?O?$Q{'(a̎¸>FZӼ}/EdN!񦘺fuZ ̶ݝ>1Ŧ&GEEPkG+Xĥ؏ 7?0G皥=.4{k H.h׵Eߛ/GN~_xlt#;ɅM[-o=ؚZzӼ̱F]c ٘*$ MBK/e2JKmP2NI(adfbj9kտr͗#՝W^TkטMgQɭC"]6@''D_UxKTF+a0GTQfm>eh̃aW-Ǔ =G݉/n<J DŽi?aG'D_U{Q>ҭ1t*@ V5qG-кIenҸ$!M*~R B*'D_UxKTF+cOLk:(H2N ,lV Ӣ/*N<%CNƬ4(  DŽi?aXԼi]]Aum&6Mѱg8aUCqKcШԀ((ʹ^NuxS?sZB/&-3<ہ{ſ2j߃sa]KKfſ2j5_ck 8Oɪ߻3Gdݏ,?|[C&~>-Uv?f( o 4`MW.ſ2jտxrKfK9qo)cF1Qһ (Š(EPEro&6U[ϧ3`RK ucMZ 䪗$ftW3Z <kC6^I㢏Wwx ; _[5t7@w?Կj(((((((:vM}DV >nqZ@c_n}IEO,YtbOZΣ*;S[6_G#zۆd9mȡdTWiaa=܈deLn dƣRS[6_G#z km6mY\<2یۜ摵k$w1bp xTѨ]8kS[6_VGFMVѼ:*8JZ@_ClqGʇއ~$ ԥC~lG?5eΗ>f\(xΠʧQ{.g@˲F jFG#z?p͗#3O o=8kz.#z?p͗#\ G?5e?ߛ/G(?8kS[6_[Qp0p͗#C~l`?ߛ/GO o=oQE[ObQߧmRB^$Ɲs=1}6>FZ}[Gc9ns2t- e ;o [ tB ( ( ( ( (9_Ÿ#zĶ9$]U*ג:zG$ {+ OoYEj'*,QoZtڿ=6ݑfi qϥr moVkveV.vRrAO< OoYEj')8hjc|d쉵m)w$ yWlpK ЗZzźAG5ݽBI/qQd@ /J O$Q B~"z_<& ]4j{ZM%/L`8##9=x}^uH")u+̰NT$ֶ O$Q B~"m[:[|bo`y2lrcL~Z'%ۀ~^Mn7EӴmc!G#rOIS?[_G$ .o:ޢ O$Q B~"7̾/ OoYEq iH"fB>SӂG5 QEh@W'i<֑vjVW?x±XnzO}???¶( F ?C+bnzO}???¶( F ?C+bnzO}???¶( F ?C+bnzO}???¶( F ?C+bnzO}???¶( F ?C+bnzO}tKkK7#EQEQEQEp^ +`.gj +R0,䞾V&C~l/]WQɫvrw4IXտr͗#ߛ/G+m2K|xOr*xJ[mbٔqyd G3,&C~lM[-o=mkBKX%S!IKc y fغ2W^Z2JnȪ21{s$ Pe%eA*sBW _3(;lzް&m.&2C*cDWo])QEQEWOZ쫍GZ'eT7;(3 (>@%{]'>6^I㢀>o+lW?WR٫(((((( Zj |=k{m%@>Rf:|$ KYبzngXgcp@='Ԭ]Y3і+ޭQPn줒VG3s?.-7ӣ%F0Fl:G<2s}b/$X.$q=/n+'ǡ˯Vd:;ɗ`$ی*c 'xn]?H%xLe] otR{ʯn.w_aw1cjצ|;6t϶s{֭"8U%_BpGM{fA0zzRʯp)QEQEQEQEQEQEq(D}>FZ}[Cc9ns2t- e ;o [ tB ( ( ( ( (9_Ÿ#z?)aW;MJ[U+5c۳z"tk)RvFW7Ap5?Q жAx(RS~r*ŷesKi_oWwi+ 瘁#")Hwuր73ɨq-##"F//9v+ivWhwWe#:n,R&_1oR =Emks$w~P]3%Gm?۰SrZUܹF~9z?E%y|Qc%_ eGUrdzQZsC乓JH$d6omfw{SwJ ' h_+h/uo.CLm!K+ʹm*F7.O! ڟ%%R㑡|ZTH# v@Olk%f7 Э/&A%B U[7SC/$c Fz՞_+h/ Э/&p0 ' h_+h/(?Km4/O\ A%Bӭ-4z=6-,V$j͹ >»j7xX뚸nL;( ((% ?Y5nb|7^F#Lx295 B~"kSEV/~nne "lA[؟8 eF@3tq B~"H5?e ͤ0DEs %0w\A;5TZè-\:B!1uPN$ ? O$S_!Y_-X?WCWS47AFXqI$Dl7llcL{ ~|S B~"H5?e~97Iߧ숻]`C?+ W$ ? O$Soq$\|T& sZ_j'+{߉\iZ{;\Ly09\xN[EVQ@-gP\Cm\.>l9hр6^I㢏Wwx ; _[5t7@w?Կj(((((((WO7`_Wi'֑aɣVUdPP g*&بQOi_6ğҿm'#r2Q\o%$i?JKcN= Q WCϿ>G&>.D>fsh~ ?h~ ?t?ؚw4biȃ'k5G'k5]&>ؚw4r g= S[2&YNT ~?M;}?4hA{U5o(Cbp+ӿoN}ƎD<5_^?<5_^4hӿo39O4?MWןj_fu ֿ{4&X2x9r8 ȯKӿo_֑isNbE5 ҚBnUEU+?? GV k/Tf[Cdyط <3بuV<[AMdoO5fOoD[3}7m3R}ſ?O/$OoDS 'h'7_I}@Oh44&,E$BEX?doO4}ſ?O/$zE`ſ?O/$OoD\ckmt8m/ < .Lg.HtwbGF0;]}{YXn¬PB}F'ooQCj A^$ux"m8M%ɋRT Ȯ+:|^Žtim v>bJgQo*L]\ ʜ | QEAQEWOZ쫍GZ'eT7;(3 (>@%{]'>6^I㢀>o+lW?WR٫_5l1C tojulnS 髖.+d2vCJ?'k(Q;\_ZTsQ >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9QOOϑoesnfZGc6y:Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k)~+Yx"KX$'{rȬW\o?r?{-im/WMk_AZQEQEQEQEQEr!a-Vay3%d In?oK@m+bw.+C -;5?ӿ\*nʲ0ӿ\-;5ݢ0ӿ\-;5ڗV5M>-.PIQ-LCjPę񎙩ئ.T4v7W,' w>REadi?oIxGu9M鰴6̊x?\U NUm71A*GT{KNsvD?{{kv.da%;G"Zwk=㵻Eada%;\nGdG+ Is,IJ/?2K*2GE\Ɖ!R?"}Ck-SQGF?14O%cKY/I|){dz\^bMH-%L, BU{S8%NˢimBm eF$3`t9c؜Qd>g/k=5XRV8Fj ~} -k, g@U8>`餍pI I^U$c Wj$M떕 @IAz2#,.in\< }-+"I s'\G_jXrOĦ ᣍ۰ Yk妇OyݛYE9[{)ڤ ( vp]<аIRIPr=~u ]Mح`hV(JŪYaԱclԚׅ5e{s,J8Q0HI! 6)K; +[ƍ#*vn#+1j-y|RcH ۃ.$e{\|彎[] 9QyF=A4nCm%7HbDe miqenv>Kݙ.~' ezH9o:*((>_*ׅ¸M^:[QZQ@Q@/ 5=E~R1ZIuV^nzO}???¨~0ևy*/O7%Q΃C(nzO}>_?5oJ?TseF ?C* h'aAU9Y{???F Z <kCFZCqKc+c0(Wwxow:(º]s u/- +.+d-/]WQɪ'Qݢ+"Š((((((/zV:՞-g孼ۅ۲3*J!wws_%G%mΡIpau$Ă~c$28b&.T {SM=-K8&8OIZavw|1D< 綷fG6wbpn~iUqs\#m4[iZ9,mD=<[z8Vr0Z={]oM{g}bl/.ɡW-XʤK848#МZ/k=Z}OHZ,UOʸry=Z[LlA&H_a/^n5"[㻞J" fzU42HQDff$31,ĒNI&(@QEQEQEQEQEG-2ֻ*|Q#`kU -ºo]s2t- (((((/(/mlW795qkks7mdh/ie9y㙾h8)\v7'%j>h8,QE`ſ?q/#QDĿEE^nik;L=MSE5Z;AK;[Y!Z7 ͷiŒ8|c+[~-&'%jiks"sisjЋ9}LŤ-h8 6z9=J4I<C"I^so]m.ms!;K!Ŵfr< t:?p{_{-bn&|dI{oRK׶W:<L`sOּ1k:mnHMo4I&d$`C K`]mK:-oM{?-f]êr0xjԮB}wR&ks玠کEM愿@z6z4\4G*lc`YN w;Tx+MYἷ侸#a+y . 8#<W%/ԿP+K_Urdw4QEj@QEu϶]iZk7ɥINb2p+/g:(g:?VxozW VxozW g:(g:?VxozW VxozW g:(g:?VxozW VxozW g:(g:?VxozW VxozW g:(g:?VxozW VxozW ^:bᴴsoj-_ɯH~J`i@Q@Q@ |mۿEk@O7@w?Կj+o+lP^ wR45]C|ؼ <? 5:[h8j"8?& ?@*'Q [D|_MKm5sE"֭xk #HzӥhK '!^+6ܨ[Km4/O"uxMٲ0Hw X=ʽsnO[H,Q"FH=iًoX?V?_G [D|_MG7"aS0NwFG9넲񕎣6Vy>H ܲ?ϵ{;/O?V?_T'-. i-ĥOp퓕&3@|_HQ{C> 2DѲxR1OYd/ [D|_MKm5NJ3\ZCi%ݴ"Ļ`M|n,hÿ ' h_+h/1dldϘF۳l,Vz7q+s uW`ij42 ' h_+h/TSHt~";d#`L&VC1CA!]y6pq\ Э/&A%B1,`/DYxTGF*K|<:Sq+~3֓WiKm4/OU2 V3C4 J$ :sgn2q'Y%ŴҮ%IU .8n22)۰sGA%B? ' j+oi7w6;B8)$NdErEm5 UC9$wߝBbĿKm4/Oֵ_w+2!*5߼*$xKR ' h_+h/O+!]ᡂH ȼy88{İyLydyQ-6'қMh.h [D|_Msh27O>noĖ3igzw0:儒<> ?\׊?r?{-iڃi{_A\ma]7Ka (((((/(/mlV>%E]jCV/ŷ{񟽜e/ }dVROp'_WVՓS]Y $ݧNYY '1jRJU2FA FYYW$ űGVamm Q9xmMB.xb].#a-Yا pWr9cd ?RԊtr2Du T9>+[ +vų#Y#/O=ǭkmْI+ұSNvQ|,v9┑+z%s>KfX^Nܤw-Ąsa:jRV] (Š(( /?2K*2=f(H =!V?"bO/@Ե:le{pm>dszcZs}GsE?'k)]s}GsE?'k( 3IeOН/H,Ύ?'N?$Q >Bvl"::+Q;\_G$ .s}GsE?'k( 3IeOН/H,Ύ?'N?$Q >Bvl"::+Q;\_G$ .s}GsE?'k( 3Ie>hJNӯ4˸#_.&ES1AEЬnQE((h5F5]C& *d9SױZiRKA_jݬc 3}u?0?[) L]owjL4G{ƫzL]owjL4G{ƫzL]owjL4G{ƫzL]owj>̷ }: %6FyV ޻ZY%idw4QEh@QEICap-Τ𳱆9r`p%cOoOȴC+Em[uLcKſ?s/"h9kbv>TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ>,liw{k$z瞘笮79hіQlM$( (>@%{]'>6^I㢀>o+lW?WR٫o "ºM]MrEu,{͸Hdh' 02NONȳ/ hj }ё- Bn?.1a$mkY)ʄb@#i[S,{cgfF$QynKe9lGJC<ۈX޸WGC|_r8  jErDZҝbUh8Aa :+a =OYGޤ,&$8\(U(Uأa 818o{4{w,$2,qƪ$ ˕*+S2-ȞY (CJtM9XQc 7ݐr (TbZ-ǘ$i?y|z1рzbvô/˟/bszU(^Qp ܬgn_ "2H| ؓEaʎs[ 쁄a;Üuѷ/5ē'3$p\h\)~Ee{2tu+3۝[-WgF14E7"/|ۏVRsw[Fh.Hscn ~Gb+jM>f2O $gVU{?gvܓyqݍwo3R47"*'Uœ kV.dӦP6OXXb͖FI8(ӅNeݿR7mݎ3}kNW*R]$k #Z7 F^{v>f$K6Rq$YS pr8 )݅gain`Y۷wj8<;#"C)Rc Iq#.;TсJբc,wNc>Vd |7]jRZh6NL+渒V-Iv$ (Uحmc~5*rwr}S>.A!w 0ql7yo JP #h')վ6|Mm|mG2j,'կJwGQ\o h6ג~ƁĬ@yizl.-n~τa4[Dsda[va̭4z%&vj6pi_*ׅ¸M^:[QZQ@Q@ua]GK&4hz֛=zIlGr/&<0>UU^7 uW'  ҿ]<7@+uW'  ҿ]<7@+Ø(Og:?VxozW ه1Q\* /Jtt¬GGcK_R¬G[-%8 0#UuUMڢ* (9C+Em[uCO}OZӬmJ7Xn6+;aϱN<%CNKSEE`q/tOEQ DŽi?aSaV'D_UxKTX + Ӣ/*N<%CN,`xk@%{]'>6^I㢀>o+lW?WR٫o "ºM]Mrx>KJa4I%$jd4o\* /Jtt¬GS:+Y_.U^auW'  ҿ]<7@+Ø(Og:?VxozW ه1Q\* /Jtt¬GGc?U^Y_.fYEr<7@+  ҿ]9VxozW g:=se¬GG* /Jtt{0:+Y_.U^auW'  ҿ]<7@+Ø(Og:?VxozW ه1Q\* /Jtt¬GGc?U^Y_.fYEr<7@+  ҿ]97,%MQN׺q[?<7@+Ø(Og:?VxozW ه1Q\* /Jtt¬GGc79hі7* /Jtuffax,5 ;ºo]s2t- B(((KMxWW-6k@JD,+*E5CZ <kC<[TV<ӕ_?5oJ?UE9QZ <kC<[TQÕ_?5oJ?UlzHՆuK!tBy7}=:Ut6FTE:haʌ/O7%QZ ՆH'V$CЊi*1|kCSaʌ_/O7%QzRU滴ֶlY܃#a[Uh?PU=sQ_.=Rk8gtǴpA'x^=zMN֊nIs\AIy/0&TA|ݺ~T׮PyL+U S<0'o8'9_>u{-]xʀi&[yf#mZ8XUtkײ_yq鱋c0I%Y)͑iYޢt=N?m1v q3 syvL(C ( |Q#`k]q(D}}EVaEPkG+˻kҶ|]0Ҵ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;Ts׾%7:\$YV=M#u0O+,M=W t:'F"Jma]7Kaºo]P(((iQ`7L4G{ƨL]owjYʗÿLYCx5:?+oo#n2͊:GL3 JvH8BL]owjL4G{ƪs#I"ŇMhe-@Y<ьJ #dz%ʩu`| 68ɮ 3}u?0?[OVGyxP׷Y]Ckwcy[=6-;Ev=kђ$aT|V/&g#TaϮ;5S?+ 3}u?0?[`7L4G{ƨL]owj^eF_uiWe|I: ']D0ʰO QEh@W/0]wŬs!dǕj+?? GVبMj]GQnf .zu޵iFX*ḿ)՛JN^O=sۙz\HG*cէ: :ݗ+lD\ dIgc5tSe-ywBIq%2MW,,I"ViWo,IjwDEeE*ijcDr{yßqUm`֦czXm} zU} ķZ^*79TcV&g#TaϮ;5BZm{ޓ6I1G#j? XRZyĤ%(q#9L]owjL4G{Ʃ_o/8׈ Ɵy&{:tIg6Ҽ  r ms^"jvfV/&0Y čwc׵L]owjL4G{Ʃ;²>g5v-cy"n %$c:L]owjL4G{ƪ]݇\%_"0?[ ^EMrc}@`OpQaӸU ɖǡQEEP1Hn4O‘m2lJ KML8]rrd*FRh\lnָRaM|OJHtm>ګj#X r=~zwb+^:";{%Aj9tm.{so6g$ )S2qWh;"Tkw&d(VfK08]Et{"@fG*jѢعWbFsn3E$*HA>->V(lBv@p8VXԧ,¨Y$f`3ؓ?8 :' "_40}O{V'D_UxKU6z_40 Ӣ/*E`q/tOEQ DŽi?aEޢ8 :' "_40A,?tOЍp/Wu- ;K KP .' O»@#Zb%/WMk_AVHQEQEQEW?'%Uj+*E5jQY+6Mp*GqWvF8#H.1W=_[YCYe?1>dGq.,xF,JYvnA8?6x˥οtW'K-&KٴZq,,*ۤ%gj^"V9>y(LupNhw{Dw4W4R\ ຎ4[2pGOy$GQR))2K t8['R۝xR-\ldY 3ə^uRTt+kHl.&y`YQ:F=[~^c;MPyhu:8H4gIyCZ+׾!͸k+ChH,|4;qv }᳻mSV;|Ę;y $9ٽ59KkhԞ%.l]Bd5ݴZz- y210hgE(if_SWjW2$K$"BqЖ~A#fqUM\:| _Opc6)vd0y*"U )5hOEQC0۴@-Uv?fFCſ2j5_cha̎?|[C&~>-Uv?fFCſ2j5_cha̎?|[C&~>-Uv?fFCſ2j5_cha̎?|[C&~>-Uv?fFGZ'e?ſ2j[LNh]Imyhr: ;QEh@QE+(l/qep27eqa)+^ZD2 e`dӶ2lYyxR3OK$`(>G888n'hDPU( >T>mgwmsKɧ8R(乜@(Hnɤ Ԡc5Q+c|EO ~+jieƠ+k5P\$]a-+2 8=~;?|!cf4c>xq)E#An%nu$>Bp=9Ey*}}F p J G+ttU-^鬴[ݺy$!IF~ gn@š|-l'0Hr-ٍ9ϵ!CCЬn5wW$g*.Y ۿs!nIrOZ|ek5_]^]BxXaVK1|{ CWQFhK)+)+[M4'DVV)?wy?wyÜq.pIZur_OA]Sw]OA]Sw]>FhK)+)+[Er_OA]Sw]OA]Sw]uW%?wy?wySqwVA2E*2Qy_!] SWTUl7Q!K3<#E'dM\ca7shBx;G?R kϾ+5G&O"T\5[]'}^.CEs?Q >MtE{ƨI}oWj\&O"TkϾ+5Eh{]'}^?5[t4W= >?Qp:+I}oWjMtE{ƨ sPo_JOMtE{ƫ>Z>!e<*wڬge<];ggp;( (>@%{]'>6^I㢀>o+lW?WR٫(((((( ѷuW3=_V?6{;TQEbhTK/K#S"}6b0A =Պ( u)[]B+m6p9<4;;+kd@B1* ?JEDYCٗo!s*E42RB"_7gs\ E;*i,$K>@1T 9j$($[t7} qWpi2!mn%2"_`s]gӊȽ{[_k}#Dor%K( |kPi5f@vm% 0m='zw٠|q}*Z) iX6@ PbQ4gj7b8? 1~gSEOt.%01k1 TdV gjgC#Hv~SؒG5-\,WZUFaʈx8EDT@T`R@X((y"] x?_{ǟ+X\5-ºo]s2t- B(((|_\v] Φ7ndEÀZ6VSD?{{j\W:+KNsvD?{{is򳩢oD?{{hKNsvth[-;5?ӿ\+:+KNsvD?{{hAΦӿ\-;59roD?{{hKNsvth[-;5?ӿ\+:+KNsvD?{{hAΦºUӿ\^l Y MnAfbxbI=&thMMW]֒ɲk+2;q!\Vԣ.i%ޫwGV?u+[7\1=Io "ºMJnȨGbj9kտr͗#3*տr͗#ߛ/G(adbbj9kտr͗#s01?5oebj9kn9YؚZz?5oe>-/A򿴮Z/43 UmQ8=jնiy5Vyj9SPt`xZ|,M[-o=ؚZzׂttu 0X7nOci=+(xg@ 䃑EYbj9kտr͗#YؚZz?5oeE,OM[-o=ؚZzۢfF'&C~lM[-o=mG3 #V[6_TKQ|awjWZ-ki4OrD$PFzZ돗JajbV;( ((% ?Y5nua]GK&j ȏT_sXErsI"Nq Zy:UMNQvk[V,pdGu0W i+yv9;8'H>"OX&จ;IaMvmj h%ˉbzQ۶)xoL s+}Uݙhlf==-_Ah^8B}sV}V-w-s0#V&v]'R:0 ߻ϙ.,lghpXbߵ5[I\^Y* qbº=O5eđpX!_ rC/O_MR40B}$U>Jӭ,mGn-GAI?Y}+x PW_\%_"-(H (9C+Em[uHn`*FQEQEW u^6+5܏٢KtXwyrDˑ˴r >#Z\Csgcr{B|\AM&o_ 3Z&jo!W >Sv:6oov&Kyb&w2,(h6*IFЕ]G÷1ZQt%ʤ1qrAdAOŤMl!m\ˉǼf>0d K0S)QEQEWOZ쫍GZ'eT7;(3 (>@%{]'>6^I㢀>o+lW?WR٫((((((OUBM)t.\\ƌgPwtޠ$sRjN) Q WCϿ>G&>O"39O4?MWןjO4?MWןjM;}?4hA{U5U5N}ƏM;}9s3CMyƨCMyƫӿoN}ƎD<5_^?<5_^4hӿo39O4?MWןjO4?MWןjM;}?4hA{U5U5N}ƏM;}9s3CMyƨCMyƫӿoN}ƎD<5_^?<5_^4hӿo393BS2dE G>>0|ذ۩=obiȃ'k5G'k5]&>ؚw4r g= Q WCϿ>G&>9vcc}f>sK݉f(TOjOЍؚw5r#bvϽRVw0e ;o [ t@v)(((}z[/d i5([[kQ%7@`?`xl7E /,%L6H"'tNr^IqW$vR6'b_7&V%JovQ"y>*-CWK}m>m-!)ˈ̌r_,W$n&z$R4I,NFCЃS4TE 0)jXטQEQE%Bo5W/ G\y[c7W-/]WQɫ?}kg} >/#]WPIj&<[Ӛ8vV$ ? O$VV,ޢ O$Q B~"E`AП/H OoYEzS?[_G$ ,REORw&kY݀rl8U~$伂6(0J uX2k_ OoYEj')kjRjIc-=5.<,6ϙR29z}O—בkAE`[yYsƉRl=cZj'(S?[_M]}H{idbbVlА>Qm$ ? O$Rzޢ O$Q B~"oQX?j'(S?[_Eޢ O$Q B~"\|T& sZ_j'+{߉\iZ{;\Ly09\xW ɖǤQEEPEPGjqb#( ^Ik?ߛ/G.+dջX7S[6_G#zޢ`?ߛ/GO o=oQES[6_G#zޢC~lG?5eEO o=cR[_ky=䋨 8@"Ӏ:z]rA nL;( (4O‘m#k'Tj(F[jW돱V7PO=q??[eޢ?[3~^ڑV!gk<ַ;@V!gk<ַ;@'FΨ5Cٝ@ k11Z͹_4:]m4S?-1pIsK~?Z/ZM{9_M0ZA$ ٷzӓKӦl-^+hTe>n ?LovCy{hg@MM{[f--iH9%WROXΨ5O?6!|1oq:w!gk<ַ;@V!gk<ַ;H +3~^??[ +3~^??[ |Q#`kZ9hOK|nyW\c[t񞂪;[EVaEPkG+gI.K yYHMtE{ƫV9ÔI}oWjMtE{ƫV9ÔI}oWjMtE{ƫV9ÔxL5aoM2֟qob \?r?{-k-Yma]7Kaºo]1Q@Q@Q@; 5Or5V,?}ſ?q/#T'?*GsZ.;?ko4OK}ſ?q/#VS/giggg'Xc2FzԕDĿG[@M5n#*r7V'\68lg ch~-&'%jޢ?ko4OK}ſ?q/#VVZxPɑ€QXz~I[]BA4s/~-&'%jֻ5/49>ƒQ3^[Di ULך2h8_ _F) _ _F~-&kF0U$lG VyR "c~-&'%jޢ'%j>h8zx$G*91 08{95~$\6kkm7BN|K4hAxaQEphWL`h3>bn(^>^vRA %DN ]@FZŵ߈ń2M$͸DQ 69l oOv ]B,Jv-[&wqQ:t;+,_g\}r$ort#cS hֱE46kn|1$ cߏQ{K& +t@kQP<$T+E"IlNє"gQӧnvO477Zxby pAmC+EmZ[JѮ+9l ^V$~[}=ⳏkyf ?9H1+' ^ePʖ2#m,@)! ft{tK#tDlK8L2I<֠i13P YP mF#TgS f(m.G?xHswwYVO2fbm );GCs-?4yTK<ȆY 1S8g=1w6f JrR]u`12cMRȌA>x.Ş&Db6ɶ@R<'?/9Go_D㲳Tk fvU`ݹI\`7O]Ŭ\y,Q#ޤp@#oӬ/oe+y.ʬ$B9koq4ƯH[ٖEe>w`"oi*@O!1Ck,uO':xSr`2˸_y`;KÜU&TrM2"G8S;FB; bO0߭[A$۟12F{禄W~6.;g&I5;2,>Uh#}+T.7VeVyBcW%UN+:KiّoX2v6=1Qj>DO# ǎ)05] ru^1MԱ'$%_F!wa~RH H^)[ĚbHwȶs3ӂY@vQmK[UM?tۗU 2zlU=Sf"1a(wm 2q6ggޗq^>!EnRFB7i;y94iZj,D-^`*H' 0@#/p5$z5[v@ ҡtv!4V-hv9O֢*K |Q#`k]q(D}}EVaEPkG+FZ}[Cc9ns2t- e ;o [ tB ( ( (9_Ÿ#ԴVZ(">nK S¯w5YMٔՂ6X (㷑Z[q$BVx ܶsmiEyWyل;pPŻgrַ;Zv)c >iGOT6ED/eK|0mrka#Ldyk9LF@YHW~GI89?Yѵ,Og/LyU!F#x2=w+`G&;/xA$7D#;h rx`K3OޅɉFm;syD9h/f8f7qYBIk5巛OVo㰩5}7]Kd"Ovq$u#^4x):wCn੤sH9..u2%(>V%%VF8fsTմpe%FTQ31ffWqE\6NiL &a'Ao-٠ӄw),cnr dq!p:9ȿ[|T& s]prP,?uwv%xKA_jk~xwT{BZVk٤rI,N9'_*ׅ?VxozW 'np%ᴵ˫8X9t19\(B((((((((((cD)[Vbh_#+j۬e(Q@Q@Q@Q@Q@Q@Q@Q@q(D}ʸ>FZCqKc+c0(Wwxow:(º]s u/- ((((((+?;뙧Gu 5[Pba$GN߭zr^@h=SRgF >7$D*;?LovCy{jiݳOC:#o.Eb982= ouRU33Y+=OCy{h?Lov J3x:K y|8Y?8#M]9w+$rD$كd.HCv?LovCy{joI,[Kky8Kidi @EU%gOS6HK'vbPX?<-C=~?Z/KlKV) `i|< #6RK#.#AA+ƢCA< vsG!gk<ַ;Vlyf3˳lr[ . htr(u##"1??[3~^ޢ`ַ;G!gk<㵽E3~^??[(?~?Z/oQE?LovCy{kz.!gk<ַ;[Qp0?[3~^ޢڶmI4}51%O1o^+kGZ'ewմv3?/WMk_AT (((dԶI9v n*[Fqުyj&Uȋ,mzT4j\Sv9O4?MWןjO4?MWןjM;}?4ir!3CMyƨCMyƫӿoN}ƎD<5_^?<5_^4hӿo39O4?MWןjO4?MWןjM;}?4hA{U5U5N}ƏM;}9s3CMyƨCMyƫӿoN}ƎD<5_^?<5_^4hӿo39O4?MWןjO4?MWןjM;}?4hA{U5U5N}ƏM;}9s3a Miض-!-%.X"8=kz=R,H`w~5z+QE0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (8KL=C\ }6I&Xbe=;[O?$WyE.T;|s=y9_ (ʂ}/Eo羗y"(Avp~o羗y"7?K<]r8?7?K<GH9P]HO?$WyE.O?$Q{'+Tg{'(|s=QG* |s=y9_ (9_ <}/EwQʂ}/EUm3wͶ2X#OKHǔ=:j) ((>6^I㢏Wwx ; _[5t7@w?Կj((((((([_WS\ua]GK&Gsf xbBP-Uv?f( o 4`MW.ſ2j5_ck 8Oɪ߻3Gdݏ,?|[C&~>-Uv?f( o 4`MW.ſ2j5_ck </K;0Soiopvdy8?jo 5g%YU 8Oɪ߻3Gdݏ,?|[C&~>-Uv?f( O m}^ 2CꨮP\ݯ\}Es2t- e ;o [ tQEQEQEQEQEh_#+j۬MC+Em[u4[QR0(((((]ʶtwh6P⎶^mx ֋i\Cd+[t.D/\S.w{'.oΧ%jrlA)"@0w28 pFsM=YIA-gKziw @;ņl;2]/(M&IhX|ms(2uOMov}H`ZT6Ӄ^*G5_6]:Wm]DBA]DCZEy|z%]N\I b*az A7:nl1KBI`ʊDà?r>oVo;(aEPEPEPEPEPEP5,?tOЍs<\BJᮇD</ְ؉nhQEdQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ |mۿEk@O7@w?Կj+o+lPEPEPEPEPEPEP^_j^/ rK&hԱzWW+']Zӿ\-;5ݢ.KNsvD?{{kv.KNsvD?{{kv.KNsvD?{{kv.KNsvD?{{kv[Ŗ_o+{#f;Xad\'"Zwk=㵻Eada%;G"Zwk=㵻Eada%;G"Zwk=㵻EadqŘީ M[XuKt6Ӷ <TwV4ְtV8+ Q[$Br+l5W?/WMkQEQEQEQEQECO}OZӬmJ7Xn6+;aϱN<%CN~!R?"$ݱնCXsE DŽi?aG'D_UoTmYv38 :' "_40( DŽi?aG'D_Umy T\djJ4 LN<%CN?8 :' "niIpƥݏ@4<Wj<8u8E01?8 :' "_40}Z=܅#PHBK'4M#+ Ӣ/*N<%CNа5)8>В RHP$U${FN_40 Ӣ/*.i76hդ#f\,IOC @'*q/tOEQ DŽi?a[QN<%CN?8 :' "VP9-f,iʬM;3 Ӣ/*N<%CNޢN<%CN?8 :' "z_40 Ӣ/* N<%CN?8 :' "z_40 Ӣ/* N<%CN?8 :' "z_40 Ӣ/**GiawW2j;!7vDAWqkW t:'FKsB($((((_r^_ik7<4\X2HXNC^?; z aNC^?; z aNC^?; z aNC^?; z aNC^?; z aNC^?; z aNC^?; z aNC^?; z a|YN;;iWwRgd0^#' N'(((((((((((ow:(%{]'WA\sa]KKf ( ( ( ( ( ( |$ K]Uy׃PGi7U\܀q'eDh'%j>h8+oQX?ko4OK}ſ?q/#Q`7'%j>h8V[@M5ko4OKX .| ֯mz^Aun1(#h+9}+G~-&'%jjY|0Mlſ?q/#QDĿNZ_xDҮu;n/I\laEc9[uDĿG[@M5!V[@M5ko4OKԬDĿG[@M5z_ _F~-&E`ſ?q/#QDĿEo%uIyg%zvm{k}キ 1sqa oV؉nc@v++l5UQEQEQEQEQEr:'kĞɊb5S!9D2H;O͹saȨeơ-f1Hdf( p)prkI%ZJGx1K}N9mELm֌f=ڱFyx6omjK$ c2!;g#Vgc*$Vq,rl0OE`z0AH% X׌u<a5KC9Ms1sח1db&r]Vxr8̜xaazgy2Fќ` g]=Q~v&Ii[i(ˡmP09 ǎEI7ep|"B( AQEcuםm"LϱX.T6H 'J]]3ɺX.F]`+hI^#m"z)r*J< >wa(OY<-$Rq̾;0{Z4 a ڮrƺj(Cu>zei!@3ʒwMP@5o^²&IW`D>YPpyctP`yKsgMZiJ,-mV)2E9 Rð-#8"H]`$¦MJEPdQEQEQEQEQEQEs^<\BJᮇD</=,?tOЍk QVHQEQEQEW=_AaM;Ka i[ Z(juKeh@JU$d?6Ji1FRE;um5`eԃ*~BGZOz,z^/^XњktT1˴=62FqO~gErD_%?jY|Hwٿ>m x]Ֆnme{6kAUeK,2dPwWm#MK->iMAo%%7,=.5xI9,B6ӈÙ$`r9PAsea³p)<ȱƀ;=voiqw%ԑS#j푟Znm5恨[[.tI,ACI;-v\@co\gI\V}͵K;uYdxˁH#-ZuX#&n'#0c IJe\MF9;J+ZU b fȇto9bvryf͸Rn%~PF6n>N/oH/gy { #q1xdefX%pYPHd~b\^d$i-d+2yX`aA8'5_=@d1-E*7J,{F:P (QkpOR㎝k=a %9&KU޹y:^$ )].WyI%?LovCy{kW.-b N *aq p{jv%#3~^??[*nQ~?Z/\ Cy{h?Lov`ַ;G!gk<㵽E3~^??[(?~?Z/oQE?LovCy{kz.!gk<ַ;[Qp0?[3~^ޢ~?Z/\ Cy{h?Lov`ַ;G!gk<㵽E3~^??[(7caGs HsuBqֻ@#\?WҸk? B56"[QEY!EPEPEP\4-yMᄍ&x]-=VX–Bo!FG^A٪څ\X^Fb7ܤ`++O o=8k,Wϛ6q$.BɂsR]4iشѥ99 ?ߛ/GO o=0,2 Ihf~]!"snZ z {h:cx "j#z?p͗#ѭfxi+$2fıq{z Y-]]\[tz+xK|8vu%C=ʶlKYظnj麝c ;`⥺KجQU,~I>ÓO8b]ơg8`UMb6H`s"l1". ~Cjr# 9d ͬ';wR_JiZtr3do-qs=\j%<1(GGc6}7oy2x2;֯~ vxeV* w$uSHUm]f\KsGı&yfXU~@A:CڲI "rttɑهHuNPY eX =hyHFhXxݏ=+?ֲF [!f}|޾RH.P[xbȲβ́6n?GL*1`8">ךa/)*ބ9AzJ+7c ZV6s-Zys~x늜piv(Bvgc== sZ?u<5E!Y$eFF $^jVn<-[+.,If#,:< rr>A8$ïKaeI|yR;9?FȾH043d)bg#8 +{0C6'Rv(hityIGVjvSZ ]CB!U1.I=r9Q궭qA+3NӎAC\ɳ`٠x9BF2gY?2XlsҷOd27^&*I㎝ $%&ّo%uIr6_ 7\W_a oUas_A\ma]7Ka(((((?? GVկSn1?8}UuDGح֗+F]>lN0>Q88&{"`r"Mze&aymI (^8r灒j̚4WqC?Vx DTO1ٓd3E]H%X /S~srskWMmVMa;`Hs =jyqt ǜcc2 <閷TQ3*NX a)g.C~}+]PKOѭ7[!|)Y YUdU0xpp WZ'ԝ(6) qkmp01ܱhv8څQHaEPEPEPEPEPEPEPEPEPEPEPEP5,?tOЍs<\BJᮇD</ְ؉nhQEdQ@Q@Q@s5ӿk MjYeZ[N* 36OUQKr<7n8=:ѻwKC'_meY$WZ( n^`e^6⋋"7kydL>zogq{3Co-r׸;k68±ҟ4)* BcKMl}սNCL?t}2 k+'fbdvRGN}c^Ҭj#Cq:)v*0]-sc ֺ*^7)ǪjoZXmyMscӽn[mlr@|9<UCu V戦t/P̄U$Erwr=f#}+9%"QP; p5tkɮu^)ʝ6B 4HO\Ð (EJw( ((S7aFK?m\ NsC#)^ 4gdݏv×VQVǦ}m q(bIF 'dݏſ2jwE;!]'dݏſ2jօ|E[ Kkh-dGo*WQnd8SixZ'eZ^2?|[C&~>-Uv?f[@-2-^->-Uv?fɪ߻3Z^-/ D̿E>-Uv?fɪ߻3Z^-/ D̿E>-Uv?fɪ߻3Z^-/ D̿E>-Uv?fɪ߻3Z^-/ D̿E>-Uv?fɪ߻3Z^-/ D̿E>-Uv?fɪ߻3Z^-/ D̿Eo]z{WP[ILE0UQ'dj~z7eTB`ixZ'eZ?[@-2->h̓_A\^<[mEw&dn>:{g</ D̿G2 3/ D̿Q}B]u:n-)o^%*A144YEQLAEPEPEP/HRjp:+jFծ)KX%ح+Ds8;Tz'WaHڶ.H+Zǥ4#dia=s31]EgF/;"|2f\?%n} z.}9bJWeV0@Uq;?kv *"*2@zXˣxnY6M.q/FLWWjX;q:tQ/9iZǶtfx{{8.$D,K7$ =q]I/ ^2ch\޷um.ȣT+urarǾP~o$NlYY.##x\ݏZfutL+·~wu?$R$`n< Gnd|zC"6d9',pxN/?yt61?ۭB-R5%+jfxCeKKkH1G.Uzu[:tIͽ*SJX61NjoIE0.T{s5SRMU;'&dHFPpw }F9%u=jQXk diWp%ѷ&1/|Ac=|VrEPHQEQEx(Iq]}!\o:'6"[(B((((((((((>6^I㢏Wwx ; _[5t7@w?Կj(((((((((-Eu;2Q6/$;6ZF]'(K?u"T  T߾GF<\LW9}:˯G$Xpg8\sşHkAp)xKA_jݬ/ "ºM[lQE ( +m--5 O4K]w!.P P ot_Zv]JXaK2|ڶm8P ,(^]{xKshyKF`rqFONoEN3s5N'c2܈ۧC[N}SŰ_x}ݧ&umim"%U0}EW.|Iu/M>[d0$8M5/O+$ӭo˝dG_617\gWA-@I7*K hn~H]lM_}C0hs\KqΥN p3g5ycY0M1op>_'vQIبQHaEPEPEPEPEPEPEP5,?tOЍs<\BJᮇD</ְ؉nhQEdQ@Q@Q@s5ӿk xLoEm03:udV*YT%/9j䁀OҹѻVKR) ISsd䍬U>3}j:5obX.8XPuWwo H]` $ ǂW6W :34i%|$ǘ~IiYWzd_+#ݵ*K%Wg!pv2Gpyt92_זC2ڼ9j_=mtɺ-_[ sۛS^ H8*,j z{.KoaÝ|Tڿ`:sj7è%:068݁s]E4LN9tIwī02qW(op(QEQEx(Iq]}!\o:'6"[(B((((((((((>6^I㢏Wwx ; _[5t7@w?Կj((((((((((FZGqKc+c0(((?? GVկP42}p|[ډN?btkjiiok."1N1G^}r1beQoZݢ(.aY>qN;q[7oRKeu"E3P0HKy %~&gGmp.%2');6tU zU8im <+k&R6H->e{F;)(休Ȕsq9$q)}C%9]>KVb/#=9iߵRVYIpʒKrywlh1ӷ[[[[xuUP}sHP19mtlNa}GFK&ei dFV}n;Od⛴ybC4ybQ#ff.o&m)Üqڷ.4}2:m31qY47H#mh)]qcZIǷo!i멀'b[h&I$W1yr0?4@d?tǴlSϒ WKuo/ zw:JT2EdO֬}E9,pGI#ҋZ] |Mz[[kª;gN3_sZOwj2>Up~_~U}ꮵk lg/X4$[ozӷIBŦ`N{=KyX*K ( |Q#`k]q(D}}EVaEPEPEP1He$I ubs~Eb]j88?mާt(4{ ]K(Q1czXƭdXiv%KRY$€~c+Z ]f&"~џF%z#n=z-:y㶈+mA$4Pmhpek`7Ă%A rXÏCC u[cuZgG9,pr ❕r{Dr,YC̅NACێQQap Gd}v\[Kl/ BEݱz0rJx綾e n%7F9B /e95{#zqq ahh) 8'?".^O*1Q6 g{~6?]]4G`AGR*Ke?//mfhCCО:uz}r%Hɴ/icsdcۻ$5E:H/av`n^f;ID$YyF1ZWI6D6噥AX[_^wb'sIh\Ciw؅0pOGNhB8e HRAW1ImWB?%-"O*W}C9A@sHbt yᇆ˕u2X S]{QPXQEQEQEQEQEQEQEQExEqa +@#\?WҸk? B56"[QEY!EPEPEP\4-y7^K{heԴ92A# + Э/&A%B57A%B? ' hzg/(c,3]x4Џ h&UP̟ap 68?CE`/O?V?_H +Ox2W)4`ʭ$9K<2Z b$AS ' j8ə/hH~_c訬A%Bo!>.Sp#gϱgfRxkAu TAw  [D|_MR Q[$Bľ{i.e3jL%F~ppJq8VIk (((((((((((Wwxow:(º]s u/- (((((((((=!V?"sşHk(?|IcAycCp5+0Uӫ#J2 zO4?MWןj{:A$o`6?Pbi8"yj&Tyj&UbiϿ>G"fsh~ ?h~ ?t?ؚw4biȃ'k5G'k5]&>ؚw4r g= Q WCϿ>G&>9yj&Tyj&UbiϿ>G"fsh~ ?h~ ?t?ؚw4biȃ'k5G'k5]&>ؚw4r g= Q WCϿ>G&>9yj&Tyj&UbiϿ>G"fsh~ ?a:Ů2kLV7I+c4 ܨ̈'ctN}ƏM;}j ; ((((ј.92۵Oj]GQnf .zuޡ?? GVղe"v}O{W9/R]n[* xfɠ鲕S+|ӹ3=)!C6vW+Y\ҘIYd(ݽ=G%1Kw1we9`֕ihP˫\]1RFӂ{*&,-TgV9ݱYC ]Eoq?_ٷ?gvn= c4+u)t5l/dbhJN<`0m~AkiڕH]cƠoe,}w6v iifIB{I-on`q+4$2 y kyOpחƵS]Y@cq+2]T(䓒sryMJ Wͱ%s0BaUOZ4koyw?m${~)o4K[-yLVPl2<6IK MqK)ne Hwb˞d%Ԯ^zVᥤqq\2p wcŽK`qZ 64 B# F hvW%'fk?Xďmks342‡-$*FؓG ͸f pN7i)-[6jI̙'̒Y%v㎼qQ1ªݣn,eKV>0pI /-D&mdk$RB1#MʬORǚ-KO#w(ޯ*EY,వKku+g$I$I$rjzNХ{jQE!Q@Q@Q@Q@Q@Q@׏?WҸk? B5xEqa +@#Zb%EUQEQEQEx@SNk{ƿšwC5&Tf,QcXl09F8ZQTr>S{cKks3V[8[Čg'h]ݎaKkPi23C]>ȡx# ))CuWr&7 ]PWz ۧ\}QلiVxbU!lH`ۀ*#1|M+U՞Vj KQwvpXORO?tXz-&kKV?/ mIE+f?CRL!=BUk( bGFvK˒>`F3cBvl"IeE9QiZcCY)z!E1a:Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕcizrJ=ÈL1X۷\WFdx"I.+urO*j̱EU(((((m]nj& ڥѭg:ݼ񴹈E'x5!R?"x"Xq6EbeWruyV;88V,L|PpJ~H=e(؋c-U dx=qIVjqBksl|ОY8j>`0vg= [Fcwzfe!m9;vBvGVmp~a yǮj״Mi:c@֌ ri(kK4.fPЅ69r3]28E;J|8`p3ia|8x?M߆jX Օư9U\HTO=t**+ZE#Aa(.M” # /~-xIdH4ci ptcV."uY$Ivx񎻨66N&K^;weHL?C#$qOW5O-ƥir[`ܱ&efo<@|Š(0(( Q[$BI.+urO+XlD,QEdQ@Q@Q@Q@Q@Ue:#VkKKq.aonX (qzUtbW]i XQSmRڵޥ=\iwkhxc<1ŻY\׮D!H9#x3+(ml[m ]\(ese#yFVoaNi+ ("ҥ%٭#d<0O=ㅳ5 !Ys+C*YBvwm)XnbmokcG.ëuQבZռRtɮgW`~@.7a*}z-~lZZH ŗ%\q~;}g-ݙǓ)׾qך˟wHMko6\,L'n ```el 5e<7RV9`F=яCNqqkYc!n!kU +m$?b`|k^Kd+iiQXG<3VhSC 5y;VYYr }G,sKVu:Z*us{X]kq4*#lHϠU~Vv);QH((((((((((((kǟ+X\5y"] x?_aТ* ( ( ( ( ( ( ( ּ>uoe fB+,n7 ;l@%> |Umkv-5FCnAɕ1ǯgak:y$^uM $5x±tZQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|JnO|mۿE}?WR٫WA@Q@Q@Q@Q@Q@Q@qWCԿt+Jn̷YqWk\PXۺl8G?V?_G [D|_MXu9 WA%ydtխYjZi`/O?V?_RV{WaE:1y0c6kgY$,1E2Z{'+|QiztB%OڌX)&4`2Q >KHwf'Hx)⸇B; 2IB1}t?Q >]V) V q*4aA(VǟdwB,M<;BیIkI}oWjMtE{Ʃ俱|Bl#f@FF6'f<>I& ɣ͓ 8ɮ]'}^?5[-cd`H?OݱbMvW`LTOC\r G)e܅,A2I'5kϾ+5G&O"T[G8 _h!\-eQ.1֦|s= >?Qdf'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Eg3W{/ gq*9Y f`2Pw:t SSsYEtP? Bf"HuO5eQ@$: ?!?L?$WAEs&k(T3\_]CЙ/HSsYEtP? Bf"i: :(d0!))ulW?g%YU((((((((((>6^I㢏Wwx ; _[5t7@w?Կj(((((((f?(zmt%WUÎF"`0:d&EswhdgbLt/;\XTk5$D[g>[ن-o2֢عV2SÚlMDQy2o9|0I2xw}RĻl0$IqZtQv/tW7IpTq(8jdѴ%d2fTv*)WcZEaʻgC;;Y"2H8ݘ]N=A9(xMXdhdDUIUeCmLJ4cKw V9eb )?r=V.Õv2dH$RgghRk B:Ɓt<"dICLA-Uv?fɪ߻3G#duW!5_cho 4r0G_Er>-Uv?fɪ߻3G#duW!5_cho 4r0G_Er>-Uv?fɪ߻3G#duW!5_cho 4r0G_Er>-Uv?fɪ߻3G#duW!5_cho 4r0G_Er>-Uv?fɪ߻3G#duW!5_cho 4r0G_Er>-Uv?fɪ߻3G#dIo%uIp]z{WP[ILE0UQ'dj~z7eTB\U-ݓQEB ( ( ( ( (9 ѷu\m|CԾ-yZU߲MouuӾq:~?Z/c-#E`ַ;G!gk<#7Cy{h?Lov7Cy{h?Lov7Cy{h?Lov7Cy{h?Lov7Cy{h?Lov7Cy{h?Lov7Cy{h?LovLqGys4QƮc'pI2q*yU"n49hò犥~?Z/f]O{pZ F8xJjxsCK#t{{-.ク|~?Z/@hPSeU.@18W3~^??[ +3~^??[~?Z/~?Z/~?Z/~?Z/~?Z/~?Z/~?Z/<\BJᮇD</ hQ>&c>u2D9G{D</ְ؉nQֵFX4:kyoE\ $Ga?^-KJ`i[&M^-/ D̿[TKſ?s/"h9kb9rKſ?s/"~<[}cgݵiOen~矻EsF?_EKſ?s/"sF?_EKſ?s/"sF?_EKſ?s/"sG7>{xGhl丑c%,U6gֺkn2@q$ğ MZ^t!ZEL(oWCKy{+ w"Ơne_\4- >Bvl"IeEeFG$ ?'N?$VsFG$ ?'N?$VsFG$ ˃UV75"Mg4o;1?%\sG;TdOН/H}GsEkG;TdOН/H}GsEkG;TdOН/H}GsEkG;TdOН/HGW:uΝy]Rw 2,JpyOZЮ>_*ׅbqQEdQ@Q@Q@Q@Q@ |mۿEk@O7@w?Կj+o+lPEPEPEPEPEPEPEp>\ 5,p%䞕?zo\":w=#޹;@Xc;~?ӿ\,tW1?zo:z+GNsvDt?{{h =#޹;G":w=?ӿ\;~OEs?zocDt?{{hGNsv\":w=#޹;@Xc;~?ӿ\,tW1?zo:z+GNsvDt?{{h =#޹;G":w=?ӿ\;~OEs?zocDt?{{hGNsv\=m?[#h_nupynhpN kٮ]2AIQPeQEQE%WUXqWR^Zb|ݔLwjlPXۺIy[2Fqz*Q%rrj:ƷGO߲EhFayX?69{gUS C?mۻj띹+9._O㴻VLIo @g+%0rAz%yI$Dqn-U,$wA'b\.qsoI$QK",23@=RZkew f]$e@9=-[JrN{H:p]_[f쏴y @>qjڬ1޽[d%wo"RjH״w5ki<U5z9U-%ISpGA)NU,'◆PkPevJMv((cu*wrr`AY6j$H?9w#9w ٧<#tEgB۸7͑Hm.%Z5Ԗ:Nv2Fd`}V9:ZMn&70[[+Pl ܨ:o?nװ&/Jy{8ϵ_HdцUi[NOfֲ6F3}(,~{z#.} "Mߐ ]~PG]UF`5 +azWi/Gg[[Z)Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@׏?WҸk? B5xEqa +@#Zb%@m+bvSY.fXԷhp 3x57'D_UL֣ܠ\Tטc·^,pinK7r3ZYuې s]'D_UxKU*ʺ96wgm5ΧlY[}&Kty16+}KZGs~o;1n7Y*x Ӣ/*N<%CNoHoƹhskuPٺ'*C@ #W<֚}ZDÐ 3]GeiF]"F88_40 Ӣ/*1A ѣl:x4y9=ż=OF"y&UcVDeHi | w DŽi?aQO"Lj ]]VKXS1ׁ{hM.pL6$ں :Oآ* k ?)l5=_AaM;Ka\:>34vV2 ^b$$`6g(Xcq wlAcw$ۄ9v r+֞=Ě~oa[)a/;1!E,xQiyq$ nm\<ݱ%<Cc;GoMk_Csky7srG (.Sí2׈4>5Ĉe]$BI?tWG5Iq6pGnks~^9wLE&ӿ]Dx/^h]sMɧ4%Lj/\KIj ﵲ:8Mk4&i/~9n]r\FH*)vXi!k iq츂@]!vdbBg&#2 ^uuӄè~ʒ1.A pEzVtcog+ػOvbM}|cy?48_VRMLasI]%0E6ZO>fh†\5SW \|T& s]qP,?u8n((((((ow:(%{]'WA\sa]KKf ( ( ( ( ( (9o?Rq.4ViIHci HѢڠ&xPK ay_K-Qde1]Ldp)gmŬrZYC /~r7Һ071[z{iw eou;󰸺0(E*FeԎWyY-%er(p7[:Ͷ]s2P0!)nvFįox%g- ^c.3 2P+Bq[V!y|1>ua5vyTSk!'{W''5n}#Mtj [g<2e=엣c{(eQ0Gc{R5/u7H-Go;\[GY 1$(ÉP:d &qv-#x* w@)]ܢKEr-A-k=>;ƍdX avrO,O&~&T5FgkK.w~Sb{ѻ=/GE`Y^^e6TqycL} 5~{&{۸""(H'M&OͤډD/hVY\"balHWݣl+O~OEh#`xr}AؑOtvW%u m&GW p iLţ'q†4,@`{h16guÝ*y<'Q\Z-=#Cvv]c*p ߒG]hp (Q@Q@Q@*ԼZG\O ) ѰQ䎵]>ynOaxRVVA𖹩_yk66)IYB_1`0O\ޝ%Z]!EP3=_V?6aͨZJ0G ) gPG%WUXwzՔMռ0+4 qa?ޟ7+6+ \IEQJK$$x'rq]sx$z_؉G1-ʗ?>8M߻[tRv춢fI@is<;ʆ#p 10ϼ3;%u[;ipL \xʏL[x$YbA(˓hV].r q9ZUy6;}WqDgd, L8Nr `V^7vqk(9EpA*Z$*(QEQEQEQEQEQEQEQEQEQEQEQExEqa +@#\?WҸk? B56"[z w6Ҷ+R.FVD*;QR0(((((OI`եI]O'$]j #b($+xa-"IRHPo!x =_AaM;Ka[ Э/&A%Bޢj`/O?V?_[Qp0 ' h_+h/(?Km4/O\ A%B? ' kz. [D|_MKm5E Э/&A%Bޢ?V?_X6zVH,-lk;hXԷp2B39W/ G\reQEEPEPEPEPEPkG+->D6}>5ͳe 9=?{+ ܴV63y(DFۓx$i.S[Ծy&QtMrKB0۾fq]QtzL.e$l=z)Wj:FDjzuhۑ.`YBP=46ݲ|-Y8Dܠn䏔,$hqa6ь 'y#4;Yn.c4褟&yVɜq=NsWKybegPcߌ~sEZRۻf7O;snv-rQ&MH,a$XaILӲòuqJ?SÚͬ6|B7 7Vl >VV6֜(]q<5:jE$Lh͟b]`,v )'q&fH} mij[jkv\A*\5Ĝ>0Ϗ7mN/p1h|qAE@#qR6PjOad5х|Ӂ~3tjXu}LX[4Y[tB;x`rMa=(]Ms "iLnjG݆ x 8l{i^,/WRKFe. o8 w2 `?KzK([ +؀3#_nq+NS}>K~Lo0q9u S-q%n; }c~{ A.-Vs:OBt/aI[X0Vg#0 qjQ-?bYtذ:7n#y 4҅smg3ʳNۢ`y}j[hwvPY\t֖`8R0? 㮴 SN:H#H0+ss2JIn.7wIe#B (Ivv:.ۛK2yX_pF3׮)dд]*ա;B Y84M.6Ow%"y9vpr21Zz ktza3uT.[88N_\ڇIm}P,fB2rWci=U(aEPEPEPEPEP.%Z];J`w]%"B(f?(zmmV,PXۺuwi]^˫]\C0Pȱz3?\3`Sڇu[\y ܶ3Uk=bMB ZgaG~#XB`hS`|FW-hz/DFmնuywiҢF%'$iZ+Es׾,v̀#jGwo]+RIieV!6G E(y?SӬm6mCyh&H#r$2;0[Pb @I?.M;Zژ~21 0b '<(͎,ޯZGK"3=[}c';N31BOK\eӬgk;y.E3ĥ2=7M1eirp88qpG hO~^L٣TYt`8y=|=LӼ7lp(/ v#尪H $ xkj5p0>S3oHgʮ Zji,3QbS3)i q;r{ݎ̰JYP@H#\H kƯfd6M0[(3ʒ).}gyIi3- 2ecI/khf!EPEPEPEPEPEPEPEPEPEPEP5,?tOЍs<\BJᮇD</ְ؉ne_P4_Jج}KJ`i[ܨQEHŠ((((( ?'SV'u?Vo?w_)K+XlD({ƿšw] s5ӿQEsQ@Q@Q@Q@Q@Q@qP,?uv%Bo5pR((((((ow:(%{]'WA\sa]KKf ( ( ( ( ( (8=VESح Ӎ>1}/j՗m 9V^8犞Pqሦg 3 g(ïl<#d2,Fˏ"ahv(zNK4/R$6˫ *0$7t#\i YOk0hfe_d`8xᴹ0B鼸`;l1*TsjՏVwu+ȶwˉvn:s_Z.|kͥ9e#m,B1c9 UnVVoiFBNwb-M;H 0xw*sibfa^hQ)ԯ4գm<ʭ:ȱePъp>'P D0o0Bӂi/ g'g S~]'$ bTE,/<k[Mwr 2yk+`Qщs׽1|-'oL4ofm=GD>mt>R+gyI@j,q12*K閫I|C E@w۵'P}j0n}/S༗X\$$J$„Up0~dQ9%ot=Z{ǀز}|WD""Oy)[mݷ۳v9ۜT6r[]2R7T yDϾTBi5 v"w3}|ݸwnyot [Y."EV_ICJLJW2ؠlӇ<^7kZʬx+Xg3[KlukXDi)p@E1a-9> 0<d1 q!cS9g4Nj4b[lDsD0]YQ9 о1ZMrJ p5)#U4UAmq:(KćaTT|皳mXa)'ԯghtrmA%:W;|r3E24dRF'-Nq9<QEQEQE@ֿan뤮oN.FIH(J`wSHu Yh\s9#*FֲAO$ʸ@q3an]I+&VV2O["R|eg۸&w.s֬\\"z䷷cRw0w4-⍧%KIf-eѼPd`62qӜZzKIb@*@y"NGy8?GÂDjܱmˈCG \nԚllr\]8XpEê,W`=h_sGry|G`q*HUFǪ],͔vv5rV-O^FM.5*$TܹUlx|m]ôar6B}K)'涢jɋ'4I.$Q fr*1u۔ q#8oikp3!c$c0#۸= qm€hip yO0dc;zzΞ'^ȭ4ah畑y3 l1IMIpEfc5 ߅4=, PuGǗRz=^,n-Uv?fFCſ2j&(;+OIuF2I1 I$Xc,F .2Wr0GQ\dݏſ2jÙ}`MW?|[C&~9\dݏſ2jÙ}qP,?u/dݏ4 궺ԯ類CIp`c5QFMTbފ($(((((ow:(%{]'WA\sa]KKf ( ( ( ( ( (&[:X[)7p7s16t[Y-&- Qv;# H]WhK4y⺶eH<#q>m,ehЅ -؅.si 4N :gF,KzI ;[9$9aLKan_crш4BsRp8sVhz/5]f;My&$[r2n-@x+TZe4(esz褹LJ0y dԴt;fүGl-Tmݴ.wg?]-.1F)҅l ֻJBuH~C-|W^]m ?̼P1ܿ(AΡ5Z_[vFIhO%r9qJfHc 4X:wd֍ED'ygh&V] b9ېjM?wj5ji16/6n ˅bxN1ZBfF pO$:{R~!cfw4jAcC1c0 ޳6]cLK;ˉb_,+*VPeVێw*H'g4pU 'z%+ p~˦i=%,r$s`20rV_j>!2]YKHQerO^9\0")f8Zl}d<Tc]Fp:U7y/]Kikb/#I"IPacW¶;t-:V}z7K8VG!,#rU}tkx|o3;Ե=WKm5 s`F,1摸wuRTӭ"$LGdL$޻-hft̐ќ ?5->:ώu}+K2}b Y2t ă =j'VMoIF5di[.wIQx]}ilEn]>ơ Ȑܡ8NI +9+Nj7[wTJ5Kؖɛ0FssTf4kiYn#.>XR0p 0${Lhi\$qwc2MS4UV_q̿a.L.Ip\V>"]·#5dGu]k1չ#ЊRǠ5->䪐8[_]ܴXE ;Z$5w8IN{ S7u֯j#i@ߨc ؓ 2g' 'nO[k:- 属$e:9MU|68L^7[ZpF]sHCwA.r*o}W첛'oG$S ?x }@18<K*}XH}{xA lI9o"l,%'w$ e@9[E'21~:OjlF#?y'j mH(QEŠ((((((((((((kǟ+X\5y"] x?_aТ* ( ( ( ( ( ( ( ( ( ( ( ( ,--F5W6pw"+IIT^:;]I7XrWxl-K4MSD,!S~IrKq^O|fIՎ·%ͽ}ܛ@O R1th}_6&mf*ȫ#Jcy`$T (((((((((Wwxow:(º]s u/- ((((((?K>v!6/nA , ƞ6C>iW#n3 ;7 .E-om,Q?oaN4[ѐ[S$cgׇ<1Vppa2̙˷19Ǔ޺*+}3Rkŷ42H%8yLqjl ɂ WUuIY 4QeUq yE%(m,s~'Цզ43SHڌĊB?0G@y H.JI5^O:O42y5s| Zm+z1!B*]Kdg&< pm0N֕#`v8AX [Ri ?Gy.fӥwul#7V-F[IdYͼ.9GcJ>BӴ$:WJp_j9q$in>q93Z3$ebPcYPG-7UI-&RlmÍ۱QM_0Zlpڏ bkY 1MXB>T`A)WwH˕y1,00G$gkyAhr^gKm="H #PJNy^-[Kp Wo;o8ۛ,ȃ~NyvQՌKmGG6Am(#kV0%q\ymEeC9#Ȼ_(|6Tu:)[[]nVR>$?s6l##*hX?2Bpc.KJ q[+J:Mſ˷ K #?nQ0VĊDL&B##M~y#85h=JZtݯ#pv[:%y@7`t)hF2T̟_C9M67F[y9Bvl"ҼM\:uwqK<$ȲU*c68==h(Q@Q@Q@Q@Q@ |mۿEk@O7@w?Կj+o+lPEPEPEPEPEPEP ˽oG𾑦\x?Xi졷̩d@JտM$WMEnj&(տM$WMEsտM$QЛ/H3Л/HsV7[_]5gsV7[_GBn"j( Bn"[oYEtP9[oYEۚ 騠.s?ۚ ?5oueQ@\5ouenj&+nj&(տM$WMEsտM$QЛ/H3Л/HsV7[_]5gsV7[_GBn"j( Bn"[oYEtP9[oYEۚ 騠.s?ۚ ?5oueQ@\5ouenj&+nj&(տM$WMEsSQFZtZ[ķ2B3H JH]5P (J`w[4WgN:f*FӬmo/-d`ZGn{&F;ϵc? تZ;1xCn A}sxJ\ص.&8&(aXPJ`91+[x{OmDޯy4 0=1Ѭ!0dc1e' zqҹ9uҬwڄKVlC1f)mɟr1c'p4]Vis"m7qŴnPʧc{f/_ےM_ikq,DkWy T$vU4Y٣m/Y]ٳ ^lm'WlG0) /iK{X`XK5Y.YOéA@V<i' 7w/gEc˶MՋ'y ,Ic 2SDK3"I5of @aa؆x7g~(6ɰ d:(\I2O4K&a mc 8૚BTԵ3M0;%ȓVBKIe7xXpܗ;( (((((ow:(%{]'WA\sa]KKf ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9 ѷu dU=_V?6aͨZJ0G ) gX5u4l?-~~/g;s}^v>ke9sT;*<ܞU%2 *" "G=j3"iw׎:|<'{N=*>V;N9|jvH% X=d] P$+h=1ѤK/t96J[[%YI >psK]sM2w a]q{ZƟC-AbYě;9QrV򩇆.m促8Ei$y M؜i[G_CfT#i//V4ʀ1z*+f[$g.9#@8T{;3\u-,U*`F.~ɑ֞Itu..V-"HF q'$c1cPm4,̗SEiI )9>C:,Ua2pp{y.mD7C|w?ܬ_p0N27<_p'%xR&ww=ޢQeƗjVi=u = ڭ"Juu*r2"al1dXܾqozڌ8S2dc<>)GB\nś\Yȃil@(_guA 8٧LBOg9ž5Fo-_D-ܬF2 O7}ߘml㊣?;;X.(cDsrLwjiM'}י>kqOi줄U u3Z+u QDFݰ8ʶ38sLW[i%ߐ2_qzMF_ƶfyx߻{nsޞ(ӽ?\\. RHmȗV/8A4homYDMЌH?@2H xxIafrW# #q&[FݚgA 7E71'<-5%K5+miN35%e@g1_2 }2Zo O*I5IRVa{n;s[6bpیa=)+"J fY)Q@Q@Q@Q@Q@Q@Q@Q@׏?WҸk? B5xEqa +@#Zb%EUQEQEQEQEQEQEQEQEx@SNkkǐCuᄷ&]KOI#C+A;P٢ ' h_+h/sSz_+h/ Э/&7iiw}mt#9!s FO$ ' h_+h/?V?_G [D|_M 7A%B? ' hz\6ž[9 661VBx<ßZ_+h/ Э/&V [D|_MKm4ޮ>_*ׅ/A%BҴEžake YػGm ƥ끒ϰc(Ԁ(((((Wwxow:(º]s u/- ((((((((((((((((((((((((((c*FӬu{j]&BFsl8=_V?6FiG`GTh _cYͿofcwgڶ?wfv7}qjʋJW1$i4Ao*g H88p{vz#!&+p0#bisIf8bEnIg#6#&)#V =rpOӚv_cю4WNHpHe*;z UmSXOm-^+r8zWᷲ-8'ʹ!@Oj9-4۝I&[d ȭ,JA}phw{nZw,biAB !U\ʜ= zeݜ:n@*cAj7y ݴ0\Z#u5NQ\Jèִ/El?hmmܑ,e**tw=I5&Љʪ0Cfs3}QAEPEPEPEPEPEPEPEPEPEPEPEPEP5,?tOЍs<\BJᮇD</ְ؉nhQEdQ@Q@Q@Q@Q@Q@Q@Q@s5ӿk բ+((((((+Jak>_*ׅyEVaEPEPEPEPEPkG+e岼Z 9D LadcINГSsn`x.4/F&I .\Mooɮml0呷099>?ZQQ,bhVPFˀ2xG:[I4ΥIԪq?YRZӾmZHY =h%:mp_Z+7[~+mہWz`-UcukIVdP @-$X_im,ҩ]EVv+ 0ВS{'EW:)8٨>3/p;s]A(;֫i5Id,/`pӡreVnVMY!ES2 ( ( ( ( ( ( ( ( ( ( ( (9Ȯ?!apCkW t:'FKsB($((((((((+ C\4-Q\EPEPEPEPEPEP\|T& s]qP,?u\7;(3 ( ( ( ( (>@%{]'>6^I㢀>o+lW?WR٫((((((((((((((((((((((((((f?(zmk$L$9?d%WUXkrkWQ^Yb| kzqXhLu n/'h^s2Z_/81wgkf$ o/,!2@c%:0zdzHzٙmnX i-|dd7o6Isirf(&푓~qo m/5 h%iI/Z?%Y3mmr6acI{۫h!T ;e[.<_HchF!Hw Ǡ%tw:M6RQ+Fo&5$;إu}{:wmm6u<ƞhLgQ0?$4+}KSG fۣEH*\t `-u}FM~k!襄 ?NJZdӴmI9$w29|zb{=u~F|^M[ d-MԠ5orrp >A!*v`0{wl-Uv?f( o 4`MW.ſ2j5_ck 8Oɪ߻3Gdݏ,?|[C&~>-Uv?f( o 5&V\:ci. lqF:݉ފ,p)QEQEQEQEQE+6MI\ny Yibd1x^HOS3Pݍ)Iٻ|GoJ#Kk::eA<kNk`ͼYC%G*P 9N08i]*pV5{q[mP۝8Ta*$ۃ3W*/L_,K!bEeFv1j΅sM56{'% |dv*7u\!}UUپ  YY7.v(2nc ;8F*܂E{#JnP1V%P!@=*S!aEP (((((((((((((W t:'FȮ?!apCkXlD4(B+gFYZt2]J۪#1+t ?5oebj9k9\cV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltG:Z}y>kW3hj ( ( ( ( ( ( (>@%{]'>6^I㢀>o+lW?WR٫((((((((((((((((((((((((((f?(zmKej|p^#%~f@N9E=_V?6hC70tc?ua?-1<[f}rAkv? A| Ey!fid o<k7~>'̌fʦıI%IeHb8#jZq].x^E{H&FLYp r16K+ w*u8*Ų ݷ30?[ 3}u]cLi ]JlNQ԰>#{a@Y)?wg]_iQ >hG5/,?P3~CA=‹'dTr(@`9R~4X.L4G{ƨL]owjı  >Syh6‰87gBPC@7miQ >]:=+*\Fwߦ .9m}JdP!AOB?0X.iQ >oQHf&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[PXQC>c>u ]Dyw(uD</=,?tOЍk QVHW;qojt1[4Jy18\8]sz w6Ҕ܇ OoYEj'*5hZ^rnqt:;j㹃 B~"H5?ev\/Ŕ8eM ]*XoM.7WT3[Hi4]ϳ+AП/H OoYEY_ g0,O+nW$x9, \$Sk- ht t̊"$ ? O$S!\aV C)p_d9N*I|OO-Ĩ$VmMȪp(FKFqwWkAП/H OoYEYM95Ğ_,2`ci<0-0B2sp<|sE{9eoH5?eAП/HIw~}.{v f)l=^mvؼ7(T*Ax V)oH5?eAП/H/=2;h2N.*ZλN܀ `1NuYBuud:n$Eн{2$ ? O$V@%{]'>6^I㢀>o+lW?WR٫((((((((((((((((((((((((((f?(zmMi&TQ`BG\@Ny 5UB%di&?Y{9&[dGە`!+Ԓ k? K2c ;R5ҭ[H՝WBΒwCiIY!jahG $9'ixuW J⮗D</ְ؉nhQEdsz w6ҺJ/(/mL#7"oB s~%V&=Ɔz2N,a+]?>T35M<\\<ӆVbl]%Uf9隍<]maGN<7tA8[N͠Y=ɼ9D[z}s] (f+ QJs$EI*D1қ g+RxZN{$H HsvƊ5Ej0 i 1)6xYPO*ſ->Ύ6B*q\*QyEBWؐ7{6c%r%_wMt}F+y{<a{me*AZPՁTwoH,/,[Ǚn`s Y@3 1<h]X쌋 &{?1r q}wؼ_eHDXC.r'1] 5ubc9GfT> iNc-ot"O#UM2 +&%HBXNN~cԞrbsVBZmRiivRٿ'-zR^x;MYnIB eC\.1l}v+KZi0t |fa"r9Fxd&.OdkȰWnAX2Okzvso[mQFɝ2xX2hة] ]GH)$'9iVWSA:[xnq5qEqr.O9FHǷ =*(I%an핬=:&8C(9ǹ9&E2oVrA x PWw[ESQEQEQEQEQEQE+rsI\7/ܾy<]imǦ],WmdG w#7۞&z.-پN(8  9nn_Qѹ}GX^3V5iSM]ۙBO:ga]R}Ph{`Pr﵆}:E>V%8[n_Qѹ}GXzR?e8mX3f3ۏz|>*o,e(#}pF.V&~u.ሳx&2 rV!KktҮKʳˆ\8s8Sr΍?:nt׺|SHed :lV2[r΍?:EVܾrά@/ܾ4Pm?:7/[r΍?:EVܾrά@/ܾ4Pm?:7/[r΍?:Er6 dqWMkW t:'FKsB($+Կh ѶW7@m*eQXQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%_"4( c7QEQEQEQEQEQEQE|JnO|mۿE}?WR٫WA@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@PXۺPfL<PXۺuԷwXn2Nx[ӲFe^xsJ.kwx0 0d`sZofeUwVB,@ ~Q֥n9Zڛ+t{o7v6߿# OXGPbMr6W:i4Z\HV<2'BIg8yD_lR+D󉏖+ч\|͜繫>Ո6d!c6iBMeXe\yxwLܴ2@ߴ67ϽgEY.Qox=Ȇ  Nk Ėˤ3[ɗlāmtty&L%(Z;KO&(lJqpG=):!f đ60N`y/f]FYڼ gcJݺԍ^ tPy2atWSN/KHZݠ+ĝ 2sŝ?Mi/( 23dn<0]kZGsw6m.[1v27ޡsD.}?uU>bx8 |5V$ixFe{c#_#ݍn83K'٤F$$o<5ېϽsxE -Fݠwd u-n5 {WHٱrc|^JOEprQmYZ2FF,qw,IN ګ20dF @qڹ[^+Z[t1pO ll3%Jn-@YМxj_as-,FpY##cd)8EKegqōIAױ'#▼ı#ˌ{qr MӕXPpF3)YV۶NYI?Y]پnceUNE)XU#pǧkEc":Aqu}n쏴1ZKܝB3(S6؜۷6vjoE%Q@Q@Q@Q@׏?WҸk? B5xEqa +@#Zb%EU k"FH&kr cav/=mQ@7 SWTG SWT] ?wy?wysE  ;  ;빢?uOt?uOuE???hpOA]Sw]OA]Sw]w4Q`8o@.@.(7 SWTG SWT]X)+)+, ?wy?wysE  ;  ;빢?uOt?uOuE???hpOA]Sw]OA]Sw]w4Q`9}‡CiBdY[f`@KHI<*uQL(((((((>6^I㢏Wwx ; _[5t7@w?Կj(((((((((((((((((((((((((((J`wZqIe+:qd%WU<;j6}WRHQHbbEU_[ e֦D&?esu#J }+k6H]c eu=Nme .!X(l&n%Z,MnmI cqZC-&u!vm${cұχZЬ6^I㢏Wwx ; _[5t7@w?Կj(((((((((((((((((((((((((((J`wN˫t!Td'qSc*Fc-i] @_ m] t5Q} 3gv13Io|4α].qWrqNw#MiL*J '!q<'Dfy4'%nz魦hZŽv'4﹇?5*Xt& }ϙVF?tv: ͭi5ṵ{#nS[{g[1E$ֱGg U 8 ;/xNm>y7[k#ۦLJqAOIoPm$6L;ZK0JQKwqxڂ)>TBoOV',2Vju( Ӈ^0?#(]Ugr+)ogb}2X4/^__?*ie<|''Gr$7{ ɿyV²ymO=Qѐ=W#(7/xs n,4Iې9)Ѽo8±Ȭ@+0qmhf# VʖfyS7.9j4! $(qRw}i5PdyHQNi'3jut7fB\(/Gҵ屴r%^0Sӌ w;w5FX@օmF|76\GutO9^30J*89 Տmmtm`71&Hg {֝agqZAndD%PAF}zN,Z}xaT/ߒ4] ҺԹETQEQEQEQEQEQEQEQEQEQEs^<\BJᮇD</=,?tOЍk QVHQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE+ӕ8lo.IeLӚ7Җ31dR,bn:oJ~Шo!Up.' xO6iV?},AڪH^603ﱛ7t^ g M K#;tA+hGJugL^\|+"gNj&O^\D<]ccbv=>2d@Lk {y޾D:D,Akk(!&Hq!|E[kny6]ZRG^qސxL*Ud{y2v;s6g "I+͸mٳ8pG3^<6kl5[,/.uS 4>b>݉< kx _ǧ]K6l4{cBa0@ZkV7']1Hvܫ#NH'k2wٮ1:@d۵IC96bTcAa "Q'l}3wQ)ɢQ fcap 208TtwiLeXok{*6DyI+-ڪąf;pH8-{Q$pRr+e{fF  ,X8\jzT/_a$l>\غMY\YfOYy䁑zb|] Xp]5;Bbz($!]]9RPxfSPm$4lPRF^Ea̻C ( (9Ȯ?!apCkW t:'FKsB($(((((((((((((((((((((((ow:(%{]'WA\sa]KKf ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9 ѷu%ēYO gLPXۺuƶWvvتp1F8[ӲFQ\f&rnq cLίW96a-vm# w`D^f#o+}&.|ausi4Dj! )3f@bI\IHYs'̄cw pa]L2ӤM4XsaHd'Cc]>Z3 <\I|ӱm9l&12nb%9bI'П5ue²3 *=JWڮ|;u,W׏ő&>rsߦ#ҭ( 0}HTri\EsGE <_\\]#o0{SՏZ<5d-p8eyqVg$AEA9E8Q7s\ZV|eE_ū_XJ'pml׶sҪ/4tTx$}Χl`V~<86qt&%A*N:t查TԣQ{lh=lsq*zf[7_ê>֚۬+baSo|-gA"_O5̒GfYR&9Oz:q\Ğ<QE&/~ۧ8Y/."[[[O! cct'<8+G c𭍝٤R8\x돮hռ)k;A"96xY;M]nl$[K; V#:X'c${ڼ1Go.I(܊w#܍;_4VݷGa(D *QNpQ`A;o\r2I`n~ezrY\\ʓ9F1ݪUB`QӌW>im-ıKXKeN=j+ĚQͧ 1}*J|{~vTW9jw۫ai-H;8fc@y㞎'p) (y"] x?_{ǟ+X\5- ((((((((((((((((((((((((Wwxow:(º]s u/- ((((((((((((((((((((((((((c*FF:P (P;ps'G!vmt>gK-SL]O *@M|H+g#ߩ'4Yw|.UEyGI%-Y*ks`cIky <>nFB#F&ԮkzhIC# r=_sRmA`-ܒT<Tk.s!whB˾h8L)5;zk6zlCqUfDr@N#S\!zl&ymT#E8cy#jO @m/P̻HCIn oAO_qsɭPˉbDѰV$CG*xUj>5 Y@xgn g6a+dP[L]GlddLbW!A8J._%SI .態'3ԕ x$NKHEC),)9>xK1E%V]A,13m` :c.+Q΅p꤂?E{%r' #ILH7H`4[6Y[E?8+v#s'g,]ʱ`ʞbmnn\+7RQnHI,lQd ؈?y˹.5bv yg Fڸ``1EZvWWPZMup! ' OTfF|^Dț,f@ރ<ӧz]lJp2x*R$ 1mdH#3[{rPmN3MF=_qsI:+^jD9STGqxX#cJnk8-m\\nH f-XO56CRn5W(LFҞ ;Wq_ ŵxxL|eg f.d/2h9"R8EUBF@6TFGJ*mHDf MY՞E]QHg5,?tOЍs<\BJᮇD</ְ؉nhQEdQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ |mۿEk@O7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP3=_V?6u9 WA%ydtPXۺPfL2ݖeaՔi~²y&߽یfk=KMO8Q&9Mr߃qIRy"[s$`s]rٱs w*qi vꥂ7q jN6b8Lj 2,9'$I'O<܉P20oo̠qSN7W2%3kXn%ѩiDE*C2G>x9'P`'|6ݟ3f0GgڭNh#oX d ܁*i({[yF7˷:0Pi]ұ=똶X.-\8i?3Oob,E#2 \cQ2iG|"-19c;xUɬei!0ugcr=vR_f(^m&$ c P'm6sK<CBN$fx=~Vtm8ۉ3w@46縉 RZ2[dbw?# O` L:jiki'#_6P(?z|i6d/s3r#BF(ZB)I؋#ŀqf%U1]AtfQRXQEQEQEQEQEQEQEQEQEQExEqa +@#\?WҸk? B56"[QEY!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPkG+Yg- i_8]ጒ' 硋YҖx-<~R\d0T@ Ec;yD2 z|Ñ;oWב\1vb>Csoz5=ֹrWdhEij,M0c9k9kX}_iҞXo3MXI,vȐ8[vXI]>/sZn'KNv;]܃y{%EKpbFc#}gCkBj]Lr_K 2*ʛ.̸Wq֋vg%^ yγ@lq 0Dśxi;1kvE s&P44¤BCCbxl.$ñ;?)Wt>+?6n?=wD=Xg:ѶWwR9B#X ;Fcԑ(t^y}3Km?P%$/;HcCҵgycP2"LfNAps>?iK} Ϫr+ۜӡR0B]7!a,Wrgө&it$AŜ nsW\ntKYV)EEȮs4;ZW4hRk:\-˩YJ :s9>k +o9+ p$#] *dwEPXӨp;s*M>SEd•u{h(((y"] x?_{ǟ+X\5- ((((((((((((((((((((((((Wwxow:(º]s u/- ((((((((((((((((((((((((((c*F֞luIm>+F (u yX eX?d-$ҹ=`~{l/A&Ϳ7coV%5s4kdȞh e!^ӷ_Ix[8 @ޙnx'?s|BO"1_|<,ߌ&Dp}8 GпJBEj2!s$Oz,LO,DRB]0:gzwk^-߅}LO@02 oiȎDo{̖67kf8 ~K1''96'L}?¶Io>ͼC j,C.KyQ3xZk[MB-KN݇{+{s|B |HPe,r$Y3ͤ"|&ZOio<1cw)nQ!J@_a\xZi-5,nURSey%8$qc肺 7?)1{(>gקI`Z_4eUFO0cq5!Z)w[>r$"3q WI!F.g"f~+y"utH>OI'Nzc޳%cdQ!FFpl<`G2(Q!OūXʟâ[6nBYǜU>;뻛"J+$[nRQWSҗWDRM1={-C0am-S) #?s|BqOs__ ( E]v݌E,d$jw?(?qFܽ t%%-GI=][Ҭk9I~bFP0 =ޥ?s|B=OEA!FOEA!FOEA!F`Eqa +@#\׍ُ'?0Ҹ? B56"[QEY!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPkG+P?| ȶ\k+$2$J\</`0HʹCVcL. Ds $1[k<8뎼g-uV`G򂁵O'8CZEƯ,?gڪtBq~[O֒r[Y\aU|UwrK |8>$_)JizbC,"FKO=O,Jktf צ53̼\'ɍs]Woc24'$s`D=8.g^o o [w'9[_E1ܼ6i'XRԄ6qor玚]G[<")&"X$d 9Vs5қg|r9?)^6,Ot&kt+*ĕ8R1~|K^IyP` p7e=2vEecKr΍?:g՝CBV6;r歏[\MifG9vU8=QlH_r΍?:/iP[YM"[ȋ 풢Lрlg2xY GovES9ѭ}GFe?bX<_<| TyK[HA2WiA}GFdAhm]̲"bS%L݊/me[W)q,A\G*~ys"m?:7/1NjP Tl"49c)Tl H+=wv-~ 䓱}GF,KsmmqnΡmr 3ֲ5Ŧ]m$pZʯ'K#HE5/ܾB&/\>wiQfʌ?2pGaHd>*Xw27t[pw\ܾrΛ_jfMWh9 :HVܾrά@/ܾ4Pm?:7/[r΍?:EVܾrά@/ܾ4Pm?:7/؃ᓃ/]6 x?_{ǟ+X\5- ((((((((((((((((((((((((Wwxow:(º]s u/- ((((((((((((((((((((((((((c*FF"`0:d&*FӬ.ŕ|KvS] 2vLVRݖ6+>EGWT-)3nHa1qZ^#\m%фHb.T%fĂJtԭ I][*i6i͒?;re${桺y)A䘮$ |jb5na.0KnF G nu>Eyuy n31L*Ly 91UqC}Oikd/4">͙ȅāFeqGSkUuvk|g[Afi6|7g*֘n$[cx]d"?(brhvx7kh-`8m[~WGduҷ@V@qFJHM4_<>N?^C8?ei YI.%7®7gF:U ynnZCM{: z3BOS`I6}RV]k5XryB'$$sUw{W41ڨrVC{ҳ-l-'[>fw9{_IY8,ggF7L?xܓI(wՖJ(@QEQEQEQEQEQEs^<\BJᮇD</=,?tOЍk QVHQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE+ 8sެVׅܐ*?$\Iw}FKBiAYFEh}^E<95a<_{ MBϐ n$3$6^I㢏Wwx ; _[5t7@w?Կj(((((((((((((((((((((((((((*G]֮dXmŕL/@e!Qde(v ]=#.0(r1ؒ==?s|B3ۖ4K+m$ې?n] t)-bA\L<,A bQׯ7?(?Txv2+e{vqϑtN/]$vil)mٍ>>tQOD.u ~r}?tqƂPuSɏ=w 1X ][T}8<woF4u?s|B`e=w/۟nSw/ܾnQ!Mܾr΀!F7r΍?:v?:7/۟nSw/ܾnQ!Mܾr΀!F7r΍?:v?:7/۟nSw/ܾnQ!Mܾr΀!F7r΍?:v?:7/۟nSw/ܾnQ!Mܾr΀!F7r΍?:n|0A9]. x?_g *OЍk QVHQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE+UA;MnQ|xܻP6 r:9R;⣗ZmY]=YchxɗcZxgK !X]U We rYm#"ƙ$B9ngKJ{g:qUͪљz5KSڥM2tڊ̻XHAMo{ =`h?&7ISrogoonN̤ĖI-Z8b nnӕsҒkgљxJ $Y'0rZ@G*ԗ6$aQ4y_,I# iё1y_~^O*]r FV@zϭAi3uo=Wo UmFvӖ FHO+$ы+[D)d9fi=K8,2] .3F@,E9.ys*ɸ L ;@{&tvX񄰽2dU@ `\541os$ǀw$*a&$܄$RNzd2H)ʴ$=qѽ-.QRXQEQEQEQEQEQEQEQEQEQEQEQExEqa +@#\?WҸk? B56"[QEY!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPkG+@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!VnWwx?[ڵ/KSv 8P?pyparsing-2.0.3/setup.py0000664000175000017500000000245012171421406014263 0ustar barrybarry#!/usr/bin/env python """Setup script for the pyparsing module distribution.""" from distutils.core import setup import sys import os from pyparsing import __version__ as pyparsing_version modules = ["pyparsing",] setup(# Distribution meta-data name = "pyparsing", version = pyparsing_version, description = "Python parsing module", author = "Paul McGuire", author_email = "ptmcg@users.sourceforge.net", url = "http://pyparsing.wikispaces.com/", download_url = "http://sourceforge.net/project/showfiles.php?group_id=97203", license = "MIT License", py_modules = modules, classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'Intended Audience :: Information Technology', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.0', 'Programming Language :: Python :: 3.1', 'Programming Language :: Python :: 3.2', 'Programming Language :: Python :: 3.3', ] ) pyparsing-2.0.3/LICENSE0000664000175000017500000000202110704710234013550 0ustar barrybarryPermission 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. pyparsing-2.0.3/robots.txt0000664000175000017500000000004310426670530014623 0ustar barrybarryUser-agent: * Disallow: /htmldoc pyparsing-2.0.3/htmldoc/0000775000175000017500000000000012416136733014212 5ustar barrybarrypyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Token-class.html0000664000175000017500000004175012322542216023311 0ustar barrybarry pyparsing.pyparsing.Token
Package pyparsing :: Module pyparsing :: Class Token
[frames] | no frames]

Class Token

source code

   object --+    
            |    
ParserElement --+
                |
               Token
Known Subclasses:

Abstract ParserElement subclass, for defining atomic matching patterns.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
setName(self, name)
Define name for this expression, for use in debugging.
source code

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseImpl, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

setName(self, name)

source code 

Define name for this expression, for use in debugging.

Overrides: ParserElement.setName
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Group-class.html0000664000175000017500000004252512322542216023326 0ustar barrybarry pyparsing.pyparsing.Group
Package pyparsing :: Module pyparsing :: Class Group
[frames] | no frames]

Class Group

source code

     object --+            
              |            
  ParserElement --+        
                  |        
ParseElementEnhance --+    
                      |    
         TokenConverter --+
                          |
                         Group

Converter to return the matched tokens as a list - useful for returning tokens of ZeroOrMore and OneOrMore expressions.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, expr)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
postParse(self, instring, loc, tokenlist) source code

Inherited from ParseElementEnhance: __str__, checkRecursion, ignore, leaveWhitespace, parseImpl, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, copy, parseFile, parseString, parseWithTabs, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setResultsName, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables
  __slotnames__ = []

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, expr)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

postParse(self, instring, loc, tokenlist)

source code 
Overrides: ParserElement.postParse

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.ParseFatalException-class.html0000664000175000017500000001646712322542216026141 0ustar barrybarry pyparsing.pyparsing.ParseFatalException
Package pyparsing :: Module pyparsing :: Class ParseFatalException
[frames] | no frames]

Class ParseFatalException

source code

              object --+            
                       |            
exceptions.BaseException --+        
                           |        
        exceptions.Exception --+    
                               |    
              ParseBaseException --+
                                   |
                                  ParseFatalException
Known Subclasses:

user-throwable exception thrown when inconsistent parse content is found; stops all parsing immediately

Instance Methods

Inherited from ParseBaseException: __dir__, __getattr__, __init__, __repr__, __str__, markInputline

Inherited from exceptions.Exception: __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __setattr__, __setstate__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

pyparsing-2.0.3/htmldoc/toc-everything.html0000664000175000017500000003242512322542216020046 0ustar barrybarry Everything

Everything


All Classes

pyparsing.pyparsing.And
pyparsing.pyparsing.CaselessKeyword
pyparsing.pyparsing.CaselessLiteral
pyparsing.pyparsing.CharsNotIn
pyparsing.pyparsing.Combine
pyparsing.pyparsing.Dict
pyparsing.pyparsing.Each
pyparsing.pyparsing.Empty
pyparsing.pyparsing.FollowedBy
pyparsing.pyparsing.Forward
pyparsing.pyparsing.GoToColumn
pyparsing.pyparsing.Group
pyparsing.pyparsing.Keyword
pyparsing.pyparsing.LineEnd
pyparsing.pyparsing.LineStart
pyparsing.pyparsing.Literal
pyparsing.pyparsing.MatchFirst
pyparsing.pyparsing.NoMatch
pyparsing.pyparsing.NotAny
pyparsing.pyparsing.OneOrMore
pyparsing.pyparsing.OnlyOnce
pyparsing.pyparsing.Optional
pyparsing.pyparsing.Or
pyparsing.pyparsing.ParseBaseException
pyparsing.pyparsing.ParseElementEnhance
pyparsing.pyparsing.ParseException
pyparsing.pyparsing.ParseExpression
pyparsing.pyparsing.ParseFatalException
pyparsing.pyparsing.ParseResults
pyparsing.pyparsing.ParseSyntaxException
pyparsing.pyparsing.ParserElement
pyparsing.pyparsing.QuotedString
pyparsing.pyparsing.RecursiveGrammarException
pyparsing.pyparsing.Regex
pyparsing.pyparsing.Regex.compiledREtype
pyparsing.pyparsing.SkipTo
pyparsing.pyparsing.StringEnd
pyparsing.pyparsing.StringStart
pyparsing.pyparsing.Suppress
pyparsing.pyparsing.Token
pyparsing.pyparsing.TokenConverter
pyparsing.pyparsing.Upcase
pyparsing.pyparsing.White
pyparsing.pyparsing.Word
pyparsing.pyparsing.WordEnd
pyparsing.pyparsing.WordStart
pyparsing.pyparsing.ZeroOrMore

All Functions

pyparsing.pyparsing.col
pyparsing.pyparsing.countedArray
pyparsing.pyparsing.delimitedList
pyparsing.pyparsing.dictOf
pyparsing.pyparsing.downcaseTokens
pyparsing.pyparsing.indentedBlock
pyparsing.pyparsing.infixNotation
pyparsing.pyparsing.keepOriginalText
pyparsing.pyparsing.line
pyparsing.pyparsing.lineno
pyparsing.pyparsing.locatedExpr
pyparsing.pyparsing.makeHTMLTags
pyparsing.pyparsing.makeXMLTags
pyparsing.pyparsing.matchOnlyAtCol
pyparsing.pyparsing.matchPreviousExpr
pyparsing.pyparsing.matchPreviousLiteral
pyparsing.pyparsing.nestedExpr
pyparsing.pyparsing.nullDebugAction
pyparsing.pyparsing.oneOf
pyparsing.pyparsing.originalTextFor
pyparsing.pyparsing.removeQuotes
pyparsing.pyparsing.replaceHTMLEntity
pyparsing.pyparsing.replaceWith
pyparsing.pyparsing.srange
pyparsing.pyparsing.traceParseAction
pyparsing.pyparsing.ungroup
pyparsing.pyparsing.upcaseTokens
pyparsing.pyparsing.withAttribute

All Variables

pyparsing.pyparsing.alphanums
pyparsing.pyparsing.alphas
pyparsing.pyparsing.alphas8bit
pyparsing.pyparsing.anyCloseTag
pyparsing.pyparsing.anyOpenTag
pyparsing.pyparsing.cStyleComment
pyparsing.pyparsing.commaSeparatedList
pyparsing.pyparsing.commonHTMLEntity
pyparsing.pyparsing.cppStyleComment
pyparsing.pyparsing.dblQuotedString
pyparsing.pyparsing.dblSlashComment
pyparsing.pyparsing.empty
pyparsing.pyparsing.hexnums
pyparsing.pyparsing.htmlComment
pyparsing.pyparsing.javaStyleComment
pyparsing.pyparsing.lineEnd
pyparsing.pyparsing.lineStart
pyparsing.pyparsing.nums
pyparsing.pyparsing.opAssoc
pyparsing.pyparsing.printables
pyparsing.pyparsing.punc8bit
pyparsing.pyparsing.pythonStyleComment
pyparsing.pyparsing.quotedString
pyparsing.pyparsing.restOfLine
pyparsing.pyparsing.sglQuotedString
pyparsing.pyparsing.stringEnd
pyparsing.pyparsing.stringStart
pyparsing.pyparsing.unicodeString

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.CaselessKeyword-class.html0000664000175000017500000004372612322542216025345 0ustar barrybarry pyparsing.pyparsing.CaselessKeyword
Package pyparsing :: Module pyparsing :: Class CaselessKeyword
[frames] | no frames]

Class CaselessKeyword

source code

   object --+            
            |            
ParserElement --+        
                |        
            Token --+    
                    |    
              Keyword --+
                        |
                       CaselessKeyword

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, matchString, identChars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678...)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code

Inherited from Keyword: copy

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from Keyword: setDefaultKeywordChars

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from Keyword: DEFAULT_KEYWORD_CHARS

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, matchString, identChars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678...)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Optional-class.html0000664000175000017500000004530312322542216024014 0ustar barrybarry pyparsing.pyparsing.Optional
Package pyparsing :: Module pyparsing :: Class Optional
[frames] | no frames]

Class Optional

source code

     object --+        
              |        
  ParserElement --+    
                  |    
ParseElementEnhance --+
                      |
                     Optional

Optional matching of the given expression. A default return string can also be specified, if the optional expression is not found.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, expr, default=_NullToken())
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code
 
__str__(self)
str(x)
source code

Inherited from ParseElementEnhance: checkRecursion, ignore, leaveWhitespace, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, copy, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setResultsName, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables
  __slotnames__ = []

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, expr, default=_NullToken())
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.RecursiveGrammarException-class.html0000664000175000017500000002353612322542216027370 0ustar barrybarry pyparsing.pyparsing.RecursiveGrammarException
Package pyparsing :: Module pyparsing :: Class RecursiveGrammarException
[frames] | no frames]

Class RecursiveGrammarException

source code

              object --+        
                       |        
exceptions.BaseException --+    
                           |    
        exceptions.Exception --+
                               |
                              RecursiveGrammarException

exception thrown by validate() if the grammar could be improperly recursive

Instance Methods
 
__init__(self, parseElementList)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
__str__(self)
str(x)
source code

Inherited from exceptions.Exception: __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

Method Details

__init__(self, parseElementList)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.NotAny-class.html0000664000175000017500000004540212322542216023437 0ustar barrybarry pyparsing.pyparsing.NotAny
Package pyparsing :: Module pyparsing :: Class NotAny
[frames] | no frames]

Class NotAny

source code

     object --+        
              |        
  ParserElement --+    
                  |    
ParseElementEnhance --+
                      |
                     NotAny

Lookahead to disallow matching with the given parse expression. NotAny does *not* advance the parsing position within the input string, it only verifies that the specified parse expression does *not* match at the current position. Also, NotAny does *not* skip over leading whitespace. NotAny always returns a null token list. May be constructed using the '~' operator.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, expr)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code
 
__str__(self)
str(x)
source code

Inherited from ParseElementEnhance: checkRecursion, ignore, leaveWhitespace, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, copy, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setResultsName, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables
  __slotnames__ = []

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, expr)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.CaselessLiteral-class.html0000664000175000017500000004241412322542216025306 0ustar barrybarry pyparsing.pyparsing.CaselessLiteral
Package pyparsing :: Module pyparsing :: Class CaselessLiteral
[frames] | no frames]

Class CaselessLiteral

source code

   object --+            
            |            
ParserElement --+        
                |        
            Token --+    
                    |    
              Literal --+
                        |
                       CaselessLiteral

Token to match a specified string, ignoring case of letters. Note: the matched results will always be in the case of the given match string, NOT the case of the input text.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, matchString)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from Literal: __slotnames__

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, matchString)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Combine-class.html0000664000175000017500000004721512322542216023607 0ustar barrybarry pyparsing.pyparsing.Combine
Package pyparsing :: Module pyparsing :: Class Combine
[frames] | no frames]

Class Combine

source code

     object --+            
              |            
  ParserElement --+        
                  |        
ParseElementEnhance --+    
                      |    
         TokenConverter --+
                          |
                         Combine

Converter to concatenate all matching tokens to a single string. By default, the matching patterns must also be contiguous in the input string; this can be disabled by specifying 'adjacent=False' in the constructor.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, expr, joinString='', adjacent=True)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
ignore(self, other)
Define expression to be ignored (e.g., comments) while doing pattern matching; may be called repeatedly, to define multiple comment or other ignorable patterns.
source code
 
postParse(self, instring, loc, tokenlist) source code

Inherited from ParseElementEnhance: __str__, checkRecursion, leaveWhitespace, parseImpl, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, copy, parseFile, parseString, parseWithTabs, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setResultsName, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables
  __slotnames__ = []

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, expr, joinString='', adjacent=True)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

ignore(self, other)

source code 

Define expression to be ignored (e.g., comments) while doing pattern matching; may be called repeatedly, to define multiple comment or other ignorable patterns.

Overrides: ParserElement.ignore
(inherited documentation)

postParse(self, instring, loc, tokenlist)

source code 
Overrides: ParserElement.postParse

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.ParseSyntaxException-class.html0000664000175000017500000002273112322542216026367 0ustar barrybarry pyparsing.pyparsing.ParseSyntaxException
Package pyparsing :: Module pyparsing :: Class ParseSyntaxException
[frames] | no frames]

Class ParseSyntaxException

source code

              object --+                
                       |                
exceptions.BaseException --+            
                           |            
        exceptions.Exception --+        
                               |        
              ParseBaseException --+    
                                   |    
                 ParseFatalException --+
                                       |
                                      ParseSyntaxException

just like ParseFatalException, but thrown internally when an ErrorStop ('-' operator) indicates that parsing is to stop immediately because an unbacktrackable syntax error has been found

Instance Methods
 
__init__(self, pe)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code

Inherited from ParseBaseException: __dir__, __getattr__, __repr__, __str__, markInputline

Inherited from exceptions.Exception: __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __setattr__, __setstate__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

Method Details

__init__(self, pe)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Keyword-class.html0000664000175000017500000005376612322542216023667 0ustar barrybarry pyparsing.pyparsing.Keyword
Package pyparsing :: Module pyparsing :: Class Keyword
[frames] | no frames]

Class Keyword

source code

   object --+        
            |        
ParserElement --+    
                |    
            Token --+
                    |
                   Keyword
Known Subclasses:

Token to exactly match a specified string as a keyword, that is, it must be immediately followed by a non-keyword character. Compare with Literal:

 Literal("if") will match the leading C{'if'} in C{'ifAndOnlyIf'}.
 Keyword("if") will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'}

Accepts two optional constructor arguments in addition to the keyword string: identChars is a string of characters that would be valid identifier characters, defaulting to all alphanumerics + "_" and "$"; caseless allows case-insensitive matching, default is False.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, matchString, identChars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678..., caseless=False)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code
 
copy(self)
Make a copy of this ParserElement.
source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods
 
setDefaultKeywordChars(chars)
Overrides the default Keyword chars
source code

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables
  DEFAULT_KEYWORD_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJK...

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, matchString, identChars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678..., caseless=False)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

copy(self)

source code 

Make a copy of this ParserElement. Useful for defining different parse actions for the same parsing pattern, using copies of the original parse element.

Overrides: ParserElement.copy
(inherited documentation)

Class Variable Details

DEFAULT_KEYWORD_CHARS

Value:
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$'

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.ParseResults-class.html0000664000175000017500000013072612322542216024667 0ustar barrybarry pyparsing.pyparsing.ParseResults
Package pyparsing :: Module pyparsing :: Class ParseResults
[frames] | no frames]

Class ParseResults

source code

object --+
         |
        ParseResults

Structured parse results, to provide multiple means of access to the parsed data:

  • as a list (len(results))
  • by list index (results[0], results[1], etc.)
  • by attribute (results.<resultsName>)
Instance Methods
 
__init__(self, toklist, name=None, asList=True, modal=True, isinstance=<built-in function isinstance>)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
__getitem__(self, i) source code
 
__setitem__(self, k, v, isinstance=<built-in function isinstance>) source code
 
__delitem__(self, i) source code
 
__contains__(self, k) source code
 
__len__(self) source code
 
__bool__(self) source code
 
__nonzero__(self) source code
 
__iter__(self) source code
 
__reversed__(self) source code
 
iterkeys(self)
Returns all named result keys.
source code
 
itervalues(self)
Returns all named result values.
source code
 
iteritems(self) source code
 
keys(self)
Returns all named result keys.
source code
 
values(self)
Returns all named result values.
source code
 
items(self)
Returns all named result keys and values as a list of tuples.
source code
 
haskeys(self)
Since keys() returns an iterator, this method is helpful in bypassing code that looks for the existence of any defined results names.
source code
 
pop(self, *args, **kwargs)
Removes and returns item at specified index (default=last).
source code
 
get(self, key, defaultValue=None)
Returns named result matching the given key, or if there is no such name, then returns the given defaultValue or None if no defaultValue is specified.
source code
 
insert(self, index, insStr)
Inserts new element at location index in the list of parsed tokens.
source code
 
append(self, item)
Add single element to end of ParseResults list of elements.
source code
 
extend(self, itemseq)
Add sequence of elements to end of ParseResults list of elements.
source code
 
clear(self)
Clear all elements and results names.
source code
 
__getattr__(self, name) source code
 
__add__(self, other) source code
 
__iadd__(self, other) source code
 
__radd__(self, other) source code
 
__repr__(self)
repr(x)
source code
 
__str__(self)
str(x)
source code
 
asList(self)
Returns the parse results as a nested list of matching tokens, all converted to strings.
source code
 
asDict(self)
Returns the named parse results as dictionary.
source code
 
copy(self)
Returns a new copy of a ParseResults object.
source code
 
asXML(self, doctag=None, namedItemsOnly=False, indent='', formatted=True)
Returns the parse results as XML.
source code
 
getName(self)
Returns the results name for this token expression.
source code
 
dump(self, indent='', depth=0)
Diagnostic method for listing out the contents of a ParseResults.
source code
 
pprint(self, *args, **kwargs)
Pretty-printer for parsed results as a list, using the pprint module.
source code
 
__getstate__(self) source code
 
__setstate__(self, state) source code
 
__dir__(self) source code

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods
a new object with type S, a subtype of T
__new__(cls, toklist, name=None, asList=True, modal=True) source code
Properties

Inherited from object: __class__

Method Details

__new__(cls, toklist, name=None, asList=True, modal=True)
Static Method

source code 
Returns: a new object with type S, a subtype of T
Overrides: object.__new__
(inherited documentation)

__init__(self, toklist, name=None, asList=True, modal=True, isinstance=<built-in function isinstance>)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

pop(self, *args, **kwargs)

source code 

Removes and returns item at specified index (default=last). Supports both list and dict semantics for pop(). If passed no argument or an integer argument, it will use list semantics and pop tokens from the list of parsed tokens. If passed a non-integer argument (most likely a string), it will use dict semantics and pop the corresponding value from any defined results names. A second default return value argument is supported, just as in dict.pop().

__repr__(self)
(Representation operator)

source code 

repr(x)

Overrides: object.__repr__
(inherited documentation)

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

asXML(self, doctag=None, namedItemsOnly=False, indent='', formatted=True)

source code 

Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.

dump(self, indent='', depth=0)

source code 

Diagnostic method for listing out the contents of a ParseResults. Accepts an optional indent argument so that this string can be embedded in a nested display of other data.

pprint(self, *args, **kwargs)

source code 

Pretty-printer for parsed results as a list, using the pprint module. Accepts additional positional or keyword args as defined for the pprint.pprint method. (http://docs.python.org/3/library/pprint.html#pprint.pprint)


pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.NoMatch-class.html0000664000175000017500000004100112322542216023547 0ustar barrybarry pyparsing.pyparsing.NoMatch
Package pyparsing :: Module pyparsing :: Class NoMatch
[frames] | no frames]

Class NoMatch

source code

   object --+        
            |        
ParserElement --+    
                |    
            Token --+
                    |
                   NoMatch

A token that will never match.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Each-class.html0000664000175000017500000004763212322542216023076 0ustar barrybarry pyparsing.pyparsing.Each
Package pyparsing :: Module pyparsing :: Class Each
[frames] | no frames]

Class Each

source code

   object --+        
            |        
ParserElement --+    
                |    
  ParseExpression --+
                    |
                   Each

Requires all given ParseExpressions to be found, but in any order. Expressions may be separated by whitespace. May be constructed using the '&' operator.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, exprs, savelist=True)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code
 
__str__(self)
str(x)
source code
 
checkRecursion(self, parseElementList) source code

Inherited from ParseExpression: __getitem__, append, copy, ignore, leaveWhitespace, setResultsName, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, exprs, savelist=True)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

checkRecursion(self, parseElementList)

source code 
Overrides: ParserElement.checkRecursion

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Regex.compiledREtype-class.html0000664000175000017500000001300612322542216026220 0ustar barrybarry pyparsing.pyparsing.Regex.compiledREtype
Package pyparsing :: Module pyparsing :: Class Regex :: Class compiledREtype
[frames] | no frames]

Class compiledREtype

object --+
         |
        pyparsing.pyparsing.Regex.compiledREtype

Compiled regular expression objects

Instance Methods

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties

Inherited from object: __class__

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.StringEnd-class.html0000664000175000017500000004121012322542216024115 0ustar barrybarry pyparsing.pyparsing.StringEnd
Package pyparsing :: Module pyparsing :: Class StringEnd
[frames] | no frames]

Class StringEnd

source code

   object --+            
            |            
ParserElement --+        
                |        
            Token --+    
                    |    
       _PositionToken --+
                        |
                       StringEnd

Matches if current position is at the end of the parse string

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

pyparsing-2.0.3/htmldoc/toc-pyparsing.pyparsing-module.html0000664000175000017500000002637712322542216023205 0ustar barrybarry pyparsing

Module pyparsing


Classes

And
CaselessKeyword
CaselessLiteral
CharsNotIn
Combine
Dict
Each
Empty
FollowedBy
Forward
GoToColumn
Group
Keyword
LineEnd
LineStart
Literal
MatchFirst
NoMatch
NotAny
OneOrMore
OnlyOnce
Optional
Or
ParseBaseException
ParseElementEnhance
ParseException
ParseExpression
ParseFatalException
ParseResults
ParseSyntaxException
ParserElement
QuotedString
RecursiveGrammarException
Regex
SkipTo
StringEnd
StringStart
Suppress
Token
TokenConverter
Upcase
White
Word
WordEnd
WordStart
ZeroOrMore

Functions

col
countedArray
delimitedList
dictOf
downcaseTokens
indentedBlock
infixNotation
keepOriginalText
line
lineno
locatedExpr
makeHTMLTags
makeXMLTags
matchOnlyAtCol
matchPreviousExpr
matchPreviousLiteral
nestedExpr
nullDebugAction
oneOf
operatorPrecedence
originalTextFor
removeQuotes
replaceHTMLEntity
replaceWith
srange
traceParseAction
ungroup
upcaseTokens
withAttribute

Variables

alphanums
alphas
alphas8bit
anyCloseTag
anyOpenTag
cStyleComment
commaSeparatedList
commonHTMLEntity
cppStyleComment
dblQuotedString
dblSlashComment
empty
hexnums
htmlComment
javaStyleComment
lineEnd
lineStart
nums
opAssoc
printables
punc8bit
pythonStyleComment
quotedString
restOfLine
sglQuotedString
stringEnd
stringStart
unicodeString

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.CharsNotIn-class.html0000664000175000017500000004556212322542216024246 0ustar barrybarry pyparsing.pyparsing.CharsNotIn
Package pyparsing :: Module pyparsing :: Class CharsNotIn
[frames] | no frames]

Class CharsNotIn

source code

   object --+        
            |        
ParserElement --+    
                |    
            Token --+
                    |
                   CharsNotIn

Token for matching words composed of characters *not* in a given set. Defined with string containing all disallowed characters, and an optional minimum, maximum, and/or exact length. The default value for min is 1 (a minimum value < 1 is not valid); the default values for max and exact are 0, meaning no maximum or exact length restriction.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, notChars, min=1, max=0, exact=0)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code
 
__str__(self)
str(x)
source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, notChars, min=1, max=0, exact=0)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Dict-class.html0000664000175000017500000004244512322542216023116 0ustar barrybarry pyparsing.pyparsing.Dict
Package pyparsing :: Module pyparsing :: Class Dict
[frames] | no frames]

Class Dict

source code

     object --+            
              |            
  ParserElement --+        
                  |        
ParseElementEnhance --+    
                      |    
         TokenConverter --+
                          |
                         Dict

Converter to return a repetitive expression as a list, but also as a dictionary. Each element can also be referenced using the first token in the expression as its key. Useful for tabular report scraping when the first column can be used as a item key.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, expr)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
postParse(self, instring, loc, tokenlist) source code

Inherited from ParseElementEnhance: __str__, checkRecursion, ignore, leaveWhitespace, parseImpl, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, copy, parseFile, parseString, parseWithTabs, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setResultsName, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables
  __slotnames__ = []

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, expr)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

postParse(self, instring, loc, tokenlist)

source code 
Overrides: ParserElement.postParse

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Forward-class.html0000664000175000017500000006242112322542216023633 0ustar barrybarry pyparsing.pyparsing.Forward
Package pyparsing :: Module pyparsing :: Class Forward
[frames] | no frames]

Class Forward

source code

     object --+        
              |        
  ParserElement --+    
                  |    
ParseElementEnhance --+
                      |
                     Forward
Known Subclasses:
  • _ForwardNoRecurse

Forward declaration of an expression to be defined later - used for recursive grammars, such as algebraic infix notation. When the expression is known, it is assigned to the Forward variable using the '<<' operator.

Note: take care when assigning to Forward not to overlook precedence of operators. Specifically, '|' has a lower precedence than '<<', so that:

  fwdExpr << a | b | c

will actually be evaluated as:

  (fwdExpr << a) | b | c

thereby leaving b and c out as parseable alternatives. It is recommended that you explicitly group the values inserted into the Forward:

  fwdExpr << (a | b | c)

Converting to use the '<<=' operator instead will avoid this problem.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, other=None)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
__lshift__(self, other) source code
 
__ilshift__(self, other) source code
 
leaveWhitespace(self)
Disables the skipping of whitespace before matching the characters in the ParserElement's defined pattern.
source code
 
streamline(self) source code
 
validate(self, validateTrace=[])
Check defined expressions for valid structure, check for infinite recursive definitions.
source code
 
__str__(self)
str(x)
source code
 
copy(self)
Make a copy of this ParserElement.
source code

Inherited from ParseElementEnhance: checkRecursion, ignore, parseImpl

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setResultsName, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, other=None)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

leaveWhitespace(self)

source code 

Disables the skipping of whitespace before matching the characters in the ParserElement's defined pattern. This is normally only used internally by the pyparsing module, but may be needed in some whitespace-sensitive grammars.

Overrides: ParserElement.leaveWhitespace
(inherited documentation)

streamline(self)

source code 
Overrides: ParserElement.streamline

validate(self, validateTrace=[])

source code 

Check defined expressions for valid structure, check for infinite recursive definitions.

Overrides: ParserElement.validate
(inherited documentation)

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

copy(self)

source code 

Make a copy of this ParserElement. Useful for defining different parse actions for the same parsing pattern, using copies of the original parse element.

Overrides: ParserElement.copy
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.WordEnd-class.html0000664000175000017500000004271112322542216023571 0ustar barrybarry pyparsing.pyparsing.WordEnd
Package pyparsing :: Module pyparsing :: Class WordEnd
[frames] | no frames]

Class WordEnd

source code

   object --+            
            |            
ParserElement --+        
                |        
            Token --+    
                    |    
       _PositionToken --+
                        |
                       WordEnd

Matches if the current position is at the end of a Word, and is not followed by any character in a given set of wordChars (default=printables). To emulate the  behavior of regular expressions, use WordEnd(alphanums). WordEnd will also match at the end of the string being parsed, or at the end of a line.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, wordChars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY...)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, wordChars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY...)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.SkipTo-class.html0000664000175000017500000004310212322542216023433 0ustar barrybarry pyparsing.pyparsing.SkipTo
Package pyparsing :: Module pyparsing :: Class SkipTo
[frames] | no frames]

Class SkipTo

source code

     object --+        
              |        
  ParserElement --+    
                  |    
ParseElementEnhance --+
                      |
                     SkipTo

Token for skipping over all undefined text until the matched expression is found. If include is set to true, the matched expression is also parsed (the skipped text and matched expression are returned as a 2-element list). The ignore argument is used to define grammars (typically quoted strings and comments) that might contain false matches.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, other, include=False, ignore=None, failOn=None)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code

Inherited from ParseElementEnhance: __str__, checkRecursion, ignore, leaveWhitespace, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, copy, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setResultsName, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, other, include=False, ignore=None, failOn=None)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Word-class.html0000664000175000017500000005000012322542216023130 0ustar barrybarry pyparsing.pyparsing.Word
Package pyparsing :: Module pyparsing :: Class Word
[frames] | no frames]

Class Word

source code

   object --+        
            |        
ParserElement --+    
                |    
            Token --+
                    |
                   Word

Token for matching words composed of allowed character sets. Defined with string containing all allowed initial characters, an optional string containing allowed body characters (if omitted, defaults to the initial character set), and an optional minimum, maximum, and/or exact length. The default value for min is 1 (a minimum value < 1 is not valid); the default values for max and exact are 0, meaning no maximum or exact length restriction. An optional exclude parameter can list characters that might be found in the input bodyChars string; useful to define a word of all printables except for one or two characters, for instance.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code
 
__str__(self)
str(x)
source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables
  __slotnames__ = []

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Or-class.html0000664000175000017500000005110112322542216022600 0ustar barrybarry pyparsing.pyparsing.Or
Package pyparsing :: Module pyparsing :: Class Or
[frames] | no frames]

Class Or

source code

   object --+        
            |        
ParserElement --+    
                |    
  ParseExpression --+
                    |
                   Or

Requires that at least one ParseExpression is found. If two expressions match, the expression that matches the longest string will be used. May be constructed using the '^' operator.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, exprs, savelist=False)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code
 
__ixor__(self, other) source code
 
__str__(self)
str(x)
source code
 
checkRecursion(self, parseElementList) source code

Inherited from ParseExpression: __getitem__, append, copy, ignore, leaveWhitespace, setResultsName, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, exprs, savelist=False)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

checkRecursion(self, parseElementList)

source code 
Overrides: ParserElement.checkRecursion

pyparsing-2.0.3/htmldoc/help.html0000664000175000017500000002532112322542216016024 0ustar barrybarry Help
 
[frames] | no frames]

API Documentation

This document contains the API (Application Programming Interface) documentation for pyparsing. Documentation for the Python objects defined by the project is divided into separate pages for each package, module, and class. The API documentation also includes two pages containing information about the project as a whole: a trees page, and an index page.

Object Documentation

Each Package Documentation page contains:

  • A description of the package.
  • A list of the modules and sub-packages contained by the package.
  • A summary of the classes defined by the package.
  • A summary of the functions defined by the package.
  • A summary of the variables defined by the package.
  • A detailed description of each function defined by the package.
  • A detailed description of each variable defined by the package.

Each Module Documentation page contains:

  • A description of the module.
  • A summary of the classes defined by the module.
  • A summary of the functions defined by the module.
  • A summary of the variables defined by the module.
  • A detailed description of each function defined by the module.
  • A detailed description of each variable defined by the module.

Each Class Documentation page contains:

  • A class inheritance diagram.
  • A list of known subclasses.
  • A description of the class.
  • A summary of the methods defined by the class.
  • A summary of the instance variables defined by the class.
  • A summary of the class (static) variables defined by the class.
  • A detailed description of each method defined by the class.
  • A detailed description of each instance variable defined by the class.
  • A detailed description of each class (static) variable defined by the class.

Project Documentation

The Trees page contains the module and class hierarchies:

  • The module hierarchy lists every package and module, with modules grouped into packages. At the top level, and within each package, modules and sub-packages are listed alphabetically.
  • The class hierarchy lists every class, grouped by base class. If a class has more than one base class, then it will be listed under each base class. At the top level, and under each base class, classes are listed alphabetically.

The Index page contains indices of terms and identifiers:

  • The term index lists every term indexed by any object's documentation. For each term, the index provides links to each place where the term is indexed.
  • The identifier index lists the (short) name of every package, module, class, method, function, variable, and parameter. For each identifier, the index provides a short description, and a link to its documentation.

The Table of Contents

The table of contents occupies the two frames on the left side of the window. The upper-left frame displays the project contents, and the lower-left frame displays the module contents:

Project
Contents
...
API
Documentation
Frame


Module
Contents
 
...
 

The project contents frame contains a list of all packages and modules that are defined by the project. Clicking on an entry will display its contents in the module contents frame. Clicking on a special entry, labeled "Everything," will display the contents of the entire project.

The module contents frame contains a list of every submodule, class, type, exception, function, and variable defined by a module or package. Clicking on an entry will display its documentation in the API documentation frame. Clicking on the name of the module, at the top of the frame, will display the documentation for the module itself.

The "frames" and "no frames" buttons below the top navigation bar can be used to control whether the table of contents is displayed or not.

The Navigation Bar

A navigation bar is located at the top and bottom of every page. It indicates what type of page you are currently viewing, and allows you to go to related pages. The following table describes the labels on the navigation bar. Note that not some labels (such as [Parent]) are not displayed on all pages.

Label Highlighted when... Links to...
[Parent] (never highlighted) the parent of the current package
[Package] viewing a package the package containing the current object
[Module] viewing a module the module containing the current object
[Class] viewing a class the class containing the current object
[Trees] viewing the trees page the trees page
[Index] viewing the index page the index page
[Help] viewing the help page the help page

The "show private" and "hide private" buttons below the top navigation bar can be used to control whether documentation for private objects is displayed. Private objects are usually defined as objects whose (short) names begin with a single underscore, but do not end with an underscore. For example, "_x", "__pprint", and "epydoc.epytext._tokenize" are private objects; but "re.sub", "__init__", and "type_" are not. However, if a module defines the "__all__" variable, then its contents are used to decide which objects are private.

A timestamp below the bottom navigation bar indicates when each page was last updated.

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Regex-class.html0000664000175000017500000004604312322542216023303 0ustar barrybarry pyparsing.pyparsing.Regex
Package pyparsing :: Module pyparsing :: Class Regex
[frames] | no frames]

Class Regex

source code

   object --+        
            |        
ParserElement --+    
                |    
            Token --+
                    |
                   Regex

Token for matching strings that match a given regular expression. Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module.

Nested Classes
  compiledREtype
Compiled regular expression objects

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, pattern, flags=0)
The parameters pattern and flags are passed to the re.compile() function as-is.
source code
 
parseImpl(self, instring, loc, doActions=True) source code
 
__str__(self)
str(x)
source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables
  __slotnames__ = []

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, pattern, flags=0)
(Constructor)

source code 

The parameters pattern and flags are passed to the re.compile() function as-is. See the Python re module for an explanation of the acceptable patterns and flags.

Overrides: object.__init__

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.QuotedString-class.html0000664000175000017500000004735012322542216024663 0ustar barrybarry pyparsing.pyparsing.QuotedString
Package pyparsing :: Module pyparsing :: Class QuotedString
[frames] | no frames]

Class QuotedString

source code

   object --+        
            |        
ParserElement --+    
                |    
            Token --+
                    |
                   QuotedString

Token for matching strings that are delimited by quoting characters.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None)
Defined with the following parameters:
source code
 
parseImpl(self, instring, loc, doActions=True) source code
 
__str__(self)
str(x)
source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None)
(Constructor)

source code 

Defined with the following parameters:

  • quoteChar - string of one or more characters defining the quote delimiting string
  • escChar - character to escape quotes, typically backslash (default=None)
  • escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=None)
  • multiline - boolean indicating whether quotes can span multiple lines (default=False)
  • unquoteResults - boolean indicating whether the matched text should be unquoted (default=True)
  • endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=None => same as quoteChar)
Overrides: object.__init__

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

pyparsing-2.0.3/htmldoc/epydoc.js0000664000175000017500000002517212322542215016032 0ustar barrybarryfunction toggle_private() { // Search for any private/public links on this page. Store // their old text in "cmd," so we will know what action to // take; and change their text to the opposite action. var cmd = "?"; var elts = document.getElementsByTagName("a"); for(var i=0; i...
"; elt.innerHTML = s; } } function toggle(id) { elt = document.getElementById(id+"-toggle"); if (elt.innerHTML == "-") collapse(id); else expand(id); return false; } function highlight(id) { var elt = document.getElementById(id+"-def"); if (elt) elt.className = "py-highlight-hdr"; var elt = document.getElementById(id+"-expanded"); if (elt) elt.className = "py-highlight"; var elt = document.getElementById(id+"-collapsed"); if (elt) elt.className = "py-highlight"; } function num_lines(s) { var n = 1; var pos = s.indexOf("\n"); while ( pos > 0) { n += 1; pos = s.indexOf("\n", pos+1); } return n; } // Collapse all blocks that mave more than `min_lines` lines. function collapse_all(min_lines) { var elts = document.getElementsByTagName("div"); for (var i=0; i 0) if (elt.id.substring(split, elt.id.length) == "-expanded") if (num_lines(elt.innerHTML) > min_lines) collapse(elt.id.substring(0, split)); } } function expandto(href) { var start = href.indexOf("#")+1; if (start != 0 && start != href.length) { if (href.substring(start, href.length) != "-") { collapse_all(4); pos = href.indexOf(".", start); while (pos != -1) { var id = href.substring(start, pos); expand(id); pos = href.indexOf(".", pos+1); } var id = href.substring(start, href.length); expand(id); highlight(id); } } } function kill_doclink(id) { var parent = document.getElementById(id); parent.removeChild(parent.childNodes.item(0)); } function auto_kill_doclink(ev) { if (!ev) var ev = window.event; if (!this.contains(ev.toElement)) { var parent = document.getElementById(this.parentID); parent.removeChild(parent.childNodes.item(0)); } } function doclink(id, name, targets_id) { var elt = document.getElementById(id); // If we already opened the box, then destroy it. // (This case should never occur, but leave it in just in case.) if (elt.childNodes.length > 1) { elt.removeChild(elt.childNodes.item(0)); } else { // The outer box: relative + inline positioning. var box1 = document.createElement("div"); box1.style.position = "relative"; box1.style.display = "inline"; box1.style.top = 0; box1.style.left = 0; // A shadow for fun var shadow = document.createElement("div"); shadow.style.position = "absolute"; shadow.style.left = "-1.3em"; shadow.style.top = "-1.3em"; shadow.style.background = "#404040"; // The inner box: absolute positioning. var box2 = document.createElement("div"); box2.style.position = "relative"; box2.style.border = "1px solid #a0a0a0"; box2.style.left = "-.2em"; box2.style.top = "-.2em"; box2.style.background = "white"; box2.style.padding = ".3em .4em .3em .4em"; box2.style.fontStyle = "normal"; box2.onmouseout=auto_kill_doclink; box2.parentID = id; // Get the targets var targets_elt = document.getElementById(targets_id); var targets = targets_elt.getAttribute("targets"); var links = ""; target_list = targets.split(","); for (var i=0; i" + target[0] + ""; } // Put it all together. elt.insertBefore(box1, elt.childNodes.item(0)); //box1.appendChild(box2); box1.appendChild(shadow); shadow.appendChild(box2); box2.innerHTML = "Which "+name+" do you want to see documentation for?" + ""; } return false; } function get_anchor() { var href = location.href; var start = href.indexOf("#")+1; if ((start != 0) && (start != href.length)) return href.substring(start, href.length); } function redirect_url(dottedName) { // Scan through each element of the "pages" list, and check // if "name" matches with any of them. for (var i=0; i-m" or "-c"; // extract the portion & compare it to dottedName. var pagename = pages[i].substring(0, pages[i].length-2); if (pagename == dottedName.substring(0,pagename.length)) { // We've found a page that matches `dottedName`; // construct its URL, using leftover `dottedName` // content to form an anchor. var pagetype = pages[i].charAt(pages[i].length-1); var url = pagename + ((pagetype=="m")?"-module.html": "-class.html"); if (dottedName.length > pagename.length) url += "#" + dottedName.substring(pagename.length+1, dottedName.length); return url; } } } pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.TokenConverter-class.html0000664000175000017500000003741712322542216025206 0ustar barrybarry pyparsing.pyparsing.TokenConverter
Package pyparsing :: Module pyparsing :: Class TokenConverter
[frames] | no frames]

Class TokenConverter

source code

     object --+        
              |        
  ParserElement --+    
                  |    
ParseElementEnhance --+
                      |
                     TokenConverter
Known Subclasses:

Abstract subclass of ParseExpression, for converting parsed results.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, expr, savelist=False)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code

Inherited from ParseElementEnhance: __str__, checkRecursion, ignore, leaveWhitespace, parseImpl, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, copy, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setResultsName, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, expr, savelist=False)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing_2.0.2_docs.zip0000664000175000017500000120545212322550056020504 0ustar barrybarryPKaD=(`api-objects.txtO6ϻ_#e/{uLqzcQ۶<yc:j."j>ճxhܫRk+ωP*ʶ#Ʋȁl[Oi9C]CQ,ޟWs6_o6^F{Q/~]sy,7Z#˽R[|tTNq|* o(ρr>uVB*}SC^6oߎ1+sIXV\55hPMEfRSOsOEvOǶ< iieEik=z[> k46am伪7/{-yk'۸٫i2> g;1cSQKy\˶NV(k߼M84WY/NZk30lkҩ#OZe~({GB Kё(b*S|s1"6cZ)h FE-A`vɊ A²xpz"Z͞Xod4-()1G{/&s?}*}Uh7f־<7kFyѼ9~W~5QTsQ3:2F)+"N!HטwW;pQ~A~{ϩi3bd5#ljܵȑ,]=?bΌ1tn= lvŗ:ς^ΑTvΦxOT[艫>yd`# ()^UxըMusk/ļ&j$Y$zrRyp_lVH[K>fе!lsþ]^iuBcaz)@>ބ9Ra]~_e'i* vnt`c @_6 T.1_x%sKg2?u q/ٖG2.lb:ZHWJ_o^{fKPmg>dSD0uʳj$!Cjm@ ^3KVt5_YYuBNRP N"J ! kvǘoû}̷ۧd O%'NO3Mn?8ؔ ywV^21N/%xe%C6n/c bT[h]1Ew3LH9:k+d1LSYL-#ؗKB@nΘVVRL ҫ4He6zƈ\b:szݐۘ( yUs9p)Dcipmxf5T1Q1CBc8WTޏSp<*NE?lDbOtGSsݏN^3}1py,#’E=DX25DRNp"8DpSOpBp=A/ NRƍ54O<Si33:[ֲd(bB{]`IbaI* 0,'fci.9p}/$ƋL*=Bja% S / "Xpx>f B q`!q?bb}n78 Byh[Pu4]3*ŔGAsV+bL!k@! @1+\`*y,a*B E+kbYҌĠڰ FdbV^`\G_x~lArBa3aNVRc>Ԥ`I=\ ëI=w[#FBDy=-z^5Q /zʅ憦x:嵘R(!#;DFU9ʇ9" 𹈌u067H7.nnhoFztDAE1tC2e=I=H=YS%(xqmEu M tk1Q1ԣsX!׈Zy;Do;Bw_ۭq&yy:Mu J xk$.{H 3@"p5j Ѿ|IOpIڭ]Hxx&K7a)-HpP"L`Hls-qpyM6"λ&9eD3>!$C)S=JF1A8~zq bC{-b/9Á%^T"F avpsCz\ @%(|r8wn{G<[L{D<7 _tKT"J:PI*<8#FI4hh$b^425\|ay ,ID2f#^Lu,`3Iw;?0C ?-/%2؅ |ygj!pY%b\xy`_[*\I0U$mϓa},DPBSE!NPj.7%(xcߗoxR(I:RQ+Pba1[قU`+  -4tA> З$و"S& #Xp^x%C jNTrqDa[P\aw Us90L EGV5 xF廘R(I+4ϼ|$ szXESv-ԣ'„c0.# h; H7; :Q#DL/PDU~mPaAA1_iXIG?fp'WA*,3|q`C$\~vo߈90o"0)Fs5M͘ϰpR ztjg&ᰥEtJJ«JĈwGq(;CJQ~Ju4]3*GAL2_t'ZQDoQt )V19 "LSaE%#ؗCB@n_.nY^^,Q&MB%?#qd$vYNq>zw%%!Da/c>QT$ DO?gAO!Ci+#9ĸp>ZنbI5[CRSI>b:(8 IJ1$3Wd%g>/y]/ JtϨ&p= "fGGbLt]pyFU<23~qpT~p(g; "h@zAlONqǔ屉G? ??|T?  Ab Ci-A/ B笒 X]M1uQ1CZAZcWM+tfVUbaH 0,+g*4Wb{'K.Dyw~n_ VZ$V V{bcX|-颀XA[κ%Npk'NveIV/廘"(!J J1E+nB @Qn# >"\tAEQ !"h@zAlMNq䈞bj§>jOnH(Y Z D0P}>$$rp@*Dœ7y:xRJ(yn^1׹%ESdpl7̋x-h[PR_0G&q-b !OXMFl# FQZ0Kv6"/I*HB`&K(`pMҽYKf/.@b%ں  F !?ds(ԔfIl9'Is5MYOP,!BqGw~6~"hF E6@"J^텘Kѝ&1TIuFyAnkXZ `H&`4ړFUs90 /e;{D=Mw1UQ1\f~ѽ-Y."^`5]pW%G>3N@+A|_?iNK3 H1f^Lo,`d3I6w;?Vpä_$G0e0$cëI/MX*za a؇$ÖE1I+Ad$ Nh5a8%vo^5T /o-[w5}s*ԦGAsSN!9#."^`rA`j&)$x@-퐅x#YI;hzB"mO"EHSP QEi> Vh7GD<1ٓ$!$!$!~[$!CHBD)#IB! ! ZY {[XMMSTm߭йt:wКZGVVԾ=6>|,%]B`EEL$iˊu$-N\H dFZb!#9yQG0bhA^lSC5@Ĕ] y:S /2zgF9ԓm }"7x'7܈hjeܨ4 )TGA̳sM8" Ԋ."^}`Իi $.wr 3#pnQF5c!jE+Sș/(gm 4BJBT9J2P??BwV : 9P,z&9 IyRIK?>z^DJQ~>kblݩv Q 'p Ӑw!9, z5HwZI!>TD5ϝ!jfF@ bAqZء'D(bQ[ 5{ ĎF;Z!v؋;F:j9 1ֆ.*N ,>3eq8j:5%9&`@>) hYF$ltGV`thj?tz/D3Ktx:k<ITˁadAGG[!phI*b(IC3>zg9KrZES$wjpMN 6'3. ]^cn:ܬ:CRr>&s&ësQ_W?N,W FI2FY_6`eDիr`H*Dusⴝfî\g\q9캻ھ[:A[ 1Ho#WpA7{2~~)>@)_J#]O/Oa>EG_ZD,ٮ8[f|e9ƒ*7Lc q`*iF"~՛8w0 IxoF|ocт=ܫo _k&&,nԦG?^tl3 ʁ hS+L ~r%y}o!Q 7|,K'_ ջkjwQwKlSpW"~srDU׻| 9H S~DeyU[F >俛`SJ׫ JįMQ"$-#!Ŀ-yhC\gv۰U"~r܅=Wde4Ԍؕ/V2X'ۻY̭n՗uʅ¯_e/zHy*+8vdέx"Tplx"~ +:#렡A 0<>1qT'tnDwinتEғ |ɑ>nld>?[4>F]$j4Y!hb ؏3O;ncR  yJCbyD<ʰAғo{S }ŬzK|tI]鸺sz& 4D /|ߟs~HzM+ʋ1eQ1AslqMBAEL6h+u#^0D D v5%WN2& h 4H!Yc,F&4q^I呌p1:8Es5q«>jc r)m$`H\O~%)\.$>ruxFmrQ /3tK*;ef/̌s]fPЮ6.ȿZtw|2fY;c* byMUOAB`EELh+u>Bh"7dd/EvO4'1p5"pwwoG9H ߀D=+G=jgCs;ƙ:Q#DL\I~hj =  H\ȫ(Q9jJQ~(a }N)2= "fB]TƂ"HX:n2&X̱H\!if{ \tINCYgh!Iw6RԦC\ CDTנLS9d8X'$;< an>)06CMaQO¡Hh*"F8=ovC݁$W0U2'*YpW<_LxD$AE7(bB{YR)BTh̐U[!X~U RD,R$X HQּ}1e%f#9d'\?g0z: b?>!^ aAKڞ'|Y<$ƌ1w+j.7%(UrIU0; "fbL-tcB0`f>Hcx! B2lxA0 􆈡x(Ώك{"\$bEbxxI`tQC/ b b0CpوojڀTދ)$p_} (].~E5lksyӶS 7I0L'3j O&F+k枝dYİabB~ECE\2ppQv/0"./WLp`o'Y;\?hyMVRQc>$ d\I@\ r]$1HuĈwGq(;\DJQ~\ 3M)GAL"2_tZYDoYb&9^ fEdb:h:@(H9410{Td;QǝS>b>QF# 3 GFCO*0F5qA 'd@I >b"(I1cPA] mˁM ʯ' x2ʓ1Q10t2WEJx!j}x_D̍88@B) :ſHRoa{!2i1E\2pv/30.C= mLDR4WЌY $pGwT1~taj z -E^ HLR11~k(p 4$Pj.A_c6( 1 Iщ1 \BL$mˁM /H\/hnhZS^MOa`]1EޠVT|p,@n6󗭅t¿jM M4?8 ;Ck9/1,zK|jW}Ԏ Pj8<R~$?B@y5A_+Q.~< "fBL/w%ESq=N~P1(*H\O!fE:e̢I;nlaAE?` C,) LZ\?L^Q9x/G6@  Hp%uimbVA@A_Jx*4ϩS3 1~Eկ8M~`f">@cH! BkHA*r XxeX(Ώ̓yb\$VEbXXxxI`tQB/ V V0CpX|[x[<`LwD<7X\Ίn X"袈)Bu0E 11°8]F %撝#gv:Bddc.݋&d[{ 8X8h r6F 4e0c!>S*` @؇¢B{c^ HR0݇"~k@p%$Pj.A_PKaD'v Aclass-tree.html[s]Lj;c83M,YSr%nd;8R.{>Nmg|,]GL~IdJs)0ʈӃɟ^ ȿٛקd0 ONsWWoP@PH 8{78 7phjrDǪ% }<ɞjZ?=@ U21 +h49'MO5yř*ד} Dx:a:f HteHP1 1}:T<3/?%uVaL'Lf2Z"TǃU @`p M_,ݛ7~\J7?E[ yw/O^#N.eC`,a$D.gT L2CV<21xx,I29)U|uFC/L,RE s#W2e]S:1bZz](xXWTFyFy{&]LqPJ5e<ρ %,4uo ّ1a<Q*ytX8y C e+h#1X' E?zQ|MK\s-omrj>o2U71t7+@e]δ~xP|Zl6W22&&$<**r~oˣb@rE2ŗԭUpmi:uSf?Ow)΅j ,j60^xWdlXH7` mX fo&:'NfϤ\E%MOYɭ >MktJ~grZj|08><)}] ÚC%| 9()X# ӧG,-Du`z3JmȌjf$`#O:LnB|g to;M*T 7̥7MH3bCvMmU.t8z vnC:K([X~rV) C#'#@Xɕ ei5x`HJM)γL* |,7LٚJ*K|A jhrOv6t(PXvlifC݁6<}}uE\":"p&,␖u^tܓACL5#.Q+~:VڙpJS tnɺe--L).2~8y` h:oJKiBBZ֭If,B8O.f%A^[WҖJa2,{'(vv j^Bev;@l0%BX6FGY`I䕌4ShA*a\$sV |}P46?CC?2sŐ5b"A= a@0h<1j]3KȣUNE ^BORgRF!{9p=ݡsXHS,a)$nTҝ8i&8Mؒ*7d_Ꙉins:R "m>Ne:2Q-XC)?/Ag/f}/d[٩D;Fks(C,Cqp=R: rayy1/ܽ7Ȝ ]A!ѐ`e/CKZ<>7;Y Is"]‰ur '⚢CU&rq.عz+U{X(%;`3 ) )h12쌬pˆk]VkShm{R z}+{]uZƑ5/(G1%?9Tµ['g,wˌ[yMX;_ЗyfUںh>RYef˵"J-isb;gmWT3^+fnĹڨ v+zndV;И_i'OD{u"wZ췜]ֹ*Hl M:FInZhF/ۥ6^ph+^Td߄QHMžj{pF7EbRa2ȹf0ҌLyXu2jIϑ4yNA%ڙN?`j {NB \17BoVѠA3ӳi?R@f.<&+q&+֎Fek ͙b܀ aBXD^\;T>%!+>a7 ^E={>_iݕ- pyȅO^}bᣣ{ z?i|EvwU3e[R %:w\g'.( i`xI\riXtilR!8‡ Oq17 T_iEmz[x˚-.qgTg 'V`x@Ҿ>?_>V{nHu#U}~~)LpD>GK|>]CԆ r؍9j<4tfb8CE)nIтu8ri'Ur=*H#!&3}S?KCU{k\J~\*/(~]\bRg| ݌]ꆹ }z]"vRRx _B\zF$ֵLR!Tp0 V8(u=؜9vU{|sDPܩ[bQN Yԍr-Hu_FڐJue OXtq.Z-4NB" =wǝ?4i:诋Bu0asS\J\z/p^w#OF!s r)r~t'c;ojW#,4yr/ u\\  VD;6ֶwЋx/. ;YBF{%#W66) J ShύZra#>0ϖ^"#G\nՖ <D.PkixWP<bzȩѿv/KPKaD OT crarr.png sb``p ҂@ $SNR:%%E%y ! ! FF Ff V&V  <@}%8X5.^ qxD30aƼ v@AtG_GY|= i& o_*rIp`Hrfs'w5FT'謟ߐ'ҞU3+R\9>}1+±-SB-XFRq+9qϛ=jڳ8Kwul`߭1a5>f׈7&2 _Shf_63_ښ]}Č2h1 ,V) PKaDi? epydoc.cssko-;dYV@ A;GY\f"wfǝEʃay{vg'fɔ}vhs!/ ce{R^`Vd,ݴrxx &WL%ux%oۿ%FL' Rvpύp]}V8/e|L ,W뢞uakQG { 00R p\\k^ndXɺmEλ´`47痋/o Ez |1 #|Y >RU$ҩLD|'6S@ֱ|@xUVZ O!g|-؏``_wU):'g5/bG+y6g^8z挷,e%smr aX* Mlɣm^d.{6/jA QlI"ܞQ=`s\|z+;ڴ! ~ .5Uc%Kp`_r xG?hYk-7 i&n='.c")< LǫTO/IʆLéhУ̍^c_M;Oa,(CV ;S8,jdػzя/H;Dv)8v<0%"]d2@7Or3z)HXbp@GȔ$ORAWdGw l7uo\+aZp1&r()5 @Qi3>_o7( zL.!<_&,Kܒ[ßv32w^Dyfc@ Hb9ripON]Zʗ`'~b;325M AlOw&0'́AVzOZY / +;QMmܴM,P]L[$'qG1y%Hlxi l_RTpf OP uY?@b+wW ߥٖz˖lQ%"":!`A:3vW.gOHh+%+f|Y)LSv*XHTe"8,|[d]J<$ 83Zq5Rj ==O'CS1"* f^6#=엦&c]nM4xtY-CoE7= zIMohl Ked8Ϩ"^^ @<_Z\، \!?\&81͔=׳2j<"=8.b^_/{7zP MxٔK?#$mSr`QÂj An3>R7$S[&ENx)4IY<H<<='=FFg/#>c ;+^ABl B7&E8AEgIbK7X7~y<} ʯ:ɮ,͹joY=D(+PYz A2/%mNM?SnAuAu lE+L;Hg%DT~R(I܌r\Y@\*ș>qJ B:xMq#H~.DBxh޷;Hf9ho ;ҜP$zף U!R,"}x0_R178q8>C>shū6]}1n"DX6$z+0CouspSJW@rqi Jm%3_1- p&[E/9\.4f|?C6.*Vhޚ}=@(f#3m.X r'p7@a]L=8rKNyH{|YI\v0b023wDN PU5tFhW(x.#:RqxAOH磵,Gx3m1vU{OhnWLp!j^5tQ(iv33R%L`qdtvYKxR^g=FQ#[lM賁'P;V|gh4(# @-S|O)[T;#u vp3S#CzS-OȊeV-?$xƎ,pdMN!X w3am.7e|'bPݶ&XwfI<e#j;gH%yRe&O =iIISo L[E%ٺ44ǻ!ADpuʽLgO}{pfhnlX5vDy-7td~N f|}XbcPTrhWʪc//&N춰{r2ܺݑ+.^cN؟uÎ|F$X>,E&V]M } tvUnϪ>}۟iHנ#yIVl'7Y #CևEb>;{l%o~Pۮo uU''qE_J-\fR727UXRT9A0;y$Y0Kö}F'R%,wQANFBw"m 6̺X"H<< ?͎4f0)u!5/gF56,.xN2P5& RKo(NtݲUh$(T@0%Ƅg)h[FhMJgI-+w&1-+X0 H׾ȡiIi\T4 zQ(dpzg!͈3"uoZm&.}v=* +R_xz5 ѣCQ=6}<_}AjI$1\tU,bD2S<ɒlU"D,%BQ1ǧ"/.~FDY&3rv?|Gj1Xxx`_ry`xJ%&8[rJt1,<k,DKo,\,=[| AF`=L-,xZl c Mt1A}UUH,y*]RŰ Dm-A!"x(=LXHc f6:z!rCe#KtZ3ˈƭTZ,1/Gp6΅zceG(t4|A{$#0t…XarBt<Yzl i k1!`:8Hpp6¤TeAVCUw/V8 N,#&Ӟ3G5DV$UeQ5\gNI_lDU|}qs=^cTf|? 5a,[o\ÌtluxQBZF5:yYH{k!z9^ jwC7?R-Ձ:PV-#{A[Ƶ85fS&"(Q?*r]|'=LS)~|u!fHvWI'4M(9X7rP*kO ? LxlߺhdPKڢṛ뾂GxEWh<ݍ' W7(ī UdGb0+AmҤ*I@3P]9k="g&,cȌ&+ FF`=gͨf;Ì JzT sӱxVgu57RKwp!IToc7Y6ǼB2;YUbz!BԾp].5Vmw6I<.f`!33kȳBVF8i;I`xM6PF7=hB(|Euюo7q^kde!pUeEIҕĖ&4UzL9mE>GJgh-OMCtOja_<6y=öQv6qz&Wy~nN@28W8p1\o~^vGaH 3+DYUY~-tJKEnG W!U)x$Q2Y&2%2UL݇FtZq'a +6Isn/0`'K~NE!E AvYk1ɦ \_`ImC .Cm@ؘ?2;zBe|3)SELm +6e3X|( ?=W N?{cօz_E"T7ezXDod4VU c S*U0}<^#e  lPŌr7VBzސD 1oj5f#k(ݽ(ڜ78gZ@Wf:j#B;K/磞Q-U銪HŠ.twq%h8`g ]TJ L,h@RJ/D St0IWmZ1_*嬏e% ǼW kOj!AOToV9QKnHA,{L3`zt$gowgSouo_PKaDq3Q frames.html}AO@$lJ-ٖDhvM.iW i #yߛ&oY} uj2WҸAp>bG\M^ˏ֖M%z& ?.gx(,%сC.] C `]Fv;$ʫ)Va:.Iݢݩf$9OXesvMx8A#-|HMΑ7uacT X;hG"Кk|d_6+8TWt%?ޮ XA9NC^q`pz':/mPKaD| * help.htmlZYoF~e%y #+p<Ɍ^Al)6ݒF[U}e~[ ~$hrU6BBVx3Q2+uuZh7o}[O&Lp")Pqk"=mu$4. :rE)RKc$T腥U,sӍy͆Yjk zdMP؄M~=ǎm%#kd]g1rnse*6ܴmu4S֘uς͸ +m3R@vD[]߭; !yWd%-W=7ɬ,cp *ЅWւxnW:9{ 2wHJ3 {uSeZ6(K@΀0\TEYGB*C[ewKvtv;xƊHa*9nSMOM#ƫ̚<8U0y%MuVFVXTʑ'rm:ظfmsY+iW8CB:F?stk[P QZj]r{]e@ȺtaR0p%jXc`6qYh㩬=5ɹ f .#AP^yzu6~ WgH\eϜQO\.!$r6>_ȉE>SzT}P2O/ /ߢOs4A U^V n%Jd{;TZ Yh8N1y'ӑ_ XE܇ mn fn>Bqǡx'b5wa7EoF@dK}-Lڢ-\׾QuJmc%+mEe`*.W@ n'r^!"Q@nK[@sAdzJ:Bc@d஡Zez Q(%'(;DX*J;_d4ShB.ۻg+H1 ~IRE \F]kaV$ДCc*S-Qq>yC2gAA{kZ[ae(QP-MINePgJ;=#i7h7:l&B(R@}&cA!+6pkv91 BebtZ0 hΨ?h30-Wa,L,'vi-$j!]ۈmoVg(V583; oَfG1['!?þ4?*%:}~<xf k#kh D5 mXPƶmSl#_ÞWl@??Hq4Bk6;"%4AxC$17T*a@/UP;!ggL%EҧL Kk/_?(* }\ۆpǗaP̒PhFQIV Ln ƞ0m:XgШgx"Q@+vS0S ɹƨH"Q[w ʟ߿r:ض_meWm!ZpBJDm~P4)R6O8M%x}5r^O/:TC+/Es'f{ -*P/a8D+OawO^|L&+Oaq^%"PXDfC.l1wW4rcg&T4CҋA %WruU 老>Z5JF4-Q:ފ"zߧ+!̣PKaDaW;tidentifier-index.html]o8=V\7q:]`hN4Ib2ck"KNbI$JVCJhL=?qϗk<0r||`سMLَc9ۻ˓߯Fƌ>`pd0xwA_`܆ȋB_`ta?:xa/yG۟I$yё9#$e0x~~~Y2 ~!#;t~O4N_gdZqp s8'Kc<}C0UFtd]d?R`4,Ddǃtd+J#?b8^ۣo hbvQDࡧ1 McLI)LȌ;Ӱh"(&kk(@v|Qhr(e/h<]%26ڋm^$GAC3h4XUIn̨a499*ƌ dhIIQe|\=ZzmQp4S `k xr"$ҤUMŇA Lyf$aoό5s&xg#'D֭$k$됾Kۏr9C!Ds SL==G(.QJe #9sX<}7jPMnfƋ#rNv}eO?7-nٛ$DbJ*j"֐&x]~bZ'B3wyȴFy٩ieM}^쌦?/i+/ʹ~Mw+q| mW4U(d?mV!pkLE-Xd.|rMJ Y?3 =w]H3T^$Achvv<-}B+J[@ ڨGgq5ڴܪ9:L/!'b(è9 b!] $?"bN0"MiĪm<4C8M, 5nl'Z0Hfe3M25}Jqzef/3b9n#]ț!:%I/5s~ %5V,k+Vk7QL!O 6nHHVNg&Nϻ݇ɇ 5XQE]&dB&syFgiŔt(v2ѮM l[{řw ò4GmʈᕟqZfSo2LDtC“Ŝ/$i[ l}lE?2N6\eP >sF@p-K0-="ڌD{,g^?p쀾xr-+7r;\Oen6EbxܠmbbAl$ub_p'g8`,U}~SjGL+l]3-~:5qIl"ܾH軗8ng&yd?u\gJǮo?RhQHMf_vf^@Bl쓁[NI \YϤ ?D/b+rKpz n&l;p(nfcіMcw1zwl_j:'?te ӄ@S7fr*p/|dI+iӢg}[6y;\BY,JZ:[*{&2>eb`ƅӷu=_0!511$0f%0@ѭ"]CTjO6c=c9zl[4XFjގ * )?9"k fʢk ]gm pė?1n?Pk'7Lj52mXoHQx ":(dU'#nId.7úVQDQFe QڤZotᓡ]"D2T9 rFn!Õ49X%'FzF};OXW Y$lOħ>rmW/)%Ï~(J[ DB}Gúqo@yRLS`h,XY6ٸ+l$AJfRa pPοrlWnzKz6hf}?2E(DA!`Chr鞔(%F V%8VDiĭ;ow VܒŁn48 u닁Yzr+|l:*J^4I֯ijdn#M.ݹS-KOc (2͛MJ!+'ugrv@ʸ;GK9sVt%M+=,ҩK'OUoW\ kq+:efV2KV"Bu6}婵v~t[_+ނJjc.G9`'hpAi Z΋UoZšTT#ͭ&VJD S6P俠KTjUԩܬzٓ_\otA!,X龺 4P(Z*tSp歵9q:6 MK࡝KLgn2ҖSlRR[")Dt?9jY[WCc Zb-ULY6QxHpȚ|ya ,ljJW5-,ca=8{7[B-aCfR#0uMW#Zlױh?J 5 a_0h|1e$֠6GAB2n7Xe-ʺ Xް Դ&шQB-Ӿۼv~*|2OXpC:0oD *mSMp@yOWcܾ1޶ʜnd#/i -ӽBi Z,6'#gY,ߡ;"!FsUn:r cڳk1|Uv45ݵpSԏ< ke|kpؤ|gDn]ʿskdt_WYl8 @ Qxdۑ 59:9uz)''ܐ@WNV앹1%PnwͲqës*ysw9n5y&d^ m[*7h\j83!sڑA5Gnț2_n28?ym%6ެa`fɇEW9*~m]fUWnK(.PKS=*?Ks+US )y $-Y$\k A"m5=~YyуΓ!' _ClZ3kMN +73*5۟͜i2ѾgO] nmiq=fkQ_LK_}6A( AR \[(W-~Uj+o߾u[]!yM&,"Y6(x`EhD\0NFZn"lӸQ/nZe\8/nEUۥ꡹.w%Sjc4\VcwE^WeG)fz`^d-;yA1>RYܘ"jX=M* L5a&e"D_ݹWJ9_Wy]8Q95xKF' jX҆ŸW1P㖨W)쨘uO-_Nuw]l iԦ]qWrnd&w? c>+Unj\V`rf zqXC41kg\ K 3WbaaԙĶPP\3T;ƜC1)YΛ![4uWbMcoK@ft*w(Wɯ9%J9[`o`V4l N#+[/ J(%떉XښE`bWE-gkvQZIMΣ|'j,/ׯaɓh 4uX:"i\{߫{_ċRxrs[P!.'$wɄ'n0% 6{񀹧d .Y٧uR𺵅c]Ϲ%myz9a30[-*$I[ۜ:bxUxd|̢3o,Yug?18T)CN=m*7?@#4ert@IԜ>T&$w_ ?L?db1`Up>]Ɠc,*eLX5O8dny\dpx9d}S~ssH1bsMԴVbE6 T^sL;Y/=3 Vv%[થqo[V{9KU{kq* [,2II3B9oիԧl9#Zk=mɬEU[1W߿nYF|/&EWt +ZayS|`s(Z1{/ms,C5uOI%28 gW ^Qvҥ=*'}S0 {z~^ El.i0Y {4n-#8dh&[|!|C1}o[yϵa׶[1!얲:VUM?h}p~u V (1n+hGm}h>*/l_cG2jgg@vܻW2.mmHYRbvy~VL8PJZ&H6MױÿY23QUShyNy\^-@J W^*pd hEKMZHIB?&V^ޞq$g\ ޞ]^k={{,}I<4H?0Ŀ98`ǮɄfc>F v|E7L#sL&.b?&C2f!Ju.w $ !no7Jˢ:Z$jデ3k& ?.vѦD|n>d4 ց|Ҥ3jMqx1cBg:#Y6ZiRb6GTWV^Vi8\fku>.VT\̗&vwIQZwrYMﱇiOˉoog,OFM@Sq#g5Kf䐓wmMCuk+ jg;]Zhg`aNF]]dՄsHYy^ ˅PKaD-omodule-tree.htmlWn8}W̪֖&Ui KP JYl$R );;$%Y6>DΜΈۺ5*ͥXYL\d ( _90< _._ߗ7` m0hxkAS3&Ȏ'^1in6x&*x Vz"b n*Lȼ.9*r~JT\܀jhP&RaA`6,:mp5{ox[3VII0.NT[HWZ$cҊe7yh_ZXGѓiԧbM8g^:[^{ /~?,3a),:N *Gr().Q0 a.,ʢaY'k`M|5 Rw>yؔ"ͳߘ k #Jlx֎3Ǟb!;IR!FQA)KTc3) ;s)0]3;gcZO6(: [ᝤcGW٧d21yD;l=DʝJl7ܢ<6 -XIM8Wc3ddӅ|?'CA`\޿m*].̌./R) ~YGBVHm_"J~1~O㿧,W,$q׉˜WֽJY)m~/t`L1RSqYkۅ}HSr0쬊yt?+$VeMb:TzFIZ@efBuۚ؎\P9hJk0r,@̡=ƊKT`_? V?}czgA?n~vVXk/ O9[pglRVY`~ qG޼3U%U57;JwUnZ*ÂnL88:DWv'_xC dj I=Z!pA=VU[ȹn*=J1c+S;o )Y`J#&}mOkgk+NC/9x_Ck]/ٚdRp hu}8JnΝԣ<dPKaDrC S"pyparsing.pyparsing.And-class.html\mo8_S)fm-\H v;AKVTrŖ;5S|gf83Iۿ_B4'qtb5["{A4=0s9hmwߋ9xEVö?wmtxz 48b8޹u? ׂQ5=Y#K;|Γ}uuռ:ntj={LD!\BYI s'Y$ċͼԉE0 JEHOOh& /v.c⋄X\s[^r4sibg<ǪBrڶjFmA{{ 4q80tbC~CqB\].MgcV h_P&zc릑l>F Xو"!F#(A5 IDyr6I̯sI[%YhkT=f)=|OT, 78_g?tL4,GxqGdn>{.O؃ibc*;8"IlxR 22\Aݓn&>q\7zPA;}u[߉q/5G#9n=v3ʼ^?gC5k -=?k. `OjϺo8yk' Sp;[;q0=+jd_\up<>PYv<,șҦg{s}>]NX]rא h]*@*v>f"JќP LvY@j'E]Nc^D&rGVݴ)0~N{B Rv ?vo1eqH62щ}$?a<>~2Bk 54NhЦNHJ^BiUpuu_w.SQYs:1QQktqw9.n?ZLd_R/U)-: ;]DuaxPH^vez/l1Ի`-%4nYPP Z(,լ| 5ymۍg| G7l$V"w ̌(+2SkV?S-VV[Uj)Uso@3^- gan{y # E )A LspfπrvmH03Ӽi#ze<}T6Dg$Akf< V1^R3^MDݮN^#J#(xFNa@|#[nkSfc^X5N&3j`Ц^׎(qH:2;נ+P\$P1Ww~ <^vC+Jwxh#杩Z8rQdB)cJysOա.7lejU5]iNRbxɭTC0"H$Oxp||0ZgRCUĕMdKf֋<:,YxWحpT2IC y3 PZ"%M-*d +td<^ݩ(սH:{u|z M(c@lPmAKڐxvJ@^K D[TLK0@q - 36óѸw׃6: ǡC^E=sX;hsǟ~|vTgﶭf:G v̢LdE`<ϼlM[V竳L_iqXI}*4HHD2&J݅GٲiB |u;[Y#NsLM3i[k*HŲ j.;8|Uj|Tg=<%^9\Ar $Yh\|Htٸ*q4-Yt݄%qj UG-F3ߤqN=Oeʗn3nw$J,4/^g7ɬ :޿t08 e|0+" ٚlXx@OP*7 K?;LQ(}T;{c,.]6 1.+FD#C=)yi~B)v7U@%Zndycb'R U@t$4 &ePUn쒰$,QˉY>M{MrpXVn$w'-5 RN#:P8B Uj@Q3Rˏ`&LFDWpQHnVQ&i5]ق?h:a(-YGxؿ÷#PwwJ5@Zی2_,j9DjKB4&ܰJ  X& Ix~԰r ե#Ul[TG&.[+ %ަ_3LΑǃ7ɫwǓIrdXCjߝ ǃM 7f9vȄq cHŃ{Mrr<܊>.hF k|q7"6ƽ6^cZAi_Q(ս hfwm(2Ͽ嘯?zjE[3H(WyNifG7JG6{s]2j.88<Ёx)oAA oF1e,b+NAUɹ]7Lկu]nNXrl[nq6BL~DO`Ajb_}3L}Wr2h:6O}%>ʬ!mxt?Ah~R $ELmCvtE!ṅ Ye[#*j4*bSӺ`\^mATu%"!HBhM{$D75| .=ٳH]RZUP 0G /!@U_\_1SıPKaDia E.pyparsing.pyparsing.CaselessLiteral-class.html\mo8_SW[Nۦn i 舍,jII7$EYvTCLepDz7ђpAYrt{"IB\;X:z{Ns1B^áLNпO'o@A%ıΝ=9սSD:ԯMXJıIm{ 3Qb$Apf_R/O1\w !Ψ$}tUb NcG{"q2}Ȃn }JI]=Z/uANpkZipYxŌ;p`@c܀zX@<NH>%/ ڀ Bx[zj- 7O-@[]u&+\ XutQʤ|l $|9,{S% \ҲznHR5ee#P #1 Q:8Nێ68+F q~s"$ z(s"k ·#f49}{s'B$ oXe7l`4nf[15v쿖i'YCq)uuA名| z9{ؐ=NiBtZWQx2ut TijLU 96ыqlS;>7[kvO*S?@w/^ELPl:E3@%X.8)\lܳ&'m0 e+rM1iiT2mh">^l>^=$3 y1Z/;WL_{%z9ֆ7TuO¦tj<\)D+ԳB Y;K>DZoJ? y:Ȑ7h$\[ndȦ@Z'C]}NqC\}Nw\<.$dJ;߅6n[;1On@Rww;RJC_'oمr 6 ;^e "% \hs`,SoT4|L<&xI>*F(TNwa6B2+>* V_VۆbBFŶ!8YeNJQn`n7kS:| f> Z S@)Qmý4Q>n+a4<յ *jr Pdsj6cJ-]ol`9Ր]ۙNCciRɦS_,6_S!N ]I͚pIl}׊;h_u^M_t^04.4o} {y;$QR8Wyl94D(@:6T C xW[Ivi!nnك 1 ; Zv FG{\h< b&lxA~(}<;L?'tpyx -ǖ%>d*$eHOfj]r2~P ,%\-rٌ\Sm/59(:M㳇XIN qYQ&{y\Vk)&.Juyٵ/?;r1R >ETY965mۣ??)gV듹83|:+$0̍'EGwG*[\6*p (ƹ )C{J-lDWLl9(&1 ˳0e4BX31}7\Kხq6J٩⋹vZs-mnv9g vطaKdJl]}Yra<ɉs8$> dv`Gwهߗ} ˛A9-xsݳ׻sЈGu.%(k"pG-% H_MM=jGNzcK8(oI`vE$b⥷)YhBh\P1H%QrO.ncCBBF@: 9wMɉ#RUϢT?ֽω|u>Nhp&3Ɣ87a$gc؄ʋ :Vȸ+B'5ϧ ~N1p* ^L0sЄ6Aan@<7I8 o`TO)D}b -< n;:''M+Bd8W8}v5К I['iw]\G#݃'T۠,$4"I2HFvH>>^ H_Pz+ָޫRRzr7zN~]aÓ+B3_PfԴL!A)XU|P0"9W?` B@?>Vǣ@յiiiKa*䪐 Tsh7#W%Rza"SԵQw~:w5Tv ,sxur馠{j(i|P.<N0׎\(jJr ~ dN|^eDٍPލ#zM* qr(#, KB JL&NT)ehJGsޚ#SI@ n9.;%YLH.$%&Gl8FA 0i1КÚy6{Zqad PLB2Y, ΈbDT#t]BGG[fx 0\)'<D*RSl%+;n`{B% Zar^)-_2V)kG3m(W4Q[BeD%x5-VqV|{5bv&Um%sp:~?&SH,`'Vju\ e{`o_^hec&Qfu0nNS*N $ѹQ\Ѳ;l p\!뾡V%<  FGwvQAN|򞈐_ZFe+ k7Iy9-啍v<{*#YCltsPKNlsQ=!xU*`K)Rׁ !S# @Q;qhjډ&t9Ѯe\ۖxgG&>JU Oz߲mn?Gaz2(1 U^~~枮Ǥ9s vyD5+Ɂ<ʁQ2ُ e,+z2|G,#E\qnOgXx ~OV3vtϿ |Z:wW)V >D\(1M7@p}¥bF E3K>yDZ[5y8P׭dA8<3GO.'N&Nܶ~c^F@-}uG9NdV?~gC_X ,A~oUC__?c\U)d߆ CMia1 Q>90@F}H  <-hc$5 ˦(j`liF,i5 }C)M0)]5$0͓j5pF&B`p8(^r<+a"<K̓Y=(Q+}M Pﹼ4Hj@N)[8ܭ80?mm`?.12D>|cbb%>[ȥS_tA4j O_ШR o7ֆsn"$mϙܢ0i!p,A)CG;e{li]^d`0QV~~|-|bHm33N($mWJ#jlʑu5㺠څs$_I7w=|?-pB|qE^<$SZ|n Ms$(j65dBA_+ZFh/jE-Kb¹A^Gr[.Io(RԬ5)KwuҎPKaDR  N&pyparsing.pyparsing.Combine-class.html\ms6_cWg.7&2;4q6wh S /2%UC}ŒYp}\BD, &[3X'ͿYNȫ)i-/Mvv3烥P; fO+lq ړT*Q:(]܁L_;dC>27V۝Q\aN3en#j&2ۜ%Zt?ܾ<#KĄ?m>EM~'ݼDM!chA;)2 9)p [SU%yB͏kŽY _à q&y$_Gd E*^3LRW3 J2S{!X>L.k4ot- K7Z[>cZSMez{ъ,ni Ȳ # ټnp"R*,XzADS"[q$~:6lb:`ee芄-k]`oh0E:W @ ‚J*vI\[UaP[Dt`lo_?*qg^ B>4% _|2s<o/fˡ d,$DyHFݾfp:;w6<+.q.J1Y3\lMJX [IDP޴wz/ WDhѫR]>n}Y8NS}/DKwnUjM"۴~QkL]&܍u27%޷&Q`64NnTknގZ%u+ >6TʓuGI:J}9ڏdvxN#"o;M/fPoUW!ְKm搫lG PQ#E :.$ʯV@r-rG ji7 ?T/懸Ò|A6$oT~u[_)Cn7<޼JG (UoS*7̹2v|4r68_fV^4 Ƙ,^+DRUFN'} w{=EÌ}E= CKۡ IGFw:ep O73M,5N;s~|,}&TQHQ`X=Ѕ45ĔH337ɤb4'\P9펃H&Gί^oP$aק>rZcSИDP q캃3g uo,k2tGqDR/]}}f=x⅙A/c$ApfWR/]K.1 d5jdL+I|8t Hɑ#ɍtgT;96w$xP"5u}.#:P:rW p.2蘛';?w~X]h:Cgz3wQ? 1AAG> rMCt:?9( qИNR'tS3P8h\hV"k Ѯ'H_wqajfj־5ca"O {1' <$tJ oQE&4 G0jA; $`ER|I6 W[o\W,7^l-DU\͎g;={׺&o$Ks2If'V$C x6EIs6}BD˥Z}뭾X!lL1cTT\W\K0n㕍E5J9cY62aնXҕXYOJψ0#%> c@F֑V'fTUf\Z8fio4BǃQbxJ0LF O=28:inlФ,&D%]' 7FEC)I 쥼t>&`[bM?:,B_W6.9|> BIyUJ dvn p۰2x p]6!xV]w +$gh^eܰ*㺩W#ɠOFJPs LRFX@WL|LB ꢖ/hU>S¡&!tASԑJ&[R+ 2b4e/s+Hĩy!E(PeDsLd5Pp4Y Jh<86~?mv=PP㉮j})xbY`"䭄j\ /UJUR8$tR)T0Q#I+oDG@g#qd^hu** ~\Â$lA`΋ v uU1H]אs}&{;ұ7Fh*}`vƽOocDH;3X+<ʥ1يZije^Mmy>(I۾.=!TRQg-^nDV˶' MLVH:lnl *$(kHqlVwC^}6N<"2MqndKO>'þ-o8/ƽ8Is~w`M:N̓[1P9}jf']p1A8ǫ^7 *  U[. d?6h՗ŕ˦8}NƖAATJVϴ#bh ,[N,X?5&7kG~aݙ1vU m{aj@|i7|2okyHԥq,rphRQ@:lb:}D`v zbȌu)kS`64 yzӭ60 ; ZvT?b!!LPڪGdđ37r\CKβ> i"R-MߣpS@2̸PtRxJE x&FgnҦu+ac!(-ѥƅ(C{J1NC"L$+8X.Y aHi LeNŒYI.iyXY~fqq-x V?<當5zw|w{,OνseLs;G3}5G}렬68|fBd}(<1&Z7Urh:lw%h%rtp򰃞w~Ð|;!h0Mި%„m(v.I;!raoR}6%cѦXsbxB*/@o> p&sj&.)"*:: tN&* Hu1S+}bfͩW%,Fhޏ>[`жFhd.lM-Kb"9AUD/"|k0SqQO_R:~CT~PKaD2 O#pyparsing.pyparsing.Each-class.html\sHbN:uxn`mL6T9ː䮮Ab!)3#lߞ 0"N]a4uKHnf!ʂ8:- ȍ XA`q;E_||s"a۟}:ntj|RĤW!\BYK s'Y$ċͼî߶ո$<_p Lhb2f!Hȉ -W3 /~sz-Ĩ,mVDZ@1=J'8ɋ/_[F+6@'ySΰ\Vi4 7 #1#&uq̦zj!a=e:[XOpmM&j"K'hLgDu 3"<)m;?Ec.ƙ,Ґ49vUl80< )+ PAmڏ,56h4B\|ؑOIt`:+z dU/z\tKh1!%X-ْ k\mC7@?GZ[P"TbE/uTf/*\IgL(d2U6H%ci'3'R@mBDPM, J==-)u1 B)N`/Yc2x,#SOz7n Gq҈ Uɠ6݀2}wq*U;ȋډjDsB0Af٨|Du[;*1qݏs̻~܋D+H߇6~{1Oj@Y:e~LH 3=9A}[LL oa,8HQ&ctX6dz7\,fo:1%wվ:Eru.82̓mrcnA%/Uuް?JTq eV EU'3)`-wteU5C?6B!3R+Ӷ=z1rPY<&3j:Tb L9[}OZIצ[UQpEt%=7 g^- g^cl{ّa*>fy-baAbTc,ڍ7mz^r]ǶrXB?szs۟' \0{;.xsiN.$P}tƊO#oۥ~$uH10X-:~by;tga+[I~rj룓89-}"CsG=v8򼝗w!ˌaEyJzvsTC|og{fB?5>s"gO~'ɾLѓi7[# P'xq hVNT!i3AV||LUMLpȦk8"+l& 5c`['>'~;PKaD@9Ɨ ;$pyparsing.pyparsing.Empty-class.html[mo8_SC-mSG qƥi 舍,jIʎo&K&|6b GҰ,Ese٩wxdiv}aQtr?%_~x}>#6>Cz;~ws * N}pσ"rԒqXhLz/K3SNRVI2%E8̮2%A1]W,ˮo)n''2%"!Dz(d Te̢v$2'$u_v~slZ=$xT,Xoz YDuROEB%0t)nCX17'/:?t~8zڵV nCß{ wyL$S ؐ C=2X&ʂ2tz("iN[Op'Lfqdh\h4+޲5]BRm֌EJZEM|8pks5h}&D HIt]pzȺRVuMC7)j2F [« 1UhNxZ2/ٍde+2̱rp>/fp~ ovĊk\te҅*Zݲ[je\2R 㛾,#;^)YVዄ-P˪=Ԅru`O))3" Hb~MOΘ.`>Β [-PTG˘!XXji3Kxzn=K F>R6IrhC/лyݼ86h64| G < (Ra9/O 㴍P{VoN5^K%|8Nm#SBZwB jPA!!6v \OAc0$bwt+)&Nn,flQDtX?ʔQvX+B&Z=pt4PZ ;V ȀpusZ#|Ͱ]`4]vh8FuA$qpb?Ub\UGk45V?,֢G+?:agAKh1s~/%S8Sa2SIk'J߰,UsO9!*} h~9AW2-p`PWN'9,F:5m#aP~Gzhܻл0gyGdoLarAek xm嵅ΖzE@H{xXPpk:}މUL&4r2YRZnRm- $' ۧqwv3v7"+$iN '(A42)02, NVag)\WJv.5jk9u';yuOZla{?{1cPe ͐l#)5@~5o,Cޔٜpi \qYa@'C]6NqC\6Nc\.$2=x|?ɝv'wmR%{@HK_'هp辞~za(! .4X4!T& 1<߆'ea85YYpBa^XS'*1VAjզ`\iN-5 "MY!GI S5$_so.5pFBsaJ{0]plCpo0MR6*Xz`WDۀJy'0L5 *AgUAPR:ah9ᖺORahRP滥%zdKEol2Qrk5j: Ibk'qmj¬`{?n1atG3#}_ ;?km$SR :K/UvM4S".Ɔa ) VAt4po:7wru &acj{}db#TA|cAJ{u>}8O> 646lMsC&DHpD7wۚ˫AsYNߚ٬-1\e.t6zA@I͊۾;E1#ԗRNj# l2IvcLjWg,;,ZwmKc1sYdfL >$0̌]$>54FiJN1w+u@%eGn\&N)IcQiL*reJQAƔ ubNYD+E87!҉3 b!yxc秎U2֪kI:}?7>PxGXx1ASl@`ElL&WteuBp W%.,ja^Es,QKX抙q<'(I̯:(N5\ZZS!WC{fz*5vh֘=uqUF#t:/zq*Ӭ&9HE㖖2zi&KX('XH%\? |ba5)61}e"TuZ/ADZ3UZdp+P9@A'pv ZABr#]J9TcGYeB!WIU7*?Bs,P!6C2$.H<['T 6:VSXA(`Db&@8X(4)fQ%L$x>Rj]KO$WUWgsm5nR@b*S E 8"$5 Bn8`%4Ȁ9-N[jB(98V֬<.D:*^Jՙvf*TBKYf ̣uDf@'΋̓Vje ]5z M)c*8IHЂ;,R3Iɻ̠Գ+gQtdF'Je$y2<{z?pzsB*~OdȂo`(d+kTL #YcK~f+yv RjVZTX˧W dBc*'U(-eg(;ނ42-=/D:D-*ِgv~ܼPmn!U0s .d%H&4cFa!Ekq}{p,ckrV.\acvYP}Q><8Ig?^BcsX{XO/<6֞lN#dՃW۟q%ʉDK2B_V(=o #%ڣ8^y/`ÌϽ@D/g8X+{I"x|'/JE|Ӗ{s}86[RgB cK>yGoJ y8А7h \[ndfS >'β5=nI'sq.{ߏ{qd 2=fxn|?ɭu'c"fuy\۽H s=f;W}ng ÄUFv 0oF3Qm3n+MC1!u#bX0ql'(7 B08|kbJi0=dO }Jpo1l<6uqe붒(.H#)rJ̓~4J]Ӡi0>8c|nJEpKݦpL`?9]O&4/j$LXnl"R Tbr 7͚pNlss:Պ ;iߋƽoEG D[Ew5Wj$VR8Wyl84X(;N >  k*Nd!cQnDg/ %i[`oh0>.7g:WB|œ*o,8hQ.j֧gw`׻9^Me޴ | %5z]sqbp9u.8K[sB1w栚jsɗɺ`JLq % % ň2뎣zZ+NEtgˮ<ڝ K9R%s;bf83u&%0̍ Ǚ+&*Jě;錘\ҹUx8;JtQ=Jޯ r DL!C"`c `Z ޖ(5fO;;/NcAx0i_׫KFh#>,e-\SpSs/֚ /uS׸;eZZ>1d}Bb±JK4 :nwGhƨptt^긃^t~=tdJoURُ5dp`6$FWYhگ"kwgdp]Ds$VaNlF-Q@E%pJ| hEDRk1IČZPAg4j2y1Kzdy454a؀kJ C }eYn_:|ڐW%ԧcPKaDe&pyparsing.pyparsing.Forward-class.html]{s6ߟL/Μ%qoudui<8Xi@$d-xe3I]Ep秛qLT\$n$!O.T7~nuv 4?i4^}?&yҗ4Q\A'g-i@ kRV1aH:lDZd2iM[B^~GۻbdIGHѰ <;uiJAUrBei&8,>l(= I64A+PA4e ntۜMoH5WD 'jt;m{۶ E8%@B6& 0#ē n\ۓ'wakV5prvGwgmM0f$)I 2&eCrvwkqJC|XXOn;ن*khKkp8a3{Ex-odvt{2T݂oEŬeEڝ6]D ,w yHL4 =%8Mdo ɃfqzOtuK; 4`FRzɪLg1"e0Cq-uXt|-eFHk`%Zm$6▿MmAf7ZN/P d6m@vrAVq5'3 er=mlGj0NkɵGE`m I%3?a^݊DAKVF KN|`Tfmiz}jXZU~$sߜR>-m$\ѥ\ޟ )ўפAɣr݉1ē20Npy")`'ED&L$5 SG!Uy{$S?+S@ȧy?<IyN;bV99j'IDͳL04L_(- `jL(]Q:'PwIB.AbŞr͚1W3[Ϊ݁cy&޳ :wYC4`C$&rԏ INĈ WaL CMFp|rbZpʚJ[\`N.'6\7$ej1bΖ9*CuL&ܙT͔sFwGXfM!]lI.tuxLWoE'Nr&S^7Q€64MYn91Bv$؁X^Pt(]Ox(D?O{Gg y{.p=SpH`IzilX.cyf f4^)H,!vrTV V? azutx2`V%H8,5Am/܄jv"06>KBE30Pڇp击j<0BLyAca10͡:4sR匰.Or!V)Vƿs}f\٣1Uɺ V 1 b|s'f&7/k=0r˿]G~!SU5 +HefZ-YosRUWQ+!>_Nn\7SD w"8q?ogժFϵ^Ă<&o f ? ݁GK1^09K.?Z#5X`剒iq7]h@gU/#RH+`k[|J RZ ~s#4ם}t$j5'&` +%;XAڟa8e懫^ml7~q0L%O>ypҷG3`XvU%ojg?8sS`j'0KN\HK\ m̭KnƼ$KodMpJNxJOl蛣lD\͌?&F>;24ap,J=\G}*uJB2@4R̈́QD9YK2G38fHa6Z* {Ey}L~Vg =Wt^?LeVHo,{43 g4Kz`jf`Vӎ{0svvSsأOVv#:_!ϒH6T/}4vL6YzO0 wuʎ`}'*HќOoX?S \|*[W|L yOX¥FrZk }>( \-t{4qLLb^3/ aorwu v/GO^Ӫ {9#;Ʌ>>yuMid{}]pfkfr(( HK:;ιuskfSskj֗|٬N%68Nj{w@'z/}VXEs Im)G^B;̕%_FsnU^So谱5~&$t`ckiѾp~' 񚶔hf^ #R ـ@i-]'8C n"!Sņ,#(&7 ˳6&!k3bvYpn}AG l[#&:mY܊5 d^e/wY:Բiy1!} & w 2e7bNSC>[&aaXf+" >*MyEZ3s3Wi9;jƃ?tsΣkXe|.)j-5y#P^,Y%k ,AZAudYB)U /Q*X|@/Oxs!_{X2=M̻ǘ|LwWm~}-/6x@쒇G똳PuژB>(6blH|4bZ}vJ=_ jrm9=Zǡt03E9j+>UV{/=8_5- !'#9'L D?mH.퓽?{;79Fn&q2=AdBݕJOJC] hvs); Jc:mY@36|d;i'dXQ @ C!nl{]sa^0@)z5 žކZPb^,8;*:UHlnH@OS*Lg/,)KD;nPKaDXo G H)pyparsing.pyparsing.GoToColumn-class.html\mo8_SW[Nۦ64AItF$ċ^lqRyӽ&b  !vB$W^Z:{ݿ|s1@oΆ}dla߶O'ߧg110đmέ=Y@jJ&-Qk·G! Hl}sئ>xmIQByI w+B'Y$ċE>Yܵ51[\,"BF:Yk{[H,rl r+lumca"ʍ_Z qLpںku]/{шc&0tlALHa/crZ-t\{zswYOj݈ /f%s3  s"t~G(6|XXpL'14 gGDWKN(՘4Ӯ.O^wqnpzj,5~%Gڸ {f cF:6O dƷA>} lXӐV(d2C?%Q@ Cq FOf$W l*U3td[2% 3Ģ3sz[ "hJlVqL369]~#h~N;6" ҙK_@%BGGZ^],Pfח4El63l݊襥6 JX8Ǣljf9D.]|i+fp$0"'jzt7Ɲkp4L]2kUTۡ[cvU`Կ^ťL-,Q^-G*/Mr3*[Jt@BdM,`%VzVX)2#r$0Ԅ+ڤ"V+SҲqb/ADf\sTZ +pJF1&srTMjF}-L.T_ٯ귮n2}~viI)`2&zHP9='ăCbq `F)'4BSʤ(`i$ #Hp"UlaSJ5' Q ~&(uN ~Cwt(0wW]NK Jٿ:ng*FUCh:A1"SXutcNKkN]2AiD N&#ÅLyn` <(庐v uoˮٮc-`8 G֑ JA%yNq?@'1a̅tD 2kLbFsz[^HؒL1 Rzd 痥̹jëq}"l2 PL&Z [-ǐH_ނlwM3-(D$Yf]mn#Ya: ݾF6DLdH)\ L4o}r96&A+"">K!II Qk'1$q!S{uY߅#|r_ gI w iO`&8^K)N#!o4t|l+m)6Xfq?+l=Bo@ 1J4YaHץmyyRa<'LhSndfS .gNf.grbq.{ۍ{1d ҥnXnl7Ɍu'3vcaB|E}t׹oxXKdXXNREyp[S0,,D1,(7 $ܤn!oOaٽN0 %():,mxt8LˑT6Ms\Ʉ DɻuM凋xx/׹`4!L?r?ܙ*%_:B'qoxv+ѩ $aTo(~g(Zt^w1׻ZqL+o?²nA գ0REml:'UY쒙2#Syb%eЁ̴/oT7F{CrK=dU|L`P:L׏r$͋R]_8`9cOx*hDT~DC*P,훷lSr앝lalOűȆo_O@>muq;<,,\!iO>sdw}*uV]h}.;JqD=0¿Kc^foԚ7 aP]A>7 lY蟌eqbe+1JEq}Gb°L ;Dc4JcK:8D/:vY2GW{mz{5G^t؆-iDv6ҕBd퍍ߙ1~l,Q@oI8ŒP@~ȓ/@o.pʡq;Qb) d%8b&_v5y|/T}wAl#4җ\xNFסx% zY}Ef"~;:W?PKaD+4(t UE$pyparsing.pyparsing.Group-class.html\yo8?b)f;M \m IAKtF5$c?[vTn5Ety MvA$i%~9z;ݿ9P@wN}\~uG'1 ıN9սDZԯEC'"=pݛ~Kwŋz#;XΒ$K]x]]0]Ww](Bćw1!!A!#3o;HܥVUϢT?kkęӝM/}Sv܄ i+f(2hOw~ұZj:C7]iӘ ?$S4, 0MЕ(!M|)*z;~g6y}Q/C%h< j1ſ&dӗ85v5ߚ I['iw]\G;1#u'T㛠>6 H"YDX+d 6ЏI>%u]:E,3o5%*=0AԩX?Fh0_ UHIgG&{^7-΁(i)v* ~ bzW p d^EYL vs?:HBd^3+i)'8 x_Vu`ܖY, 4,V\&`!\7 A!#K c$Z%GAl(dhF#}Jg+M*ΚĤ_{KYeQÆV_E$,! ^1HhS(7XPn.HQ2^LDy6pWd{ r? _n J:LВ;D~{P!0PCA AڮYGޱkD1rw*s@p27 ) ZJSHC" ;ct^P#n(Nםz6opa8uH0TAlx:Nv0>>;z.|KDHLa-p_DLcK(Fe$+=<.m%Ic) v<\,wO&(d(I%ltp[HACгbkHo۱\ES#T)SEKֆS,Ÿm9%i7SKփAe.J@uAU [06kASҟBV@e72&yq+@ ϥ@Io`Һ }k͍*?T+|b' 8uq&/?'bj8@ i[nd%P'DS&Я=Yn[l;rb1/FR# ]o6 ɶj'ۊz2l; ʳJ n?6f>A8ǫ>7 6 u$=m@ddv|D8cP6@1+4sS@l$.5pDBm8y8g<6u^[BU[s`g9Kz?n pi,U߄)5 G([P8ܝj8TvP;$ 1U gd͗D4deܬlc$CM3]كn~'t9*^坖6Gx7#`&55kD75]$gWyl5E9q k*ND!cQnDe/3 .7su ŰAtE;sw3?t|!!T2[sUuPAADZFq|dT!qm$Ժԧ/?Z'ӧS*Wޣ޻p<{#ǫlU]6L/ɨlIt~qv>M  aro6 ƽCDuGGqNQ4^r҂ ?S\ǒ.XeKBu@ifRM9sT뒹1Sy)e0̵ Ɣ+-!(ܯhotNW.|ԏJ8\J {q.ā wEŭ$k5H(0LN,^K.)~XSmZ^[2lo3} 73mfǥ9W+'=fi4ҵZ]U -nJo>2?Y2~b)6NRgoHB}z*JvhFYz)C{hA痃zٸ!{yٱ!)hqwQ0?%6d;QH[ۯ"kw[;ºp]D}ZgKaFlߡ i@nSCL,(#yazL^L 8a.aNu&%fB.Fߐ>+FPu[l#4ҏz%1\5A6T*@qIB]W$`:WvԤ/)PKaDrvUW&pyparsing.pyparsing.Keyword-class.htmlks6igj=ƑQd%ű}w@$d"H-[HJdɡ?X b~0N٭7D"/ity`QnqxrEgouSk4u!e1pĩ8l4'hڸ@vkЮ < < )N Dhx'OtoG6%$ }p!qI貞^8f~!#$$< D8(`dp{usIBAnDC=7To1b{|[qe@sm5t G .8ف3 8{W@#P>Pqqc0@(j7au^Hۑ#xW߲VXESGل,nvb'= '05q۞GHw rV^lP*K6R2$j;sKþ(u`>a&-30kef/E@I<+4A>4 ;p8A2qy?GyyjFݰcR2 k xDejDfi(qȉQW2,^mt/8 P p] `s;|T &)<ǘYLy̙@a:I$VHe~hfZj5AT,BT(ˁxqm^ E?eysi9Y3$) Y@$!G5Vchp%5BbP~$w nN.zN^#G`ApD %KDvJ`-5=rYǵL:dB9NB(QlIߧ,K$CǵMm/\!1 E;vQ@+ݚ=Qu0.aGzu7o?M8 a['^#揬v ^7u+0GH)o(> !6eEXw&Kr;kK)Nak8{tw$( اf ]$6krk(osU-{]3 d4ԝWW M&"Ȓ&]_>$aKVw|8Qe RMPLsAe8b ;Հ,h=.U|o ^*G@k„Fa˕#f TrocʁLfe6^$A,M(dmF8NdV>f_Gpp )Uz?aOƝM0LN?W wuNqlbdh 5[1kN;4̼l@Ю &P\u&м"a gjT1b(LbÑ\5]זMT9"|R(U! ]ɖêFQs OC\=0o0 ̻ LYVISڳ>:G*F`̖ ,] %~'!:-ߗba%;,l:F[T-zF Fs_wE;aC/rǂ&~BxG +9g-n2&8Dӕt5+4-^qzM>jݱϒ Q,ޗb>$N=Vui$Yd7\E%/+F vyb$0ŘUbu>}~~vҎ$=E;ʈ 9>Cɧ^UwܷsJJ@ZK:Az 華ggZ a~i43ѿ5VP6u:RsCȠiX.( &˜nw˵|'fO?%\s͹crg Cxμ^=tk;g_mm׵Ҩ,EFPv'?Hۨ`*)"+]|\J܏ت o1!%oC٪H~_{l~q"%4s80TF'Xr=! WUꀭ0s7k޺Y;wǯ+~*]n@aSmrb2Ѯz2)P }45 a*GZ&|:-SPj=>#C AXR! }TנQ»ifS9ONUHub)dkepˏ[+z-T*-U-So9S ';u#6'c)ӓWǨ\1R~%|E~c_`Dmu9ejQ aX軤ʀz]j' qs-C?D&+FFrTscT]zDDawiBRUkjI7 UZfa%@ʓOoBG:s#ZCpFh Fѽ)0GO r2L'QVH.ցv|E T:[fW걻PKaDBi;B C&pyparsing.pyparsing.LineEnd-class.html\mo8_SW[Nۦn i %b#KZrE IQ/کٻ6" G-4 ;Ie!GYܥ9jmo>_{u9!aN{}>:GD9ݿPg}/4D  ]} ےDg$Af[P'^ gͼtICI$q@[HбX Lo"rn!I^Vh,Z qfL>siۺk'DXw>Sǚؽa&ys뗖0.yk4P]u~oЫM5M0%!^L0$baQO`9OrI֓ + nT). pN=/ Zp͉_I3m {86άM]7摗 ɑ6eđÈA*]PGK= :5dbK~A>t5.h,L\|HtSSat拲:PR-늅Vbޙ9q]-a؆Pk`^df8QUZjk~#8-JwhD0>.K^ h_P&:;Պwu7f"I-G d /-7 ^~as?C1 ,vff+SR[EL+Sk ٌ@MrOZ/Ɨ6,] 5QU #2u>JU;fvxU&q=]vCtnjY$SKb4DQU?qqwDaC TSNP"%,JUORQ0%L31 2f٪7\omIDEFE&Ke|^Õ~@PZ Kp%RVQtK)Bȿ/Ŗu8Wmjis"1{2p"4D.Lf^y c*#B# IO P4EX.f2 AHaAXrߜ6pcA2 Ci\.율 VaTNY4Gm[>~ض5;{ElKAu ?0&UGo1A]?35£T -?fżږW66䃤$y% RN9d!;.gAh-Sqr:۾V+OcR1DrkH;C"xrXI0MUԄrw4̎S$X4_"OuDxCb0'>tre~dBlM]Jƿ1KpSW`[l=؟lBC-={xQW-&^v6{d@ Yw|l_+XeB[ 2|‰R%=&X :  a!ػ84]k}}^j0!LvyN*>$)A\G\7HCRT3E7ᖪMR힇w S*vHO=`S c_,66ψ$d#QH61%i3H6?H4ܜLb(ִ͈;9rPE)orÿQ%Tܳưm͡REw|p[QY3,,D0^y*%,)ez=>=Euf"~$HȫcPKaDM < ~H(pyparsing.pyparsing.LineStart-class.html\mo8_SC-mSG q74AItF$ċ^lىSyӽ&b / 4vB$bFW/^o'\ P ۳aY-|ط hpĩ8? H[%Jtm_(0[ɑmܴo1^~{[(r$P^< *B$xU(шfkk"I1[\,BBF9Y8X$VVh"ʍ_Z qLpںku_ ʋØ[7ӱػ)a"xS1ʙkq:}?zV 8y!0)YȍO``/7NB ~ab=3jB`/#$KQ"3WcL"ph,B<_* fU fCɬdKZgEg@BEтxْFUgjmrFI&BW:BȈ2>Kg./I~g(jub2C-Ǜd ?0 SF/ -ϰyߠ9eK3W ̩(.Nŗf^ :@ 0>Q@վioZbjh *bk9[VQmcnم_gkהYo4B'QrxZ2Fz]e6N7ɽ/P4j)* 1 7eeX)Yb9ߺ.,P;>8Uhi032q  / )R@Y(Ƅ(GҳVɀO "jI8*T%c}5' Q% uN y2Bkt&(0whW]BrJ Jٿ:ng*#FUChɤ70$SXitcNKL]2ˡhĢ I&#ʣLs{nNJ庐Q ;e uo cl1=`8 ֡)S *ct<<{z?~8\8{" 2kLbF>_RyZ-/ $klɍ嘤y)'RN9e)[D-qrzy^M&4b2YVגh9D:p)酙+靺mfve 3,o}$Q'(A~2i`DXh s]\o^r161+>Kܿ!sQs7$ۙB]hdқW߃|r_ gI w=Ix-O8 Gid1ذ[~F`3NĹ2i wYy D(dfG} C_ kqfKhN8,ͦ@g]6;r(K IfK'з3Qk3˦b.T#bÑYQn`9Lq |N< qS%. [P{ihry(V*]7vIx K̓q\kTy6r i0¥x1]2$Bg5M&RXm"Bvn*ZܬmcO]frox9ub8ΉVѸ7|P|tE}t׹oxHKdXXND# Ul "v`SQIzlR7m ۆ}Sr{{9fTB`AɎr២òY >'OڻYNMe4'̍9p2yw`Ip1r ' M!#z̝9\.t2gXN=N aYhQ&{ݩ\Fkʼn2(Lu9ٛ~e984'1Q#J+dNRGdfzL5~,t 3a(ވhL\Y8pN[\yyk P ~yX>!k"DOIͻG6)yPyPMKvR'Zq=]e1<еD:߽N2w%Ő+$:ϙ=yΪC6bK.Y̶>_x@<}Ns@Uc|N- P'VYcD%aX& z۝#4J#K:8D:?vЫOY2gW{%;jZK{+:lÆ⊴#" ;J!NOP? 27$aFN(\ $ ۾K˔; Wݻj4ME3^`] gx]Wv;M%^Ic& (; #p(o2hX';?v~X jV /9zջjA~9LIS4MX@M,A>zr ߙtGbt$; "&sWIjD芠V'][ ϲ$h3K m덺Y!%mL/}L`̺[#+\,tt_K4arRFXzP5/$_Vf @+A|F7c?i^vj)^4FV/N4d-Pu&v=F#t2/jYjR,rxu9D2zEKXI|cTMLYM1[[R2UQyek7\ Dd<^EPڍ(Uc!Wu].X!'7gPwzMy@xMFT %2 "Knr!nv& R7^#Jo (m<$ 뺩V "ͱCO/[Yͦk0N F|#0:'\%sGl.,Ҳ0+جdruUВ+,z!ʣfDf&@PVVjˁkF `tʣLnNSJSȎB¨d28lxrܩg-9u#e|JA%yDO͇q?@oӷ'1a}0 1##}V JVrFWo+Ɩ|u<^OI{xYʫSi͐Z-^m^kdBc*&UHj-igH_܂r͌o¿v:3)m۲n"Y0n_"OBLYdf Cc1R$&7HΒr!6K2ffJ$wD4%yݸ yG%GIO-;6"!_ddwgZ^q9*'se)]څ; IqS(A9UnM4*2_ ;mMeðhxEa$2u q}ӦР]{'/xXpP\- MY팲:( cmH!8v>~2X XM>呪0纯zO{Ɠ`?]P lp2r"a0̵'ƣg:*P:\jۜ ;*`/!(m'TqgD=#7翅рhi9,ĉ4}E!k(GO`o{Um J{v2Rfswヹvs-mmozl.]/{rϕ>0ʙ4[zXq|?VX}'PA~c3[C&NIMK߿bK4P:lw((Q/el'=xN#,gIb%I̮""^zb`/hX;ʸ躺19\F̀tz$~A6%G 7U}FSQnug~N3w[`^whz'QŽ `@șFؿ6a&+}eΏ+d\Kj?tusoZil=3<žW+TqN "Z>ſ&x78W8v5К'A%O {vcF;:O,$7A', H,֢ ={0J3 aER|A:hTыPT˧b Z`ABьhFUgk3F$a+ZtatlY2p>>S^ H_Pz+Ը>RRr6O|]9aÓ+B3[PԴLarRF(]a^ErI*C_X悙1<'\  .Z2M OkN%\ `-5 S!WM5~3rU"zhn:E]U'F .T` 0udt<́+O倜H7T3H@qpg<&S1,JElIUtLQ"M_ k8Pץh|E8<3K .w8qۍqܺn̋Hv𻥿 cn('v'ۍljR797; g`7ϧكOPmz}`yG#A.?)odۦ.T#bXSj8R!aSkHKJiХw מaYSm*,| Jy9B7P4hS2ͭ.T4w$.,>X룑cd _d"ber8fmzi&7+{p=V7gS%0I.NKh85fMҬ9}sf{ ǫ6h,Ed9_5 ÂO'Ա(7  u".7sۺ}:d}įQ 9;ʙj}LI ;.)~HyѴ0gWۭj)nsɬ:Ncvox@k%%|Yoo˄Ks)QgQGWL&Қfan_ 5}whF ٓ\j>}xTLesWQx3яk$[V7œʼnWYFeZMz2ӗt1T)c|jɖڐKHƝ%ȷ~&Lv ROo@t$B,FCtuׇsqC"X2+Q|ZF tv]vLD!aomN[@j⺠{U:3b [PF?%>84Mbf[61B̑HДQWS7h E1"Q_R#eqD8C|EF~\Ro$ťHHa7&%ʫco/PKaDrZg3  ИDP q캃KQKڡ aJ8u")׽oq^zeF;$j$qPQR<=J*cxM{Qd kHqL[I|98t 9Oɩ#ɃtuգEi*˝6<(|uML5=,#&`1}D%0t1nAFdqg*^v~ԱVn:C_zKw]Oj $w> L垆2t~pP@8šbZ NЙN Hq$;0iV"9]yO|.ŅY֌YLڐ<Ż:^.@99y <uᑰ4$SJx*696v$N Pa(nvgHTAm07No"Y5CJn%s]:C\ ztKx9!5F/W1st<۩luM%,EʰV']X|'%ɯ ڀ ZNWX)[(<0ɺj@ faӗ+3/\{rze쪇U*jcڴʔFHb~C Oژ.P@uF?/WݺZz.«0ò~͕i, ,0u&v?_F#t6Wz[%[Jtd5iD]9:iwl"Ѥ,)DE'hd6`g9 7LFL LyXm,:JZ:,Eu_1A )WѾCU` JF1%IJX+$grd4w& e9GD\eJ!@(!ֺߔ FhaC2Kں$BP^mD6C/{\8R|NRߙePZ* Ą"d ; Tfy\?h)W(6 (@MVs$l/jcDS;l6:.u ;&L:6m#ɁB+Ŀ#cr4]`|ls&B$ Xטl`4a9+,E4&KYv5vJi5 )E^SЛ͛_Ml2 ɲJCdz$!`_\EJ<evn#U.^#OUDLd#H8Y$>6tri}1BlL*V6,'S.2[/hv3 6͸~iX̂G7/OגdXYojE}d.ڐ?.YfLyM?/lJz!suAtRA}p8ͰW3 {Sj&() -72%Ѕ'pW3g0W3o8/ǽ8Is~`M:^̓[1P9]ja/@*iB~B;Pg`ǫ "^ BUMNoÌ!g@0;IRRO0" oilTq]a2ʟ욇De4\4Rw-6 EK 'vQAATj7[lK?RҞ Dpo1mԯT}%Ryk"XQToliA%LG4HBJ0>6e|fRCpsݧpLav/;-,};d>LWL&!4)nd/koTéI(!k8 `м<fMwgVlmA]?Hƽϑ#H#O:wU(u3cKǫTM4Q*ʿBۚƆaa Atm]ػ\t9UYpвBlgɧx0GWذ73A&BB L~Xmk_ Ý\犳pI7Y =9\e.t6XI= qyQ.{9BVks:FQ!+ӿtʹ~9:ՃRʱ.u'Bc]]2#a3.Y df":#\=P_L3odw{sZqՏK'DTS}5`P:F7 QE7{؟8 X܋0A *$L!-!S;"V,H a'$׸u(4ΓGxT]bkI}#,FsxD#qI|D呃EO^o P(`W'>rZǣc7' ıN=s`{#Di\;8<#'"}6e?g;rЋK.I⠼%ix.R %uJE/Yt]=B 19\,bCBBF@6]o;H,Rrr#\ugQ*ʝω|uujf,ҧ1eGu `@șؿCyA\_VK@OZ߭+׮I\-Ŋ%TSaOFJ EPgkIwqJ*TB "uFt<Ȧ릹H%-%OeF!24M. *M=i|cTLXLY&m͈NTjau^Y~/߸gALfJ+Uz%nv Cm8*\߂*].PatEkIe2Y@uS+,k!$( "f7%2㴘wОJ66)b!_,edsъ5{4C/i1-IH&-Gii%{! <*˧iǫ^`5 EXxh;ꍝE<fw%3Ŷ6=̆w%n:L |b' 8uq&/6N<x|B.o@^G}!/ ȅyhEw)b !gt-џp;I~TU.MQ"Udv\EÚ BL'̱h7 `] aɝ0$W(/|!!T6OʪiGΑ' ns%Yx iЧj粮'Um=ފi@-7޲Qځ"39&"~KSKcoPKaD^ L(pyparsing.pyparsing.OneOrMore-class.html\o۶= ^m9ޖ:\] Ix"%b#I;w&Kةv)GRIf cICt|aRqrvC>w]?;E@ 8N@';Pσ"rАvHFhR*XoooM?hz{Q$P^R4lK*dqs^:O98ijq{B'DĄHŜrv !ycO;k_!,V~3lzH0'QxA75okYt%{1ұ7LpxRb 3se-c\F@YϝA \Vi4Ä0%ų!2`F2iPH$ÑXp+lFphh'4bn+޲ k Ѷoӡ^oU@c¢iBڔE*Z>@9<&O"&6A{$,H*ޠ4 -IGi]p0"2 ZSt˲9+z `U8̃ո!btChm`Z"kvWo9C~#YfEh˨R'm:Oȧ(H~oF(Պ7uwb"ƴCcWZ| ħd+C3|[q:òhinܣ%űLM\ba2xB k=: TP O_ ͍A)Q+#͑VZ METe+i =T6J|tiE/V ss|iCT WQp{]f0 ke=A@)*BJ=v2`47qgOlUO0 g1_{ @X)kPўcr,^4$pzZAﷅ †ݔFp0¦-вJbv\H"6B,%q4NR錤AGצu Oj;16ڻZc'D:bV$0yZts\K`)^ȝF*TBC0 Y !{/WwZFtde/=5.x( @(gre$jj!; vSum|r0pItb]I- h=2Ϯn ޞlcTHYY+LdN}O3j[^`V6 \zh'YAl쯐זBDVR%Oy3UI,YԊ"Pyez0KUӋ kPdȭ%,ܲG:ڧl&RĶ~^2҈b>!i·m]S.\aeh,D'c^mv琛,="ՉdZD@$g6WmviN5孺$TN2a NR/ AS54 pB ݐT (570 R{,-DNy t`K FWp?de'` )*REm01% \ǽ|Hdc~w<#FVZP(;R jJֱ;s].WciB>A+ȧ| !NCߔj v1!oJtFxLv.N>%88; sq.{ߍ{qYpw`qpv{]pLݜlDIޤ *$VczLdQJnWqM]m5[BV6Z]=jƌ䍖sAg>Cï}lWwHԥur,tYshR=.#~:Vܬb:]`r :Џ{uy`Wڹw^nus eG@ M¤* VU>{2%1j9f^ B}#Ŀgq%t~9\o;W^PqP5#|<$:Er*.]p.rd_S/5)-: :mu'ӤP"[g(Ftder;`MEtW+|yך )O僩ZK6=kYϠnx33CL%jVj{fór0)1(q\(I"Z;9LkFDln߆R0ڝ 3 9K^ ]Lr0D~Jzp TmW`ŒqB&I69ນՓb܍ٔ){ڧy*<8}ݻ3u#O)'f7t ns8C8uw͡^tv>A *lE;8;:$"Jg k[}:+C "DPhBudZ !" $aIM%Q.7ATB 47Xk EEtJ2ub,M58X C0TN~M$0CNf+5{Aw/b7Bc+ϔ;1͏U˂mֈJ2|`buSI[ss|TG"2E(AIe{LyWm{&3[C6N,mxȘ̷R~&! QO'Xj )dG[e{& I+L7sQUO&ˀ`L)s k֛[m{9B >X̉a0OTRoaN0+ރ$S=tSTMOH'),:}@QAd8j0lNbރ鏰M̥魩Mӄxs> Ĥ+ EBE}n!#~c[#[Wq?PKaDu#'pyparsing.pyparsing.OnlyOnce-class.htmlmo6{~C,pk*k5&Am8 %Hڎ=$MWI|)*v5 >(Oa|1J~o/G߮(NFQOѯo" s4Y/#T< n p=|,yjfmNzB.˗/gN3lCՕA1ghos E'4 AfCOmFUJP*["^6CO[bD\7?5vO=dR( H8qX-Ȅzi ̀Ћ3܀ YN./Ogw>P8(J2'c,= I( aD:S%4rL\Tbj=?;@th , F7bIV&G4i-U7U9dўV,J~ D<-b>\'Od>3d @%f'2O0\އەhQ 񂶙vcnaTRDo#\;+kd盀ml7bk QLC "/T5iyR,$rUC+6`}J#tzZ7ٛ) Mr##)+s)m`-4 4t•7qBb*KƺhI;Dnږ8?Y/r&@*>qK`6N?doߪyVǤE͐ Gb^XŠC"!toG=Fɕm,;lSI)]W"n *tbܷ\ 5  | =IËXɤNCMb|1VC0ؖ)Gm?QZ ȗqsƪ4T9"̣_$s*\Hdd'6֞#-`4S+It0\euB{V>\\O.Fcn<}sy~}Eqp1xGu*bpw{ fW&{e|p*|MWw'vDøy*AkjJKD"rr؛0r疡C k-M=Ow֡w.޻ ;╦{RҽnIJV~2=WM9\!bT Qt2~J hF ;v _MDCm!#X;PH?(NuTkkYٽ4WTC%T|Cnv\)9qvh(_ZqD~uu =NipsƔ8a$gc ʋ η:VĸZ+B'5x]iӘ ?$)fR&uTA>Z}il=3<ž׋%p0E\DA]-YxGD椉vE3u׮f[ d1i+M$hq`0fsxĂJb|aFID4kE;a0A`W ŠxN:hTEPT˧b+Z`ABьhFUy`km2F԰AL0:,M8e)/q~W(zUok\ ) er}9zf;[WNp /,pyHQʢ%eET˫ȍY%ˌZH`6''jqtH:fkL&T́OFJZ\EPk#J79P *t9 Wm5 2(kc`ER@2 Li-Cy y$ "70|z( 37U9Ɂ̆8ESxJ|(Ҕ( 4YoʞT`A1J ]9JىJjų(mcDW\5rtUM%sQi:0&30PZƉrRm׬#{X'ԵHZ٘N 5iJ%):!a1@]i.u59wXLU뺑^%9tѸw0BD42 5*[QXͿYMNY.L4~l )#YClT$WsW!m8e8e{ rb1.[ۏy1~a`,MdV;^ԓYdQPM }Uj&gf/ g1{ Moz0OSH m}߀ a>F"cܾr4B5-6 E0(Ei0Ɓe\I]jL3Ņ. ܃+prMýQlWysu'J$<Y*]7Vl!tS+uMfzP0::laJEpMR }Lc\p6HX<'B k;%zm#Aj\`}{;T 6*tG>{aGL5ޣ/p9IaOU.vMQ"EdN5 ÂO'Ա(7 .7mr̻}lh}ϘE+sw37:ڃPmb*dݿҪ:b Hs Ȩ Cbi$Ԛ3uB:}=U_zOo{?' ǃI]rx5 %aSɄ gdwtN.N~є0}m>3&+&jsNi`%:;l=%0mwYGؕ˽TT-Jqy敝ǟι󶓥[F+%X9d$yx۶'v8Wy-ϑj}Qg~daG4s}*e 6ؘipe޹iou:TW'>*qf* \vN\7, /ZӞ2AAP^J#8rg sddR$zEn`_msLʎZEtaKaO}Dzs4f[RpꖇR99m6apiΕ>3ʚlw4AքZsuKs. u[9Fֹ"O/$u; gO>*jV-},jQRbRQ'[fkCO E?D:m9[4P;#}%2tt^|긃^v5nȾ"p׳!!;؏%,pH12_n̜" {"?d] .hXvaF'EA߂ƙXPowt INX !ߘף`_i&bE1OimFRVԲ$&!^OU$`8咄"#՛}kMJy䗒䯴cOPKaD]C& AR!pyparsing.pyparsing.Or-class.html\{o8?)fm-\H v; J#T/-;v"75bMfC,BW0vB$?/,̼0~u;>s>@ޜ jþmѿߍߟ ,@G=8Pς rqmHR̎m___ ^|f[bЫ .Il%h;!S ŗuF0(,a!B%S k{YSrdqrmyṃa˝Vw-Ĩ,kVuğ#KYA #ˍEWɋϝ_:FzW,Yjo]ԏinDa+S r<tZ#Qb_NV!:өRj( .gGD"KfD/yRDf.+I~V(zUo\)a er}sF `Tbs?nW/,,Y\WM,_,$-,sL)GK{"Euչ+4nZZ EB 'Z)UNM̭O_u2Oz:sLjD%Lh9rݑHMsGKf M,CMBD8L0CƕZzrF-% B!>R`-ys1SZNʈjh?k~ DdANGP{}O n@&jeπ-I]i@k* }$ "VP QTFԹ _@0G_D0( XfLE!C$6N:A$ s/xTI]26EQ ]Q\2F{<48C?'TyBpWxpd0ZPu%;f/]R/a,̋*`!Oa!VsB)`hTWLEDUV!멼GʈL!DSG֋ՓP_刵gBVD.^ht1E?z)[Cr](BC;L/>3kڮc'QtKqnOrg˭UĐ=|lǻ (RUqU0 yj  ´ez dq1Qom8}ƹh]t7EIZ;jhnt7Iuҝ'5Iwc,s5}j&f']p1A[o+ m=oˮa><cqܫr4T¸l[ 0fQv S/aJW7 E>{Vͤ#'NpoqSl*, $Jy90 pi,ϧ[ ȗ O]8\ *}V'5'jWFDK8Y9(&+(3oTMnV`$\ I䃖QѸ7pj„yJnkyQ$)Sl84P>>0 kn6 1>0Ǣ0,(!Vߵ.0oaaVgB Rv xd^Kk1g7<~۝wU%+c a)nth+dV}yCG, c!|LX~\wA|R9y}L%)&í."72 l:՜y~f>[-,2^M"gط㇡j-PTia͙- KD:% Ϸ~#(n Cs4I;(Q/xaJ!i>^4aV||wOO9Op.I;&аv\)Dnx 5c`QaSb9CFxzw3S5(>l3èd:5T 8bx\f],&Fnb'ŌD~Jl#4RjaLAyI%$C9 ϙ !?%ILar׊__PKaDSJ P=1pyparsing.pyparsing.ParseBaseException-class.html[{o8? fM-Ļ5MsM %bב/oHzE6w6Ù̏C 9. Ђ0N:,D"7h4?0w)~v]?Y=ѹm_\ytpĩ8ѥdr%'< QAZɱm/}+ےDRB7Ƀ`ρ18*^4߮/y9ݹ$" mM-4Epa! [Hrj r'lVh"ʍ͙|3u mk[܍ZK Sk` dz? q^6|ƿ݌_giz= 4 0ىb1 rI$ӎU l y݌PC `.R ~,UxDdLw<9)?Ĺk^{i@ʧ{h&^6 gdase3d7uy3QzTl7$H>sp MFbG Ì$xN}0sF羨yo]kEg洏m +BhJlV8Q=3OMuԺq0^M;2*MpK_ڀ ¬xz~XI_(;hm䶥nr- @`8B~D ,.gzS`d57Wn!H`6'5M lQ6'VnXzJ,=\mu(s2*js~xMۺʜ=F+4?4F+(@M˶ <0QOVi/x VhegG͜Xr핀 W)tU@_ z?'5)' FޯdqO .i :dԃpb&MӦidΟxt~<=yEtgdr!svήqMz^%;4_Aj{^PH3x2` Tr8҃ZYd%:<#Ǘ7g#ntuG$b._^ ~3C"5<-^G9 2`9 +L3 zT%BOа0 /2POjb(2@Hָ܌GTX&(?+ zW0!f op䱣Hq}8օ-t19ƋueЈ͎emsUG \ؽHuKqm(.\Nv{g g(bN"Ts4՞ܫO5%w[l(I-EmSZ[zڲ䴾ԴĤ=X$4f~t  (ʔ+dd‘~xJ|8_PXښB֡Qx<~A,4{^yB"ߧB2!jFw;_uBd 5S8pwJ%Uw4%fԼ\ ?ܬrqlnPQ'(v5̟#~E^fEi8%)y<ʰ)1'i}&;%Ipn Q hױǜ go |UoHpU  9T~J?BijB`iS|h-$~Qh9Nt9iw/jՍݽw^–~nb(É{o2c/Ds EC~F,a<t|4@/?f0d Zai$$/9!$տ9iv689GDv:TPfݽjm'[Rù y'^)ƙXpDx6$ZB#!HhJt<8A(zQ.ճе{+ni%#K|Ke,+.Y`t}ޞ+J!~Ү+8vPKaDVdTl2pyparsing.pyparsing.ParseElementEnhance-class.html]ms6_SwΜ%qoMd8xq<]HdM,V?v%rFID.vbApֿcB<>5kFZ9K{q!zl?\ @2T@FfGҿTm> kʯM˓ZTټo7i}u +(5! F6lPEL 7 ~Y7bcnc 0%E'5cFF#kxRֈ&줦؃jn-=&*gzGMiHD~vi@Ǜ{!dx񈋓}*̀ImQ.ܙ>iKq urRG.O8=.SE#^D% OLTȐ A7rC_`E_ՈǢ([X/w82hN;lr~L1𞏙_mx(7[4<3v%Ps66n5i&s} >~`1Ebr6QD=D27 ոgQD4uU] 3 `DzÊLgmКoU4vk9s2Cb薉#$;F&kE]JԖ1(XZ/I ZNx(s_J%"_gj>!'ޘ:%Nu=5TkG #M{9 .'8;1H1FDQq8Kb۟&~sZ)eyܐO*XXiڧ=Lw<ӹ8Y׹>Mi5=GNfeҙ;8j| q] W kz0(^f&i%jm'³$Qe|"YrHqP{z Kcav(,fKZR x>ؿPެMej?j|wcқ 5&_>3~IxH[RaXKG,Tp0 9w15(;-̊#&g(u\ruc!1f. okJLl^d !Ի >/1ED8%iHTy+i)`"#BςHaGcap; {| eC{ew-44@K&;fvQMh&p8Nٰl̬><pF5\u|0"LdIF3IXԞZnB% nlt齠I|pLV〉َ[+C[k5m#f0PC+(G?'痽eK>t?cT8u|`*fNxb/1ق:iz&їLG:ނj&f Y@lGn]Us!`Y AuZUA_ԋ:D߱hduɲ {HĚM$cf' klD'Jh$ҙPNpR7C0_$odLW<8z0304--1|+ SF݅N^eBƶ;lVMh 8:Ag5E[O'Wu_L0]pAKs``v-ALX:)% Kp 2Sxzu1K & wc Zƍ-8e}n.|Ve8@,FO(#S>g@K"硾La MGh0 Khz 0՝M tM`[>r0jvMKs&z&xfփ薆h9wvk}nv̻fD^bŊSLEvbKFu;XbPC>UwB}tzIjQ7Ot7U) (,uNI}OwD06Dw:^ DcޅA3#x[C%y0k|䞼Kt^n ;<Ƹ ]j9Րxqm蛣_ yx@e`țqWd URVB0U@z4vẄ́Q)Y[-21G38cÉm}">fQ5w4*VDk9Qr3fr);Y f8SV5I+{T1 ;bLA1G9~o\Kt~q?,*l0@Zx)l'-'2{XXC,hep~V~k0E>mD_6oՅɠZpZk cTMsK K +f >0b&:z{FeSXey]`08>?}{VQnZ}aANRwa֬ϺN>?w׽Zb411 G9}=J)jpީv(i> *vi|څ E{ #L"޾beڃl}??"1G$쇩Dž>LP%}}oŷA_;E2X7 ~Q6h9xک +ǭb:#ip[5n|ȧƹ>dh`ޮιF0:E"RIW[ 0UN$Z,GєZ|{Koqupɧ"Mfd8Q.*f׭WLdݖw+Vgrs#Wt%Yg]Ή9Ц;˲τܭ^*}y&He9 v.Y|sg( +&%KESFfj;m/hIB@fDlNjЙX}|p怓eFV!% rKRBj0dE[fJ)">x2;9_&^*V۠9{;<2]S<3XL 4 .:k |da9\n|bsSS 9n6$& Go^WG_[79Fv$8B)4')ܗ췓ۆ 5b2 ->r=79W?&XNqP~}4%~(Nyt"4(nx7brK.!t ac_1-̩iMLP)8 UDҩD(ԑgGƐ?*^"{PKaD0) S-pyparsing.pyparsing.ParseException-class.htmlYmo6_be'&4m4"F&?~GR%vҬ>Hû|35Hxn#c0>xTŌy?;wgG?χ$(7#u|#??NoT@ƒr4*OR<o~G7争N<ı$^u; 9/_t=#Qc%pWF$D@3A/riwyuaxCnI9WDB6^dRTDX)EOÍogX\7?kzDɸVAyawFH$"rSP2_h)p<=Uf:2X#^Gg2j4ʀU2^GTz$24I3gN@cĐe9Mjn=78AӸt&5z0E:XdN &4i=T~Кtnְ3IA)4#NeX}mpx{@2uO枰,ل0F, d=SZE/v.5IqEr:6*KH6MuamJ]W2܌clA6S!˔k2ߚVNj6mFt!ژ8W.EO,Yc="˰һnfEBSݑɴseo.uR{dKR7lKq{*sKvMun'm kZ_up&@@M0_%rC.-9+cMrP-mX.>|_ֆMYY$9 Ëws[d֊ 酖dT0(fWkY6 6bH^D!㒴F TMe]#\boMfΏͧ+BcK*cTmԶIjOmd~NΖMیf}PE*X] qMMJyXT9'81IAqY)* 1AZK#T¾%ZdXE $/pA:؍B"NmcI>jXmbQ+5 }{('ŌSdq2nJ-x%}N/ƇGCv8>9;ؒ= )6 F\icx :jfŲڽ:vq^ l?Ĕ!jMvW{h@(VRq eT`g)WGVfƷ;~}PKaD|Xr.pyparsing.pyparsing.ParseExpression-class.html]{s6ߟLo%qouduYi<[ih 2YS$ @釿]<ÔCN#OZ ]odǻq@ ? ka~x}\ڏ?Nλ_.zēP]R7I]{HPҠvHW;$rPz W5CBq\󤌏a#̓~Aab/YX#`mϖe, ^xH.b j(Yp\r01&kl9 G$MuTXf/NTֈNBwQk t{F (q%f@6 sBdū߷Rz/#gOOț::Pt0TЄt:FwtwM8,bj+J;(bꘊz8`cuQwј)U4і "~&VnǑ; XCTit&ر}s>h~`2Eb ewd,g#HN9X?M I<^<Ӣ S'fNb7c ]dic^2q>G DbM՝ wl*@݇FtC+Ґqd</ۀ%T,>),.F)8h&֔n"bjKݯ-S|4ݒS*fG͛Y;(ILlD;#NLhMI5g>Pc/"mZbjSY]I #M:(WU[nإ9qsuENzW 5,jTϑ27[{V1h~XW^ WYjHn(ĉC?DwLCt:摃#e0ݰP4{WމkjD) ae9cB2ZZ d Aa6;LTMgBHlx&p^sU]cL s Q|\{Qa_ע#{{Xٲ^/`huc*%. 4-q\@P;cG#I =jTFZMM9l9N@]I52i%~rzvu{Cds= >0EWfVxb_`9b 3r#bŵ bę`?eES׫ca׋< AuZVA]փ:5`dTʱ n5:e8SfKklD'oi ҐkX1wK>XΟLD2(A7 TN8KdVbfAaVƄdcixm\9Pj>rGD2K!_sތ=cllWWݘFkVQ[Ğj  Ocw؊Pshaѻ`7,bR \Nnhf{WD֘p +{hE! P%UDY\?@e,CKB&+Ϛ1;QȈ ѝr.k\7p wKdP$R2Zsqe@Q`5'~yMrR]Pm<+laB 9Yr!gdVb_1:}ƛVz>cȻWC싲W&/^i\l0*k5N{ɽ*\M܅]R\Y#Q .DBN$DK^N8.epPT9LSq\d[e3\-QS}uG0_U~Kn.tcMQSPW]pp XSxGx˂Y[̙XL&}VXN`bCKBųw!>RùJzݕS] 9Yc[vf[߇P1%9 W b%n(O6Q e`F`8@ŧrk&K+v5܉˯h&4I3WN+wʄ-tuoՅiZ;wZkCT5 +f >.DWDҢ)lUy]נS\v޼_+Blni}eANޡh'ONA]^PX1#B#\jyUV>,SefQ NBMXr+&EIwkZU \ADtǃnֲ h5ǜl-D&ɯ$˅ VIibK;%%iV9Mda9k_6d;U B:mX K!~XbSW>(W$O~Hg*H[LVСlR+Tզ^kZңRpcY4n\Equ;i:{DLO Vk Eq#,ҺG\*J46ۿD\-a"I(91n/cNCT&XNwV|(`3M241lc~;M|ԅCW?{(Ms3EZQ"Q[Q*״QIsR"}DBgOnĜy%3鰥fJ0!M?44Oxz dv7p2g„o@+ 4)o=*@I؏ b BlB #m _*٬X ?1t}Q$g~b!dHO͂䰱8{WtbNɫ#38)j4~d?g>;h>ӧ'Y#d2p{eZfJKO ?KWV>`ݱ!sfqslFD#5GB͂Ϧ[M}C'_&É0끽E>ZtzOukEm0c}NLoN:HB}rK*"Z/_kRg>F_q{PKaDg+72pyparsing.pyparsing.ParseFatalException-class.htmlY[o6~ϯTthڲkSYC& j(Ȥ@Rv<dɕaՃ-\D\SR1^ V1c/^_Ch1:LNП7\1 qsoUa]hTj%Zg\.˃3s3D)6ZR𠘄 3L4V kcߑ)WHt)JJ(J$lED܍^etiz};jK+&}^ B,o0MApxQ+44&n`Wz7=tРBG^MFoˣw4p8J)S`{8^DXz(PPdD'^b&IZk^ܛNp\hsFHJcc©Sk1 t#Bۻ(t)ZPw6^>+uH:8y~Z 5]8ן)52*;̰)dKM)Mp{iR|F Hg)tT$% ðR@o mz ˍTB 3ߪ^ ]u[h&$ռ4)|b#U xPe:<\5`BݱѴ$Rqh^kRT{7K F|%$[`]\҄Zp: ]yh** QHv8MW]V:V/') Ǿ!|_8!-Y Ht֙7G1:ߍ.li%&^u -2PkNaU)`k\c&]VPB%r@6,*e|&*a}#KD6u:?՟nUMʨKPV綍*nQGvq2M Xm(^jmDR@+6)g^B&8lHDrhG UOLGy(OK Liӎl' +7m8(kyjt&&Ac;E 0WD͓#eB9b Pݐ @-1e{*rN^  /,l>AMW6 vxrt~wqQ&Q{zhH7 ANIBd<c_SRɫ<Ιi.zp'u6 Uj(eex͗ +DR=hsSpќ\r)laIsms[`_ h1f:yW{PkWv[m B``"~5&40sz98cy"  eʻxөT 4ɮy0?csA6=~MT0gn OC#8 QϗC{ #)S^JQSi䋛;V` PT^ߊ0c3(, v&_ F$\i*22 YS,z p tr^l+d1{ӱ>*Ss"~uT[GMqb0R t4|<'36`}3BY˗Yy]r/Ucl)g>v98l++`;j_DW\/lX2^`S-TPLsy!i%0C? 0֥J˵FQ>5-Yՠ0i2;:?gOΏ?QY*Feΐ*qz|8H2&sXu[AEa4Y@H&=*U8,*C3eVJ̢+[\W|Iil4ytӈ p8:br1{sӮX7 $ Z7/ETѐ~1]Z<@%ek۫59f<եzl-}7X9 lapY(D &>cD|t`| 9w0<4̀bNȫٖJEn=+D*Y%V# 9)KS+5i)7`2?)Z(8|P%Ҕ3ڳNƹb?V~1U4ً];CT ֹB{<,BZ3b3 ๖P@H3?DAc&n͹f3:)*޻>p>:p|ޟ~| rO#j  f!u.'G<3T82y4Q[CNdU]H pj _kp?mÕҾ48JXEF\z ?߄b7%P1|thV s`6B ,+cԲ*{8,?F ǦѝU`؁i -PWYC[Xe;YM ZNt¶{ς 2o,^=M|nFncq:Ozxw|~lK0C|[^eUqI?|^JyaOD󘒏LlLrQ(N?~+!Cԯi#D JRmM5 쟛6ts\RW!E삸D }`dzZl -nL 7 uS*=s#@5ݮ氻Vá\z.}r-v/Q}(pE$Bd7`Ud=4N#Gf˧Bs\I vG̢x sK5֤{:?!xDH!CxQ/{:`.e#(16MfmO] @BjZRB8Xn&dK&Ml#&mF+fBJ|f ValIeTrVӪacXK&m{=i2 6w Ba_+z,$^UOOGp*8f^q9-rX-~]Ԯw58ZH9EfAleQr Js, _-ĵ-v4ůrGLܴi{6MOƪnM6HIdϓWN7H+j&d2vL& dƯ; Z5rAt%M:'5jR>/}QH#L~2(Cɏcn/sEjjG (ygpy)/s'aLkʧڎ/Dj Vَ(mJzVsέ68d78]4'4K!S=//LgτzaD>-#1^<Joƈ5"][~aN=2HD::M+QxD XY]j=VH^:)ՠ'#В*lX:c\s֡nv/GzT[VCCx-Q/ۏD&%{%9'bƯ| +v&@|WЯlxPL\ܱuFsG-c1+V0_,Hl\Hΐ11ѻ3/#S`X?K90$;'ʠCDp-pAcĹAnT̃F[Oεq#() sxƱ]#\jwFv%FTVx"r̉h@%!Ofcs_@4\FzZve;bG7k2G']X9{}׿!ZV=-+mEXl6L-fc61W35v;d?نK#]4@EZok-R{d$4 [d &ȝ %+9HAc`r0=HM*;ch2*T!o:}/9կv4D e`"w`h$O8`\Mk}.)j /-T<gC[=\ifJٜmaoRc:ެ\܁qywG-ČAKt6gqRrf$Gukz+?XJ#ǜ1bs1ХieY_^sjZ_g+GN~|wt-݆;PY4a 7On4d|cXy5ӁAǏ%|ػ4nQ[+[UX?@P=Mb%JВ0:qmXidzOӭ<Ǚt{y8B i0^NmZhˁkv@1]gˢKf)AvЧ[|n"/%gNH~u*R/3;'vnq#W"wjޒZ ?e1wŦOlB%sö :>V)R^6&9>O&=e:n^1%CxL++qܟk=3"ąs_H3/kA>̾_҈'A@ )ڂ32Pu@tEEK%DE&iN{~)gƉ=~2G""9Vt*?NAhql?ѱq`llg)}!C1 nZfB8Ԗ9Q= &;6oDG9햤U]1@hJ Y(_  2s&msdٞ91;L؇9{hPlJoac+ *\@-<=htq6*Jq} q![@gC uŹ[Ḃ$ÿ)Uȉ!ЮFz&l(L `$onSO!3Cò▊TZC|hʉσp(v@^Rֵ.wd{sfa(CP#-X;YyWg O.¾$4$N7Škb{t`jCNmJҪ>@dO)ͱG+294%rrLto{6(>T7f%l*b}|"$3䲧T!\I)'dOYaQ&$ )t_003͏Ec{!wiD퇱rt?x˯@kt~9]#x`hrdgLDf=(Ks_?wz V!|^3#tbX;j8D@6}gxk_n$l|)LQؠ:z0NMx?M3Db]s JL.#3մ?Ӛ42&Y`L&vcq u XOElT[I?^svHn #{,KT6-E]xͲe f1i2džkuM:CmVlJaTy9G)Dt;Wv3Uu2]DI948V)|rIvJ)CHm_6Q_}#-?:ʼeQH>T2e %;нqp5R$V4 S3f|1l -yzY$/,.&kFBlF{,_fI,UPٗ8Y}JsNO $,nxV%$Nߨz.$R)7 ||pؠ>I 1]+!>>'4"xYr~ Ig4~v+~̊7AFKT341/5N .0E23UΧ3 Ѓ8|Cw~&W8×;H}fS5 $<%fdlSW<; nO5jqNrU"Ox:-kOeFI^\X6DLP ޱmd ۉ-qIj:M}1F"ʱ=)RblQ!Ùs̠WIR.8,a8qKFȁ qN mgB;vbQ("Wè"5 /Ǫg0sQppB䵭(l}8 ]8 lB`Rt1Wa:Ty&aGV9(."*i`W%O8C̛wkc? ek+'i%ezOb2p8JNaDօacI"brl–cr>2 xvC⣖ בTF= q;P§X}dwst0I@-  k׹N;S]FWT{UI0v*Mհjr`x;$z(`@ylCĺfVT l} mZ%,KZЛ5\mZ?@;;Ks}׻(zoMf[ī;-]3Jgݻ8=J.HaSMw[-`va*V^Uۀ+ctM^?1t5f;)m WMen|"k͗b _m;Pf!~:2i?r=A9VgYC, YPP&E7L2blez{Kwn `$B $K2_%E" Q,(To94Ea'TsID6;zPPf46;5d(kV)MkB9>:>؎B?򢌀W^O>ܯ/ ' x(Lcr'i}Dsu }.fll+9@Aاّ|#k,w 0+(_17(xNcYmbWBc<& {O)~3]H xeMk B/J@2DS?n鼘jo<=]wkwڡE;4֨qe?q5(GNDŽ3k`'K@2(Ǫ62԰:߳F^ &UX&)?Dz>p{_# q/q,}[=)esv;78墤(PvlvC\uc8EیZoN:t|,_蹊Sz,9r'_&' TB8]1Y.Y^ޜ~ Tӹ}| #cJy6=ϴ@ki85z`׿R:!ms0`E>V§Mq7܊-v|'83o["`xaݎG\L `yq?Yl[*&De[nHVb-OG; n!a\4\4JC~h4w|OfPt1[z?ߛUcTɲEewWު^Nevlג{"}L+|$y(c|7D d˙d+|851L1r8|(CqJ "0g+j|ش ^"8K@&Qߘtg[al9,Oڤ\ ܣ"\=Jy=od0`<2ObbIݗbE6|oXGWAItt^]bQg) XL>{q2^Hvm&%a\hܠuAn!\8>f6f fgV|8R!nQ,J1wO@|*pK^{&Chb"ɔ R>w'ө*?SMɃz"W$&nY'?MЖY0wK)[Bvb#G4j%"/M"PKaDQزAֱ+pyparsing.pyparsing.ParseResults-class.html]{SHOQ牙=`؋ۡ7` bb(KeY*<2![ˇRLT\$ǍVAX'UvqI~~wqJvO3򯷷`@n%Mecd? m?"ѵB6@a*%iÖO?d[7(%K$< { Y/ [OW]35-yrO$JOc"tD y: E j=MqCG6ۦ $OuG:h(dL>F۶g@Uy􇁈S,Y3<(&-g 0|,"J,$I ]ĠHðЛBqXV L!c;FfmNϟ4wQjjh.tu&]h.%@G}DGhfVZԹޛ/  yvGgqUvj0 6Dm6GEmJ>:6?IGnAx4]+8wy9c8"/4RfMe Tـ}3,)-k8!N;i  HbmM{7Z=,$UiO @O F J+"P4IH5=2ƱѧPJ.Zd׉͡= *׼?M,\:{;1'L,֒[?| a,ձƮ9y~R((a!4/iLG"4]xJ~9BO ";jThb &,ly"?n5|PqAÇ|RSx>-mir'Xu7zX(s 7WJg\ԴTOŇCӪO[ l"=O]% N0%[fJʐ (ѻ +)w3 "J0ևXCeO"2d=/*<<^v[ORI ww I@b:cӒtE>-og=Y畞*ȵY(6lVrGČ*4ѻN|⋾PlU22zUIWG}IIIϕ*tv9h_骛2rkmH4W7oٖ0v miV5--#/D\+u Bl LD'035_P8_}kZf[d8=8k1VMU!0z1L?6ʄnA`vf ]∵䯌Y+Rfqkmx8l Q[! ~8̶¹[u FKo1yBX-?%B*1BA67\ q`\WAqDUѾ o8NsG~{b`HDG\O.c)rI,Ľ2kq{`(Wp$SO2Ql,jϰ̶WOM8#XaJ+Ue!lE Ļ&mR*ЯIrAޫ/~mɏl2](]RVKp)״<ܢ\6:&e % $1>aKQ `E#ڻ謽]7szTVc{mA+^[f[ut(&%}5w7tu:0J#b6b& o! =KSi2۪4eIXo, x<$ l@ !Ȫ|oVuQ[WEbl?c'xhq.^eUbFe!0`)O^W񮘳PVlh5+qs3-Q"+9s̶ `SՀ+NeT22jyon+W~5pqmK*7l'gI=^z톌v*[[7VA-hU}MV̺fB%SsL;0Yŝ=7O3)ɄIm!ҁ:ϼuk[f[BI_v9l+\kVtZHf5x=FBgD89ǝ?*{s{r{qw@gxMQvl}!{f_,/!:oje( \qKu%T/Z}Z *_]:8/HԜ}cx%8[/m&g'ʠf3Ex(;v/ۙsܱ1)i-sQs}GX: EX&?/Y̯ƎO r)us*-BΒ)@ܐ"-}.Vkf#8C@l:2=4qabBsˏHZe?L8F+jY+ Clm^~uT,_3 7Bɾ‘'[[Ij4 5YgK{kY jN\<͌vK _Inbْ<l*U׭z9iVuu[م)y&/%z^ 6jڼªpxڸ!|`yɨy8+xl͎3]ٗDtV:%Z;美FO]B5 Xw*gY↜ռuKfؑ{/:_*acYgY[SBҘf5RM_(pux: _ ͋M ;WY3sHT(dܳ QW,-Wٷ"]#ӣvAr>lǼ/"+oHdAp _Pm vI('^rr{|rf\IOea: :#1 o&F'm:rWCCh% bp+su88Lzanl?O,Ǵew%I𱈴+)̤F$C6/t2^CoRѬdo܀ak!@g;?]TV|>d>B:o KJ[ '$xa9ێNDefqDyOiy>ڤ޲ "g3EO^tU ylHQ? GPm@"a){qS_Łv,lG| ߅2{&4x}f[M҇µ?Yg-y+_mkmL)7קJ_q{`HV$shUTHSg<9(%/O,#Ɯ_MPoq=w1@z3{4K!NJ'=;{Vde&8u61SS'Lpt!}xbQn~uiυ.~z6D>Ӹ.pP8L(,a}8^X8(L&@gÈFSE4I2L,*jQ4Z,,pTڵh ,+FHBkm›tEF'WqWU+ٵJIСAUy偈ALRf&#u LP؂Q2ͦ ,Yt?oh}HG)ÊdxIB,"2Vm*zp doh&:c k43Ϩ|[ڡ+nT&ćټ4)|"Bٰ x߮Pe:9݊\CBݹeRsO^X)RYcĦ]Vk$ [c] Zajt rBHafx=Oe`uoQsbV`q[8O-Jƹvbwo9{v}.&WbKjxϪLW`㮱DP!f[oO9Ls`<*e~&Jbi~++ Msݿ!OZ*%APc>jq{⨯kn i86.e%[_ZQI_IK%RHrF c UZ'RmsPkxh\dkO|H{zX. HhSYAZ&B~p@iFVxs\-VP SHTV+JPF8TKy 6"Pt{j(h646]Oл #ڏS.}GU+~[+jۺwZ*w\+1 G ]*T7&* ]@u;u^5񨰾YzEi) Pnl}nmzAW՜C;۴F-^=%[.\wuOsƙϻѬ] J'(I4B*HE1d\P؍np)'+$aۥI 1!> \к!y'BeES1{;bN!k`x7Px(EeRSiHWuKE zf1z2JrǑ%hVw#EDz x3Y4ΜؐW>2{7sf? URQWXcVCDиLX$?0,kZ@3}n7Z d^r o7t8Uq7&fC:+[kYZ~oTHZQ)~(*`BCPlwXdRٚ RK uao鮠n囩%4ޤmUnxh fUI!(Gcѕ $M1>o[c_Fc_elAcgrOʏ&< ޯPY:ؼViP/ !%ᩆR#萯 b:G{Ib^ǟg}xvdzx6~ZP'vZ"q ސs-]e觓z1Xhg%$!}R0C/ŏr߯9xIA:e4uxwp'4eHG6K-GE,[Qݟ-Ě9,t@JAl\P@W) f^ X B8OzFj!B6r@wcCϗ0j/$ޚ s mX(͹:zʲ2!!_q0/PKaD'* N+pyparsing.pyparsing.QuotedString-class.html\ms6_c=g.7::4qRh@2YS$~鏿]PLɒC5!vXP vqɱs8%~DCEΏ_N&:PB_^iÁLN?Nޝ @&&"@Ʈ;2Yn^S]u]3v^O;7a$cNj !ke+fZkq?ruS2zF^/Z@AR/fďuIGC *s2tq8VbZ юߙtGQtk5pp 8 fYxΙ_IʰmU.-TN]iǬ.ĞÄA3 &$`h1ފ[ga07A;̗$%.Q]b*F{K꺤u{q}-eGhJ\$lܳCv#̰ЕAL0:,y'J*8"GG MzX"P&7>elg W ]â2QB0W xtMeYUUdf}%w!s&'M ߴZƕM&*IߌdP.ꁅFNYW,xLN\m0Xq)] M:"xw#^0?E[Ժg8 Okt,AXX.GG"n-£%~Xs:(ax)GiT5 p\1Q- v:1ƞ]>t*N-0_%\q3I r]oc=]Ws݆68pWHǺNP~OGx? ɻmuIc2LLa-p_帲YDLc NφK!2ĶKm5)ij)`t%N$[NvA_߂6_ό^,X;76׿8&Ҩ㕝6y [Y1v 2QXl 'JL 9քB$yiU7*5uW3@Hhp!(# @AS1r8Z.L5ǬZ>-mv. ']abeTo,mHO.]"<Ģnbjo3,N-Gi_Es~!FX'3gn: Q=ڭ>RrgliU?yoͫǝ >L)1uG]p*0)rT,S(Ah|b' 8uqQǿ5y]j J–ӉFP'LSǿO&m/Ƽ8ˌti-]/tF9NV?nT䞡J ̿.f>Aӫ>7 ̿`~΅>7 f P; f6uea8D}U]@_=KpB14T*j[l3`J &OEiF0Ɓk:2sfk3ߟbA/u?:FKtqe+J`EN u騅ܭi`ZPAtggn|zȽ Jrxh?*!d^bnOmKQi>9ne.9~jcTY;]6fZs)fL9 `sC*ګ7y悔QK:X6uU޿FZqd7H\!錀 ^I Tqۆ]I)FNT\1s@%DcKWP&2jޭ0x}h62<_ $ȅhl,ǜ},,/{,@*ӿ -y_AE7>v҅ì4Ќ /U½ aki1ZnaY,3CcfU[_? u DiiYjdxh.e簵`jH-Tvq[1H`H6Sy E,mn {!Q> `HB_E2U`l.W6|@cZ{C! 7Ϸ0ϼw-qҜ+}(ҳ,' M&Y7Jo,1T5&`);37mz)’,$EڏVT?JtWkjU5O_͋J!?Wk6lo ?q{[i*l?P1i3NˣGsqC}^D0~_Q(ygQ02Y/adɅ{kڷ{,f] q]D%/f"R YL1gz"9lG@@s\4SxAR1KrSQ*q:Nٚa7Arс#J",OxͪK"{]#dY)8ˈI ̀ bށ zaca^}gmʓlo%zwz 1Ea8)s)'ĄY2"#^弄B&&J*^^؛N pXr fsFHLͲRC:Z-!{m3yJvuhm\`q`es2~2U>\G /dM$2;L)xI/d0횧h(Q6n`*" CZnD@o^QFU\-o7]֖PLBO6;*Oy j_Cʬx6HX;Sڊ* ]IJe@1a*"WDe-G 8aT(6_ &Hb>P'[f Lͮ:Z:õA)A&$M2V-w[t>=]ֳLomk(A-<^Vfk 3t gCUM8ж^d"yX"WZ/E2^v eF]i _](%B; \d좠 6 '$Or@qȝ'N`85E\X^R"t`$ѧ΢bVlg|8>]<&2)٨ ݷJ[Uí1a4_ދSK9:wON+Wڒ=Wy2sG{j9< yʔt"_k6 i;%6=$'uH\јՂrlSJ *RK(>derY b\ľv֗:wUJ&,ܒAmϼ/Fc\*'_5>tU9y1'{<trC{2d_z/8!E~c>_*~?d6&TV[HPmú?a.DJnJ@S;okDb4ĹͩA("&[ @S.AKp"`-` [R9)cH7|E<lM-Ob8*/(prJB &aDû3 ux֐--_PKaD _3pyparsing.pyparsing.Regex.compiledREtype-class.htmlXmo6_be'֦Mb"F?~GReN`sǣw,AHyccwv5>T!C⸞fg' L\2 iyKCޝVwUA;F=ˁ*Uxjꮎ\̽۷oN2!͓4Ц (ywt sF|Q Z{_Kf,%#:(4Rcu#);噵ge$X/tI[H5JH'=KA=zy&<g2h 5 0-E]<;o&._OgKz?E HQeHCB.b@7:+a=wHYVBqk3ڋzIbeA K`\8!OV<Ż_6г{ e]@=O&:3OCCmT+:c{YCX@LlJ=9d(Zgcm"IqG :m"W6ɵ ԫE YO)9M9S+in{/ 安 TT =S|TcT%7 :/聞RG '+2H=4ߓtvz9lzO")q[q(BhR< P),CwY.0͘id vjjLCڌh?^Z5.z¶lcSo$xF9:,!u𤊾N tƻdA>s- ]sb}nmuHױj6&'z=0ek3Ydty{BDK n4&*E\=0AsԩXһ<Eػ\RMQCSL<On[\2hRT"Tot W p Y=,u(j@4Mcҟ@gHXZь.#, {ebږ^)kpSREHjF"]@K,R$@K&a[Z-*Q y%hLuE R{Afl,򬓕HpFtR°R2Τ3S)d> qMGFd AJK9s^lbudx/{#mO*ǯnUh4dx6X/s,LO)Hpӗ0e[TǫWhBLsRk_ka k[ne.4%A ܫR $!aT.ܔ%sԕ~su]MΝx6#pT!麡r JJ@>2 ^޼18[.&L2 #DB^jTR8l<9mgҿg1< 2^vJw $G$}]~ xQϬ&m)"H/:s[b[-϶23fc>cmV6<]O ji=E 9WXFVSYdOvf}v6?Ul6\O-m:x&c3NĕRSض8Vm[e %![!84}]jƉ.5@aBCr ,*4N>&mx48mƸXn]0HjK?\7aYdQOfFAy61Uyp3p?'6ru`~Hg+u`IeÄ!Nia ^^@YhNv id ! }s24yOE8Ai 04#>Af~ÔjJ\IХ;ZN~iטFW.Rm%u`7g^tG#5[ˣ&s>-OKqð ǫ\6h,Edδr5 B axEa$G{uic5é? _]uN'3*!0xG9C; &J,sywFiUT0mљ}:s~dT!0jXuB:}=UOz/߿ޛT6MN\lWYk9]߼ߌ{k O<+e:Er-yd4W)fbW."TstZP][Mfm0K9<oPYY;A$ymchCZK!.!Sq/G2_$ 6gXEx#$w:©+]HhJFNJZECB"ܧ"LP$&`dinIIطAf4 xP\FWI1C0/>z~Xst;QhGR8DI>OoBKKs)Qg=G&`s;n!sg|u4r9чϾfFyޏ 7j> AYq"u Xlne :iPw?juOwPOWֆXL$":Hb;}\i>A͇YSNNɋo_vЋ7 wz*ܙ*;#i !fF1JDf~\4Qļ^Dr@q-Q@9lY qơqHdL~ mM Cs=jA9I>M2!d_#5P_ъZGs? A!?In)_Ux% EF}=RɏQ_iџPKaD BF%pyparsing.pyparsing.SkipTo-class.html\o6=O)fZGC긫4 boa0hȢFRI<7YeNpmh(|7ڤ?<tG,=N4dMgg!Qoz\Q,aOo.=|i/FF/@#SA%ĉ#T`di\;8<3/2{637=5U$PR4J*d x鬽l oi6b]ߌPc"N3OEBDLPfPEF$p{K`B:1^J􋜔=1 ^}\*'2ffNxd1ي:ij=^HmyR[h/pۃP;bWϥ}A,e7Um)l{^=iJxE euǛ[!jŒS/"wYgCry++Kb|H{Կ[v6 hZPǦq1Td.dZWpV߸sV88}("jqڶ-9r7 Rq o :!ȫB }jfȫ yjwKڍs8oę RB=q^?s»a܋*ȴm'wb'?|bV0{ u0X2 V[j|jlAv}}˷w>Gj$UR*9^Pyl84T?  k^6 1c0ea]/wRX}׶oh0>SO 3TA|aAˎ FU=r4n0{o^Pao#| %5&uf4u9KsܟcA5/Su|p JJd ňuG ;-OEETW`n|K/r|q Ei7kG&׆zVfv;t.SF[9ě LyJqԫ,s@tTPn$ŭn$9X^2q`QT^)=E*rU7`dztL%:ثDxŽR=5ŝB;~(ox|]2Oviezʘ0ڗ ;:9Vx|Vc7A~[3[C6NAlcL;IJ8VEd:v}Xy3NNW^vɷ6 C둽IGFwcyiVSv?al PH;%r`Rݑmj%⦨H]\@Y脄895ՅN{%Mi"TsusB̬;*(05R-ͭ/3ͮgG3[Sӄ NvK*B(.&31u!#~'KOʏ?PKaDq B(pyparsing.pyparsing.StringEnd-class.html\mo8_SC-mSG q74AItF$ċ^lٵy" G/ 4NvB$bF7/Aog\ P ۋaY-|ܷhpĩ8udr%/| p{RO@ĶwG_ֽ-Itb9JY(/I`v!qEA]Fe][IFb",02ǹ"! V=FQnXZ3/g[N-0\[7^Ժ N-7-H #7)4ͳW:?wqV\Nk~ikoaQ_`;s y$ kɇU wt yPOCs,qF}?$Zpψ_I3{MoZOCVH]aCǠ6'>RZTɰ%C?'a@ Cq+!@HoHt3Sa&U3td[2% 3Ģ3sz[ "hJlVqL<069ԷFI&BW:BȈ2>Kg./I~g(j:{uJB]_F זD WOSF/ -ϰyߡ9eK3W ̩(.Nŗf^ :@a|fG7 }5޴^R(nU(LsdLJ uL׮)hJ--djY .h9 Pimn{_<hR"U&"cTod˰Rֳrx2/3PH'NMX )vUjQ}e"VZ6\ dm0l"p3"6uI 2nR?Tt({RXKɣa_3Q!d ^G),Qj}ڮEGs`N^ht@3&w ' [J.$7aTNY2}pj8]ƙ.5@9aBCr 4Uh}D4wymy4sym9}ǹX]l?H)Hcm'3b'ۏR{I_goهr 6[Na0/ 5RXi8Sm1$14P_f<'%(K INS2Ql>,OKuQ8X`B?7>ʼn; bq,We.@gi8B4Bctq!wv5!h;0C~?:lC^tCtYu 5pmD}TUaFLB.Oy%N94Nuǂ< ]D96u-BwHp!#^s) BNF,z4Fhouo-B¹ T-@/d*SmE+o4+K@y~PKaDy B*pyparsing.pyparsing.StringStart-class.html\mo8_SC-mSG q74AItF$ċ^lٵy"/ g#LYqGQc!yOS sR(ۋaY-|ܷhpĩ8u]{I%Jھ-Q䁥Zɉmݵ1^~G[I%$P^4 *B$xM(H`&&4Ea)N~=-$ 9h1r<ǺBy9/rnmA׍ro8٩uPA (Zn[87)4ͳW:?wqV]Nk~iko{8 5}]jkM^ќ0!LqYM*4N>"6NUl ",(7 $en!ow zO٧b6})'̨?Ee>}O>ǃIw=ʆiNs2$dj]sujp=:W,NGsB1A/u7Jtq % E2z7Z+hEtgv?~ʙC986-jR/ÕnvwR[dfFL5~, 3qFdx;[ҕ\%"ـ@i?]?GIS!]_8`b'8TA^LD4C:!"!DOJ~|(;Px8w#ɫV*nڮ[~ؖľ?;u ׻{2ϕ>0ʡ4[zitvΝ>;De̖~n|(+ivXI$" L]Zq>BqFiz CGIz9) CfjxCRќaͱ du؆膴#" ;BdC `B \l,QFՙG҅ Sxz;tSS=(AJAxεESo3$b=jN9&_An*dd bDʪmFVV($*r$A[EF(}MJE?E A^;PKaDtUA UE'pyparsing.pyparsing.Suppress-class.html\mo8_SW[Nۦn i $:b#KZrE IQ/ة yf&tYqG'ac!yO sRw7.(0aY-~Է)9hpĩ8u? waKƵ}[K?!c۾mcvm>\϶K.Id%i;TI vI][C FEHx@P' ?X []j6MDc}By9OrnmA׍r8ىuPA (Xn8)tţg_;uq\V ޻zٻjݐ /$s3 1 rK}t:X#a`_OV!#:өez14 gCoKQ+4ѮG.O^լkiHʒIk:Z6@ƌ<O $ƷAF>{ ,I$֢L $ 0h۠] `E|M6 ׁYo\,Yn +7`+Ѳ%1[Nu5ɡ'] ## x,$%Dо^\"t|\o\)i er}ɍc"֖fe+BՔvcrbaZgՅᆬ&KnFZu-(2* 4BS(1SNqI1\dT Sr]æª]"ڪ4~7zy2LWT$Y[ʑ r2MC$bc67$(I#OX0e&PE5P{p\_OJJJGk!M&4b2T"C>s=L@2T1/ R&,zHaK"$xNSoZP9 g I X3i^dMx>A!O5@kG|CM_ jq&[PLAfi8hqq|/=Y[l?rbq/FLA? }8m8Nd>~ nF_ۋ?gCLP}=r yqT [%> ; dj=/+MC1%k5 =Af^Ô/FVM'ۼn4 DeP n4O^D)]7vOE*]7V<5 vO&> oj$LX&BNn*A]Ljzfn9XO"t}w*q|ZƎƽbG ~obEuQ$꒻Sl84H(r kn6 8s{cnDS .wm ̻]j{yӶfTB`AɎrvi /$d0哳:(netN#u0Ȩy5r> iʼnR;v|A:fal^MuH*3LWЮ1ߑygvDDagRS`v,LKǧ3"G$US Sxz{CBt'$82B#!/f2DϚSN'/ /S3bu[l#4җzF!$9>s0<{7TNq:HL_F=~BR;cPKaDfU| C$pyparsing.pyparsing.Token-class.html\s6Lo9K\(h8>KI榣HHDM,V-^|ȒbT3$"a"tEn gq!,"!8]߫%̿zbG^?}||f48TA;@?qKV#yÖRqRfww׾;i3>{SNvIR-E(̮2!A0eknH55 $9\&DĄHŜ̀jX\f̓^׫Ei&[lz=$xXExA7#U;eM!K?b* 3o8nųo;u|qWZC{Kw~N$& p )b)mHƠ77 Id82SldLDsXsn 'C+Td/wqk~k@=9y ;qx 0aiDRIgUd,6ߐ${"x K+~!D1HVU8DzAu]uX.fdKxճ!TzXz;ԝי6HY2Z+.NKS'b**_*8BXc뭾X!tJvch꫽Zv|Ja|ӧed+%*|;qzeUܙGu jBc XbWd? >3lxYfᚰ;15Juj>A{Sύ`Կ^鐲v'񱓣^Oxݬ8htol W rZTDX dnqFT{VJJ5{>HGڈ =]!9iZA[(Ͱ:@`IeQt#^Hi׏T&v'Z R% uC|@*ÈaBCHTN,/6=XdrYمOdyFBCa@J䊙dP/[,øivs&I4\MVu`dNkt.$>$FBDb\?VUbBueXn̶|0΍SRRp`E@kZDIU |uY+IOVh=+YMQ03T 6z -uX$oPy3E+K}ܰ,(w\E;N*ʜaqe$?jN! v*IS!Wן.Ozg$P~'hܻͻ]u Ӑ%2fyd_5uj^W6b[YT[bߦTnv%Qy} :D?L dU VKi)J7 $3+O!}\/_7 $&a΅_7 2H qAoo~n^ea85}~p%B5aY3fa>Rz)[l 5!V"ĩ;4< U@'F߸VN[֞k%h5 ,Xr<5y"ť{Snm\kTz/ԣ +M~0.`1paqS80zѮUpEO|e(,ч&$X,z g/DtKqRJ6qvo!6m/cnI뫺Ѹ7n|MgX}mIĥ 9^Pl5TȾvk:Ad]At4C}]{.v9+&>`N4`wXUx0]`MgtK 2R̃&zhPaN\,QDE%pJB,,)"Q0fH T $ |Ms#2LuWKZS[0;`^ EBIJ]׳4ǯe %ԯPKaD ?-pyparsing.pyparsing.TokenConverter-class.html[{o8?W[Nۦ6ƥi;%YҒT/%Kĩ|6@k>Kn8McsI4ձy@# x~>t 4e8TACşC;I#J㺡QaI ?v"!#׽vSv~Zv䠣UAEI 8/-3 %WUi^d& rNLkH|p lA7AbcG;᪺fL;[YPXp SvFTJǎXJ7Uޏ=+h\m?t>y~0ޔB5hAgyLJOQq…tSX<27lEa-7^t('ͺ\[ȧ}dzO2Ub'GjZ 2!n\'Wٌ&TfuHgH_kYxn$r)ĖS8!2ikGd!8;ˈ3rGu-ne z ℨ! c6$ e`3zt)k&G ec[//g3DZK_5y:Hץx–[Yf Tu oS|ү=Ya[l7 b1/F2# ]. vj'ۉz2l7 sW vAn_,mU-i _. '+LE4{`6Tʅ[l`J-'vSVAfATjq-At} ]v|cڇ{ilW>Թzf W}%VJ.gR}a`mP *ZP)[XPkhn$.,}=gX7d f},v_!S?dܮc$̃SM7[;刺t|>tO~|L & O П%w9I!2U-&HoWްeXD q:-E}j a]Ayp9=P23fTB|cA {Z >MgOlx:8^CctCr2<$vkk~..?^.L炥<͊?bA/ut0>FKtq %%4}wYG3?ܭVBzgΩ{-2bOPWO?{gw$ {챝-#̈ g1^}C\O\QD# Js$"[Hmp"deD|gPNa/ ?r3LPxjfيZ4#,2r%$E>EfC5jMJyҽkyZJ; PKaDv$ C%pyparsing.pyparsing.Upcase-class.html\mo8_SCzW[Nۦn i 舍,iIʉ7$EزcpM>ĔH33䡻B4'8: ȋ}ݜZ{Z8ݿ}}5@W^ jmп/@c#Nġm.Y0ԾDZ4 EX]z%XrI" -I`̮"$NH0ݴÜtm=B it O-.!!B#S ,k{[H,rj r/lumc4/x] qDpںx5]7Ƚ0f]@0tj!nADP^1^u~1 ջrZ-tZ.{m~LvCsX],'&E$,I$֢L $9 G0h۠]  `E|C6 7Yo\,Yn +6P+Ѳ%1[Nu5ɡ'] ## x,$Dо^\"trRo\)i er}ɍՖf%+BV[QK@ߴ_+nq+B ŚbTS۟[avݤ`Կ^MvP#H#ZZd&3F-%Oe G!24M,`Uz,)2Tbr$bϕږۘQj" uo^'a W֩().AV`̨GYkso#D8hep`ʿ\BW)5/M\fa ]7qrQ$АS .hȐ($fS5gI Q (X%=JrB8ȢȎ<>,E>xJVJq;SY5b%3WG̐La;ҟNW'-mF~-:d/G&zI@lPSd.v0,߂BbF%3ԕacpu&gv+C}o$P *yP>{z?8\2X'"`(d+kT#YgK>}Zɬr'$kxRjT 2Qӛ͛jl2ɲF$4C1CnA: ^o7oY\w6 H),7ӣO&Ђg2AӘ!H)\ˤJF4ZP9 g I X3iy{/P2X榦)MߛGdT|dG c[5y8@׭z7!LqY-j4N>"lxm>=Y[l?rbq/FLA }8m8Nd>~ nF_ߋ?gCLP}=Rr yqÄ"5e|"c5ki(FTd#4 rU@-<JjB}8ٍaRlR͓W}%QJ̓]"+ SKM8\BeT4f3n4P}GJ>Jd FD"tꦂ}~jM׎OwRlǷhzsPrSM?ƝDR]paa9ˆChXsaXD9AT2Ű3ma]A}]{o/vK!>aF%():,]x|8Ll؛愹1'. A$Yפ\]\;ܦ;z̃9\.t6XN= aYhQ&{]]YwG+ʧ?S]NV3+ bȫe#fJʰmk`6EUa]23S~,eRO &8%BE x3 U/[ Ep@TLsQJ /Α`sP!<<4z=oCjٹl]Je@Oη|2oʳ+4~]vκ{=. -\Ӯ$jpk<n}:AHep̖~n|(+)vX $" ]ڦq>BqFiz CGIz9) Cw5!h^01N iGDv6+?@`B |6X>%0#&O ȧ< v:zbAQ O`T<"A#!/fМK9|x/:fK=[QKp.xNg X \PGz jqj7_^ ?;PKaD'\4 V$pyparsing.pyparsing.White-class.htmlio8{~W4)f;83 A춻 Z#5aˎmw)HQlr7 єPѱlYDn/No'o_ϡۗg]d5lA׶O'_@#pC]X;(}'7x_x$x )bǖyrh۷ۃfLYD *Id$`9'%؋ypҶU5 DIxl1> )dneB|c;ng[f. ^lXZQ7YNV-@hiboFnغ2tlB@xHahe˵b t\.:~ \>@x䆘Dx:Bz] <޴Z?X%a`ONFVr[j(נB K6ш%G855wߘ^T#Gn۸ (v JJN R,x0m w=H<CK$.G>HIjUjdh-뜆V)b>: [B ( l̖8QVZcj >qYhsR&mFKɈ8oW3qsu|%t+Q}[6ڂV͎ͽ\)o_FP2f~|L1/js\NIhq"d2SwIfq d4 ᗠz.&3RPO$aqJ]K&LhF)t(IhȻ$?ڕ3x B2RI"mD*PjW7$*5x8hD@f3 ETG' p&~`@qL*%M.b:a8{^, eƔxh4Cw%ma0tC'_0O"D"` @)% a{!f8넌HdXtA$1.xFDG#1NC.j s~Jc~$`|H=m;!o2t@j$tbwY%<]K] ^B` `Γ vAL$iP):(RHU_i]^;Q_A0A2i\Ɖ'5ZY*Tcs sssrF? $!{HTJHƐ@xErbiދ}xq{B#)"atKq3+;'4h40x<2m{` @a tb 𳨗<0]n ^9D]"qׄ)ai+T03j]#D76rc.ÔFyaQ0 UtBZ,OCJ|8Zh9Pex& S"X yN!fBAXhzL1 dGPIaasey1$o \u6Q%Fm3$ʐCbrw!?B P""pEVf +%EjK/]91sC{C l+" xLp[;pݎq̺v̋D H n('5I'ݎtR2$ ,g;ɤ ˑm*s\7WM)u#H85VoA`"k<%ﳗ)WԌNt Ahs }qTxXS/=֍*f\6S%.Ռ82FB0u MvD%%Fd~'dJ.TiKVD'ۛ)BKm\]eKsrD8WW7R=,+׍$M0.Ռ@?tb\EfMQ=T@`?vwH@vCPׄ(di.mKCu3[ڃ) x9Iq|uZ}`&p͊/װg̜J"!.qޓbn9ǚ]S -f4bXYN^L;@\ݴ1owNuo9HQQkT)qhkT 5kӏ- i̱{vhy?p~kPMMe*Dٕ-;rM4?+Cx8TF6W`1sy rfpBu1w?}M]{zsk^uZ<\&3dGk2Q?О[4x-I6:-*mᬦJG 3һ0\@B|x_HQϫ dhHE悅WѶ= $^(6xrm Is=߂ˤS[<}/f{Eon['h.ə]w->  MRFaS/+l*]jJW;h@R$R@U\ hw= z= 6$[VꚂ]od/Vհ ?YjsүT2%/iNZrw}c~w̭Ol Mocq (Do*/wIM.omVK-/Yo^Igriʠ`|YqQ^b\ Z),l ̈́*׮㸥eLXZ aI~FHO ¡>ĜVtI6('>i+.\BE=]He:/Hg3E(~,a!VaxIg*FUSh# >:ȝeL@iPOW-D!v:2]֞Y]$z 锻ݝ3$h Q@DI)3TMYr]wِg3qt뮔r+<}_zz?p͆xODHLa-p_3L9光Ɩ|xH6M'Y6bΓGcx,]x(I%ls`[KBH⩑bkHƵl5Ըݍo^gKlJp[26ؔxgK&yE:2-7Z o]~>f)wgEAPxI)N̆Sm;Zw9X{ꪠ'[ʣm#m'Y1y]Y[o9,#SvIJ]ěX]f}l< Q=a]qk8]15y]j Jn –ef Tq g))q-vIti[`,MdV;NԓYdQPM }Uj.gn' fw1{ M0 4M!"& !6eφߒ<BEpy,Ba@̻a>F"aSylr`"Rlj]4sS@ #FTyS2#:o5 GT[ <%2#?K+ @.5 *@g`yi,%?0JR6aq{&qtaضT?N^3D_k8|X|MM2AVvJ|e#Aj\`u{D 6&$m*FѰt+`&d T %]wʓ$R\2CaxdžMSH<$3W润aXpD1(7 $^#oZg5 :gld"u;ʙJB(_H61UuPwEoN#O@FUFBkF~Fh]O*T >Lmh0]^9^Meæꖰ dXyv廝&凋h]`4%LD_M*~`_Qm.!-:zómDuGqNQ4^riA_).sj~h)G{/T5 5KiJK6A6w -3{& mRk7} 2t<#L\UU쨩V>/(dfxdgъ+MQ~\)Yzq JIʣt8[D., /~W>b i? !EF ]S'u9V R>[%kKAsQ)>T~߂;\S0v1O}ތK1Op+nچz#-E5HoN"lwyџ|8+|O<|OM.*|[}6lo2vb魄[O$[^iqʷv}_e W;߿>W?XuHH ֙6{i\{6xkN($W jQy͚p]D}6{-I'GA߃'ƩXPkI'QLE C!f ѣn#$$r1LA}Djd+G+jYe+|Jo"o^]Hn3R$u$Ŀ^ǚ+ )_PKaD; E&pyparsing.pyparsing.WordEnd-class.html\ms6z_cw\$qzmEVj9Rvn:Dduo)KPM],)@n1.(KNfA$ XHɉE@w$_yq"{:s|ޜ7GO>5E,j$qPQR<=lK*c⥋xɤ,c<%a5$85$>q\DDHEoY p\đF"4xM &]ul> ȟ,fęGTN'dJ3SycjW[պ5d__4p؏ b,`I<1w#0M9 ej}砀qCc=Ŵb=5B '4 $Ni4+ؔh Ӷ%Hqamf,c,&MmHv:^.@9 9 <枰4$cJx*696ng$N Pa(v{HxB6 HV+[o\W,t!.so3n%Z#Xz:ԍպ6H"eV'mX|'%/!ڀ gϖjŻ:+]Yal̮fchl'2,D[NRN,pE(te쪇U*jcڴʘ)FHb>!GzmL(:7#GKk%̰,prj} 4 ;+:ݸt;: WK%[Jtd5iD]9:iwl "Ѥ,)DE'hf6`9 7LFL LyXm,:J5(뽲+=[> d ^GL WlkT uKX]2j1zܦAܓa%ºt)*j+,DHFd.BT ,uIBk;{0T3aR2fq$Dz(0DxD23N8xs**]W\C2Y,O ėD{yDC4UQ2<|ex'܀Bʄkil*lj.NB`hUMh(c!.o\4lK4{ać`KT(78Hڸ BPGsfl aLGV6"4Mv%V0[cT=Ja7p[d  TyyN\7\r>mB_huT%g) j r} #©s6ͭȕ_=p8M@[VPaCzóקw1~"$NȈ_ZQ.Vr&ޖW&w6ԣNJQ;fwϺKռ$u<lOWdxF#P9Dqk(;tu?Wᛷ~u+,(M7m6EtҢ=srG4~aCLw}pT;`ثڙGXD)@@r ,_]}B wY;s sY;s^ߏs»~܋4W)m'b'ߏR77{RI_goهr >;^^3XZp534qHgcgz˦ef8E@^>Щ>  Re0兀X}\ ńԝcuCpbR"]eny0Z@'Z?Rϴ'ex;Q7KLc+t_ T슈,xT/[fZ *=AT yf}sOR^ T?93ng4 IIqH6)b{BNLD o$̂CnrBl6ܝZc-;3w W}˷&wU(uKǫTkM4Q*ʏ67B55¦Ad#-5$I+n#^ߵ-054Co;W΋;6*!eAˎ EU>9ޝQs5p55{ӌp 2$d:ejؿ\r.6K|2\KLօN{N.VbRSH(iP¼Og(Ft˾h\w9Huy?sr[AA}NfI7[drp۟PU}M(1,25!:CDxbLeq5nh4w:fo!Քzq~Buġ=hNC"L.f0,Bq搩j `Z0!$ͳ &6(][ANmQe#s'}A.Ygݽ~Ixi0ڙlwHsvnٟƫ K}e>lj[OycL?p,ͅĞqG~&bMjFknY!}gaxdT  YH}>7t/p;PKaD{j E(pyparsing.pyparsing.WordStart-class.html\Qs6~1Ӟ3r^DfGXw㳔$!1E0(Y[Eʒ";Ti $K Pif ʒrIdr`P~;岇" /qX0_4N)ZxlyC3a@ x┆aLmږmYfn4,bԮ)māÐ ]PIHn KCH:7cH~Ft.h'DH' ꃹp:d b(uC936`[Вmb%YxRϦ(i~ l73Th>]\Ŋ( eq]5Ӧf;\W7Wɕa1 ?}Ny{hD+"6G)3,˞f=:W1K%Vf]O06@΄*0AFm4m6rj*bŒ57Bӱ"\הyg0@AY[uy>6h*U&8 not˰6փx;SX'X|, bfFeW&JYO{1g֫)AV*CvM S~/׌.It_omoSM[H΀jr{g4 UT D#̌J"rv2@tdqCi>.DRW<)Qk{p&0A/N Y &eBg RIh+ t1byb$:lM4dLXi7+'QAq2PIx2a{V:q$J+1q d'* 5WW '܇`WJQ- S(4o\!IYf"i,ʂz\zQ]WrK9-5VkACh@kILƐ@GE0'͝VVjQ店yےB_hm7*xV%?sӔ 5ʸ>dT9Tv}Ϧ;p8+cso}U$X{psWӻk?'yEd/a(~Vj7y~9]++cJVdgjVYZT vN'2kMV5':mpv,ȊH<΍h.O;<_AK s}CƔrFf-r?>~'}O~Bfi˳s7oVR l6 ~Ҫ=sG4}C7HnA@t 3A a$Xf,p '+ )qܸ]qEy:Ox m41qyn1 #dށl<#gVϗ$ny_R*<]h }h4xPB Q=+>هDZoJF]xEděR4. -2)Ѕ'HW gW El/'8Is>X0^&ߏsr|/ɭ8\.pS(p 4u~>1Oa}(Gי45 HquNf3iYxLSoS ܨN5 /hlTq5Kb0兀X} ] +"䥚D;)r  *`JWklK?ZҞKDp/0-W.u%u`WDdţz~%1Wp^ݠ{#XQ$KjЛ6njO-9ܨn) X}`K%+S}"vFXwf/'D$(!uYk^Mn6fo7Wg6lu]`v֨[Zgxg)F$\j$*5SM-tfͰhxr :Iˬ[Wm#R٨s9$%8gH2kFA>|LȗGL>= ̥魥eILP#<#c%HP"u-z8]3#J3~GFԏOPKaDZa; Q)pyparsing.pyparsing.ZeroOrMore-class.html\{s6ߟL;N/7&2;4ql6׻h 2QS$ @ŗ(Y$ؓAv/KvEhAI|;"4:r0)u~8>~9Pޜ iþލޟ F ǜ #:{(q`{+Da\;8<,)GN(Duonn7]A",WIbe-I̮""^zb`/j #]W#_#F#᠐)No;HܥVUh*wę;^=^W/x;I;4(aGMH0tL"_By1xm绎2.ߕ[jtyco4<;EozcZ- $"ȏ0]b& ,"trO(ŁVlY9[pLz Ooch\*hDDߖ,KfD֤vE}Oxg FZ$Gtɓ.Ğ]ÈA *MPq@nK :$c$7CG!L&h,#)"eЪUa*e5-kEC1̼ո>Ȗ{C(w7-Wsr<۩nٻ}v#԰AL0;,M8g^ H_Pz*+Ըޫ ) Er}=&v\A]A/(3^jZ0A) ,f7>(kW\+L0Sgk! ?>Vۣ@广jii aJʐqfޯFJZLEP+Jwy .T` 0udt<f̀+O퀜H7שfzXIYx<3($',̵#*Ljie_,_ADfZ;z Tw?6CdoAkh.,ad7[*# ,3ɤzg!-KP"Jf0]^+ 1"@l6n]3 .ר)F1 d@uJ RUR9\M|zgI?~jK}%0J3LӨj -MBTq!`BR'UD_ Eg]Hz^hece-PӔ-e% $+!aTNY2C]ik|3꺚;l4pT"{%̵tQ?@wgۨ0B{"$2 5*[RXͿ^+ 1-Dx6ۭ2HV>,\eTNNxLc*T$TEdzCoAhHLҋS7S0X.nn?GMa7 ݾFE~<"1B:'*R\ő?&OXK.23s*Fe# giH1 GE c}y$YȜT-0|ߞ,Xx ~OPR#tok~WCo Sն'trc'I;`y`[bvû]qi8]'bj8 aۍf Tq1Ɖ'LO̶nevc^F@-]tF9NdV?n'j5p1p2vlX=էϿ|0&,4G 2ri&@E8²t4T…l`Z pvSv 3?` W7qNLTyc2+.tkG8=כ{idWyS{eO% ˟! S{MSUP0*Ξ&lf-rq;'qt`?]iq@"yj(c>+W>Fz&+GpLWw'Ja\gm7Pr P,[Ѭ)ZAIm9R\Laxˆ]L+oXsaXD:ATBS9m].w19٪/3*!0xGOޡǃNFwqx57a1 _YYפ_.FíL%)a~if -TQm.Y:zÓmDǐPҨ^Q(udxnfjAt1噷_*ZF:URT$4l25zOUH쌩^~?ŏs_$ &6ИRWIxs7*7P!o#ʛ@Yneң$ k@xg _,[AqAP܈8O3k{un ` Rf^PfO۔i>ߒei7%޼x{j?Uf!>,e-4&gFٓ^FU>dMH4fanJ<30ɼ6lB-~TRj瓩,JyC/lPMi}%͟(+^SNFW0r3DF<|c_N@|T!.W+KꞱך 4P$H䃰h9t^ >CH  WvMЃft!Z7T(S5P(ɂsRdAmHׅ_Ds$ œ # 9hx-s?,L=RэZIoowuVgYeot3bO\`a.a9P8ʉ9Tw!>T>$S|iڐKǛ&3$L@eXi /1 :߽:젗oى:$dfoW'wtiD֎+?~}jV!c ع≎ (qu?5mݠ'MS MXzzhRj=cg[Ru[O+*]Cg1VƊPa5E;tv[ Qrɔj b{B)qA(@3TՌ1-w˖ցRS~*(k}lQ+vd8`n cj׽ 4:1.oB#/菇Ov,~j6ބv/_eMi6AX LW5֑*L`u0f{58NyH)5Cl_\NyL]A~ d_6]+)vgSihSXLӝ|SFpĤLжˋڈ<}f e)Fez': -B"W7_8e=(*D->* ؊)KDEݞr]4QzNbᰰjO7l* U+*k/Os?Muaׄ1مIޥѥBBEسg2aќ))Gj-ݓ,U7en hW*S]~厮&2UW@I_e)04IyEIDOM $х q4599{}jGr6UkY'ݴpهnEIvb&x^KOB'C͌da?7"ȀGyQ Cӵ p^n+ЗJUSB:P<3Pd?K~X,nZJL &/ Ef1W:UBcbUȌ2bb45%Ab lc8MKؖhh(@EGq5 ǍmAUFe]\,E ;ݒ5^ EcmXUaS{!fX6{3m@Ox2 sma>ERIQlv43f1D*@mٲU$Ő)wb Yu %%*2ҰTJ{\0(ag{+6\mm= tME &m[( E[gN&#@Lp23if3_C9+d쇺`c_>4brpk9@ph ^-D*  n$6%QylslouyuK%HA CYg1 TX[Xo:R:*+~#m]a 5j`# u]c۰ @kh8A`4&G03w0-g+q {"a*n*؍pq| O֤ `X7ȫ!Ѯ8'ҵ95eʗ(X+&tnެRP :zwDd }aUt]Wr7rt>!]#-`]J&w4s"ƞnmo=u9dGgjBSM2l`jA/Zif]XenOBΎfrFu=ysÉ铑"I5Q' M\" LL &+{ ]˙`9FF(Z&.eLm$:():sM lZ޴\=d@=^E/Ӂo!:]8N fAAc\t:C(MO5[匐rL,R=;hRsp(*Xaي/jj1;`mZp7,Q)5 08/e\, w`pEcP:I,gQ3/6R] !ȷHHq<$5xU΅(Rfя`N =RJ3P6nԛ" r -Q< T $\ɒ.!I .-a4$ '%-\ν>v%^TbM-:?4CH%"!d8-3@fvD*4?Q XsXyGS(K~f,2X7CkUZ`}$U06Nđ~p6#w.>~Gc1Jn![߹ŠMNjB tֱe?(2XK!oe0>f0c+6qwLȗ@h+[{4*'8DE*'V+1R uN0Iع]g:nI+_Zp>hN2%i#;L;Ҳ4h䊳28=qV2ǃZ{sytL3 Hk2y,pY&Gɛ#Bʠ ӽ-h\>O%Ҙk;-iaVNDWGЊ@v)(&څ`2aypn|8 _xKp(}h)غJL=NҼ e}w!q"c<<Ӹh-D=nNG֊dH!Ů Rg}Re6J<+'xKEpjK'K·%-EB:.8kg!: KDʗ}gӼ#!Zvʆ}ݎC RTܞF\!hO|dOt`iQE"fȂB"Rcʮ})Q:<*C! .GI\˟.@S\+~@'r*-C4J7RyD'{QT(W(a2Uj$'Ų0<?'9CJvvr>h$7cwN@j1^KA~dd >|&pZxEi" ϱ'8qU^JscK3Ms Vl6 ~esrB cTx&vj%]i\-dy*''kf$æ(XC)/.bsU% E+L^z| {!p.9e(?`N_awxIINVr1+nZ0=!,+=zbx5 /xɔcozj!^d 5Ӻ趣 a}Y{Qw5ckIƜ48Go^*jr2p4Yҭ+.6BwORq'lNbh9EZm j%GzBYg]VJ{\; w9#HN8y;0`ySd px)[sPrƠ|b*QNີ4/Wq}E hlȸ;;ILJum#e1g~(DBw,Dnbb% .rdaJyDvA&:)[*q5_|w,@n\/@Kʖ_x8fFr_qmVMuGšȩ\⊫.ػVk[t,DyOݘ)5j>o^XY!ߙ@k奧^{s2e*)ND\>"JѰɢz1ɽ7)nc7Odߐ3}&/F앟 "{|^o{Եrt70zMmkXM4ߜo8N:)kOc4k9ew :Z{w)Y^4<%Y3Ee OK_$F>f#ݓЦy2F{ DIL.(0 D+|GvvƲ)ΊM?m2iFWAGaaFwR V'|#>+D$_$N$<73"GHcQ<>KQ`x/WK;4'|ٺ \ RlLqX;SvG,Qsqc^Y򈤇+buvŏ?m}iHhG'Q\3nʣZS$,^Nuy:K ,(SR?E~R> y(<7ţx͵~/]S-~CI,pΪKIj!dz*Y Lz}?2i,r7F!c[e54%rOA-ʠ)nY  <56p [Mu\jm%'35%1r <{azΛ/ !\)+a_yg~(AE{升CǺ#x.VVl_GdxC2=jzH(}Zdo\d'lI~◝] vfdhCfWV~u;:??:۔T֫Lt]+y&vs*t1)[ hs4û~4"/(btbN-#ͭ 6w|:)[:׿_ww~Y*NffU7ɵf9񌪦3ZUNx5:e8hȋ:2ʓo;eKmpVqM(1xmyr1"~KLMw^??>Z5!߹L{MH 3VXin$#1WۣmAGw ˸&Woޞ~?J&QT/6-B˯>>č|K*eݟ&6Yd;qBv0S+Q#֧@P4LfP`"\@h;?FslQlvu56S! u{ܨntc(-2gxe.HJJ$fbb /~|)N"~!M!9$z2 76k_S ҈LU~*K9KkPuw1PGAuv3@HkP?,po.ez/!dIs6|Efl4Kܮ?|[-+?$~ى̬ +0ɆY'_=m#_>RY~v$N4NۺF$e[~)TV:3s-Gb=D7Tz 1QV1;Qʴ2_Uti$/Z2UzKf5OPkb>NrsVPPͧUo rȒ9-Bɐ੽ Ե[#ٵ?1"sѓ;f:aH{#c,wzN@:z9r$rR3!͟KJ YbAOͣ0}+jK|J̿ƊL\D`YSSFiK_k\YzkD4k˰i2 뙆ُUJ` cFQݓ 1hxxFR + bNX ]eOC=@{K$"? 2g$Qʛ-tX9G)ά\ԈԈL[#ז$\o 5=TC`7pA9Ŭ.0<{l̏%@T>$u :ݸ,'o%hzmV{sH{IpN>U}FL4W]M R~5Mk=-g<god|?$m&uM]o+%B|́]w Ә5Rqqf h43i:pz2A4>ch{d2R#.Rf}~=M;~0X]ιh\x`+lDfM7YuCB@RոtTQ&;q]1 hjM0b1djPc]7 P,i hNf@/^bV~^+ה:{$[|@({+ Aw( ّPmHռ.ߌ5UYVVT߫(|}Fj*YyA ~vPX.G|˄,\LOMc-#bC3Bg2׎Je-Ҋ,4WĢt/u` Gba~4N*3(2Ju}(:%ԨvJwj> {byeXlQ `gfW,KQUw\qݙtR@1# ! XqNuRFI׹xki-_1E^$Iwks)mu|%M b#E- '~KEmks@!H]0w2S*ñ5!Lj%dIJ)ڐs ARf&ڟ2(Z=Az#}#|6t$whD>CZtO&*0+##u&睄lgcP4ٖSȬ3|u8芗%YCr'YĦǦ*GFcpOnhp;NYԪ{vߗcw u wA6D]ZE#gfb&+G

T_}Ӝ㨥2E0z+"5mz?+1  fO!SYs4]Y1rPy-r?Hj?n̰vW^x%ܾE.yg?(.d4g7^^G+~”=HEl/f8Fmεul@턖)l4T/<2C~+Rv8{ho⩤]<ɦ֧X XpDp{_Z۲xek-}/0ܐ_f23&s1"˄S[sed1&?6< fKH,ct,׀Ibi/% ?Rw)Vbh>mV7gzw".w,PD3MTċ[0fN,Bޓ>:IY=me0#0ڔAنUgs-n}.q\֋H+^}, ̲|zѓӣܱ6A!ε-*[ԅ%\Es0qu}vX ʖaB5LQ"Ph>ROHe+14pT,;rR [&|˙)\祻iC]=66)9&;=C[wGS1?7޴$1Tڿ $x(Ao< لS7F}zymI .=d}m;f1izw;<&x&/pj ;:NOPkљ5٧.lI( XNf $HrKӁB8eBF ttL>4 D[viep bQh\ gJ6@{W`>Шהa\ٓfh"v1 WzKR#Gwl +8tfd6k^qA/N霏ȶ M-n8-?WҊ,3km_A߃Y}sSkx3::lkp3`\: \i̬8\޺T .2H3kgV91ABRH_)Kt{h,xj&ST۞Νջb͹JI[zlqbkn9F>f̮kL&E8u@'bDgkȡL;$~SKug|Wg\l#՟yU4ǫ(6X?M)9vy6(.srN\+ ԁ'p,PzRL~8.-13CaFnr "(}pi[A̶Br\͝%qS[C]@n4㔰D_jAԊ{<[: ]O(U[{%Zom #M"# 73KvUa-|#$}/y)[J>KUy|C3 O}3ûs~"tPtZ^A;Ώ NX0;"5O|Ea} g}cu<x6s mfu9 ]!cQb4 dg:ǀ٠˃v(u^KAms|EeSa.WBov7#@zs3:u*aՍjO j Vmlx+s:c((xG*3g}nX%IV% q=;uWv / ?Wj o}81}@"(녒, ѭzL1"FYݮD߯w.%B/PWA {跜ڵ".H)R l>n [@}uc)(V.jxV%l-*uvFフPKaDZ[Tpyparsing.pyparsing-pysrc.html]W8} oB'@a. [ ov ;{UI$({o[*}T*7?M]Sì7 <˷Ԡ8Og߼bp>r#}p?'~}h\ //WÛk0^@Fd hxC"~kWcۀq8yE$wk]çyrr"zK% 4`,=ճ7-l:3 {jDeф ^0}nEAYN w W VF8{wdCȷgdd'f0P:5F.anHƋVyܜs._'m?%mBLG.#K#X hh `:v<i67\7 bZѦE(VP,SH^`O SǶ]&.)$G5g ~\fy;7?U K `"l4!ތBS^J,X.OpW {zȷP`6-`8nc@|  нՁU璲8o)k6њM85- 8 =# |rmVh~SK#+:'N-$ zTXS at0.x~ R%5MPhBAFb* cR"=u+cy$C)LGtSShJ;=/pϣy3 {(c돏?>*Bv0,%ۧpTslNBSaxf U,ɼ+ď).0U*\2ȴX/1ASЃ IO r \ ~_3 aUVvuӓKTaR;}>D\֘QʰзV;ĥ!L!aB>CHD2QjW7Jؾ;(lyh'丼g65ㄗW2jW7[=/;QHCmOh +0 qID!č lZOb ֮nה0l1Qn+&gJq8 #(\(?to K 1 cJaō _kQF` /}ks$n+m[el7޴ fǡ?)8QP"(`B%0Im-$KaEZVgܴ DFFagZvq)n}G~ F̀뗿  #reD$c)GvLpC;VvB=hg1ٝ>&uoۓ Th߃}@Kr_(ջ~ C<@8'3EDW*{ع2CG@1bhc}\ ^J9(큖Q`+;X#cuз_Q*^0հ ;[pȫ ">>~x\'\؂z))t|q$I }UBEpurOE#ЙWuMts"j߄ԈPU[u>TؔC="Hwʊy]Sue]3.|Z1M4i3Sl.m4G+6~)=ijA<#A-^1bQXɼv.SSX^!*6Dޢ#)QuAIgg%nύ ;nSɴTDK:_ih^7䅦JU-6لL,\F}ƣ ]9DncaF2uFD -ogҴ V RȬT[)3MQU*+h&qQuG2|#C*#(hCUUQ g|֪! aOm[ЯfW~KB, nxhzs׏ؐjT 0zC"IW:UBH=WC4ޯ]VyeT CK!_{nbWI9#zk,35n4(:aoUb*` 0nXl{)f,ΓݐiRqX6i wX@UUY(d,L3C H)r lG &%jTB.d/D~2zcEX#u$OK\U%lQ+➾tutngqb6ΗKxL9UYPd5IAYk϶o=)¸dBRU֖Y<'ɣI;tѢd( ś_#mrLSCs"&c89(@pJSxC-eҗֶ=_5> |R͂PX[&@'9ϛH$Ba(s_ = ^9 7GQ/=fiE{9<|% I:fir SZ^03l݈nE"d1WM?/! Q;0?ۚ-Z*Vye*6L/%_02]Z+:_1ORIcf|(-_ ;bax{<.{eLt)-n_ z˟d&}%`K\NW*W UZ^&-wsצ"`WaJWZ^(*?MY?M􆢀YZ@{,E 7đLeҲUc b9'4;>+{(o_ES !SX%~)'*;"qKƢ6(ŚAYN5JN<$ǗB/$b1S-ƛ!zu(p#"K'ߤdYɆbEFQFh!Uim4Sye򲘠fA;\D~Bjca N+cJ]{yEAdrDEqdA, ֎߸ߪMY[+ÒZ-ݮ+9oHYS%Բc:4ŷ[o$ +bϹ/ p6OG{dD9W>_KܽIN7gf/hVG*${ڎ$ BPU(g͒MG?]2LgeWUoȚU*!U_kKr@]~#l v=g}n2o /кH>P'ĪCY+f@(aHd/D1)'@F(h+oU\ ·ejNjk6^$5BqUqs~|-_(+5[U#Zu]# YyJQQرv-<A~II'7+6BqѐY !j6" F$DZr>o.$,d1*RH1c͉e@L:.bQKY.tEF_o5@ FÊnfzP|KB2΂#Ϊ+J *Y!b4Lg|T}nDU#|=5E1!ڋ[QǍAGzlvP R(E^}Mpf$ToB53\RʒxTeQ.͑YT+EK :/낷}X]r~/ "܄;I"QV=v\JY[Rr#bμȪ+%;9|l1BP@VEJK zHDj\}t\ErhJ:"]X&XU/G "+f7*Es4K #pwv{.U(ӓcZ!`6GqXGQ=̣Z| >ꈼϱȏ"@ok#A0Fv29 @yJc>^reѶV.1  n<&-?ewϏCX 6qln4G)=~Ź8 KP`UޒXr} 'qFΦeKR%UDൎ VUTjʺǿWOZ1 N-2" 7׀V&^^ phiB˺%eJҡpB[11Y *w] !A@Pcl]t+$ԲoRt4%B3 jH9 \+\m Y-M ;5brC5}$0V; ;ݤ0QAzh-T!j5LL9 MPPQ#S:?tafM-UN6uY8qp!8oxjKk"#SAˣAq&^E[,-y=5K&6ГO3EB#L0,@A] y'z eQ`egu6B݊z4tVUUQ/p40PHinV;dqja'.TIOcE/~bL jOl"eTZF78BދfC7dl#,:,e:DA "vl#Ӵr=i8c09 ϋ8v˩.^أ_y!\넢w.-{4$Yr5xF.SoV,ܛ쯓0Bg$ F8ĝ>]r8S\3s1T"pFc|+um'JV1弎Ċ#ŤR8EH<*R_S~Mmx_yOb}#-gj|7#d;VeC,Q}KpaeJ ..v%zCim YR]7'&t\7VYWo'v~ҭcRrLBJ:rUȓXNk%n?d3EFD.ͦfk'7e[5\-j0yWr_.7f`H5,cUEQ$Xeikn'2)Ldь{cfwx%4}+݇(xsVܭ($NޘpqXV-ȬY3vc[vn5pIDMӸUەJxkϵ5V԰wr$@ɸ;0k?͟JZ?܂kV`MԺ2x5.0E8  lQS鸎qV19v4v@ӁϤ;8'0t * /:uqHF\9!%_0ǣ;z mhm}u½:Oj8^yu ȟ.y˭Z5<&0^(+K:^G28erolWklLΎqg,r]SkPjHGTN#'W *NsӻoUQ/uR]"<&`WxCgI|uA( yud[6Up`P^\9f 1 Ks@)>&p|(d 41Ƌ Ǖ1 aR1;vuݛ 6,{@5\Z-~:_/{vU$$1*\,>-"Qq\\-Ue@,(1,#~ a-x6cpYy@Tp(ΪXqczVjQ0ÆʪݜjUzuզ\WV[_, zLbAc:\e݅ޫO03d밈dăTgP BEUоcZo)ܭ/'7o?~K/Kg|8Um[9w,_]yW*8@E 1 M.pʚoމ$ 8k6`KȘ/T7uvUI=.0ݴܹNP š=DExƻ/(kK_0Bo#IvU#VcE/`hVadSl mڶxM-ZJkLap%j#[r@ϲ"ɏھb&L?J]D*[҃ikyqn/oPYҺx{1ـ,foUF}`uK}v=l>\|UҾ>@^_%@UҺ$>B_6z{67^-/wLŒS,h߂>sc?͌7j*iXԥȋ={#g,e?6ڭH\-Y?!~ǠVPk8oCjgbYܩRN@N֞+H[do5Xm,\:zYv~ WۇߙW cv) ?ҭB_~wԧe)o neAZQVw!9֢ӗ_ŻaVu&Ҷmyρ6d)oQPl`0Zu $3/u#, ڶ$SClJڠ. @?Zm \}jx V_jh\L\Mx{r M[htX)@18%rm(e;__mK%~/RA5[m. ٍp ՚lڒT[J"-G_F1]bӡiBET[@[k4d}R%I4K{^&K ?GBQceȴP6ԏnS:<ϫ\&qhvue"i&*rG$$M3+OBR>6='D҄:'N$OMN<,*y2SUOO=4ׁHji/'#UC<1S*5yq }(\gS3* 0S{'qRrG!ĕ)Z.}60-r۳q1O /}tB8%O`:}AcS)\Tw}.)uHO'Ϣ<= 8F$?0f߄X§K8vajwt:rS9|}{\o$l=l\G}b7l*1>0eu>Fly>V;OZj2Gkn As>JA^u5nW';a ;i;2TIo (N?Aulg6'1H5WMUC3t]TNHOjĮ&Yy<]Rg3<d . "\CՇUQ25CNV(uf-R  jR#@;` C_͙{;5@QrK33dӎ7-˖f7 ZCd lMDǷ"e=jpHnF*{7aeB 5EF>uQSUGAq$ETx$S52D7V7{PDj6Thh:TqUiA,:ٴx4(#uab(C@; q]; `,pm쪼:؝ovNsωB5~GQUszmA|p_ j\uu" }"ۄ RW$q ꅏVlPZR4ؤQ)U!y>|L8x'IΓI%'hz[$o/a)j- juP ـsx(ͼ>mӼ>C s"21rs!c׋<ϼ0[D.˕dqH"ͻ`J哆Y^Yr?ݜ-*=i (-bspIeM`WwB\ <֡ &n}rpim{c X JHe UqNsDfh*aX2i  jyd65^kA8G9,PGs2lZGٮ1@[lUj"G߄n_..f;Ŵ7Z da@Hؙ!o x|A 7wSGK5fRizI% ^2e\'a;/LlV[GjWgQ01i'r 2[f*- n0ulfIy6ȅS˛p'[?tDpur0uPɒ&GQLqǓ&6≌'.L T3?`_odݲLأKU?G~Kbս*k.֎xf>i0+nf%I3f`?4{-SY !dT d8i] &Jd';;4 =c\f"{o5H Ch|Ѣ3ڪſ#i. gȯ$yq═I8jJ/qwe/1 ~"FFϋ/iJi0qC7;2M J\>  f-k 2U vw ,Sd'6y`ӄrFbbC`)[=„f쎦ȇ`KSx+"$Zw{KQk_H3E#leU";Q$bP k /X(8TG 7DuǼqm<! B4wrJ>9]ऍL}cv*=)xWacL.+z#">12Ol뤧4@%]S7 PjBVƒu+YWB&3^'IC*-hc}XU[}D#]݂ɈGGbɈFNGm*TU-r#H6f':mU`+dɈfF& =umWS6>.cSWꌎ擃I)dP `lq0hDŽ=6]fyFu2"m܂=*f_ϟZȍu:P6\ 1OM*ዌm|C)bNlj99U2Q3=ׯK=#aTƴcsw4&űMcLͼƄ6]7k(uғҺw;s(\{rc"06ٿcwOɐ,hj'䦏XH8cgXe,#t BzUXi쟛.W4|ny/T/u5,Oa w| Rk1'-BKa a*&"N>!b3LW&S/" 31=4хIt ֑Fa%mYhe+e­Ll"V21ZΎ~U"97  ƶ.s}~/z Z[/W?1)S$D<pNo~zhbT6pŔ'n{/ΪIgY"5F8ZsjVhSvp'Z// aRSevqYLvX#ڻe8HmO7u5jMmB7uW[-,6%Ѕo!jSvDoF4j]+Tt+ʚb,}9Pk]#DX |P`7a%6x=V F:'a-CJysFH󯬅^R6=!}g°u1lð$d,c.6Ma_L(/cQ 3_ hf[Rf~{xhz9#,eJV$ w+yEsK  ktfj? W!ƔtU.|6vj8jj7UF%d&FEDX֚V۔l^ՃPi(n/'9X#L?, gfa޿ݼCGNkY訽>(-ԫx.SrʆO~nZ[oڴQjԖJri֐*f*>&^ 6-{ =˷ ?ET1#9 ٜNJS溛&Us>F*72Φ;pޞ Z'%s01ƥX]Y OE aIXOuϫ2ʖ=:)ImUB!4m)vZ&-s<",L(%˨ʋ& G啷gdR^s~k0N F?YS\S噈iKGyi)U͓:*߈|5@|\G!]g$zͷ2\\+۳gEcsߎ;꣏pq mfN4&Iw*@Y Q`f4bD w׊Q7QJRHU/=m#PE\ܫXKC\Us67(+U,U;c0[Av"ETKtd# 0bZP!&7XsGl5鶙DHjqg|g0Z2\3\黮f$FKӨQa^^Ѣɾ7"hԎӭvLU,ٰs]q%t*i- {9qҫ.Y{YGխcOr=,3 c-8˒tұ^֒m,MB'eoutf#kˌt-X"Gto7n- rMQdILnTnQ!3DK±[R~< u.dfL{hC~7pK4d ؘ$|,5+{C9!`3<ƀyex] "ገAbӎN4l 7Ky>Y ܝW)aM RߟY@1B.T6ҋreTDg& FZ997~0Nm:5 :fL/u:%iGr%ékH3ASx6Ffe$ۉ~m/'q\Plt;1%)5$ai3&K(ؔng֬04>ug+zMҢFSG9KZT:)9glo&j~!}fق_&ŧR~D׷Fy'A>_mkkCx2ڈJ^(lÆ)9ZC`٦@[/B |@$| H Sz֡\_J EZD:Oq\g|baتӮE9mLMOIiLՙ1Z6d/Zu46&gy)u`{`X @Z9DsoiGz~ ְ'@e4¬-WA9ҊtvgP5+LС&q#Dgt^/1'$N.O)zO\@p(9k@6`\XUuQCk4_.d] 7#gFaK*%ܓgdJ7#g8J'۳]DZruk6J klBfP,ç_g'^ V:/ܕrAl (m&Kpp\]ITwrFu nkeLOteZL;2hd UBMV._@[njӞ9i|DWF <^0Ca|WK?J~8l>Cͽ6o1?soXa77ߖ2~BLo=3~B/nw=x'ip* ?2X$vPǸO Xe%߆ϰ$ Nߋˑh.#!qkxf33u`7fDVܷuc934{VöLayu4 %6Vje{&^Ża [O~%{6&+e{/DŽG16(y>K1afќ[_Ӌ>p2]ub5^ecZqmhU: +gaQ HZg:!ܩݩ NMNͭkJMR6BE?G&3|P L\њ뜔#*=9GpxHG4&3፮U/H܏wAx5«{5ZRcyyc+'{j!:\GjbHuРA]!r0+En2_" _pb `sM 7fjƜ̹d.(w~.wIK%_JRqf1{xh N, Mc@Ù?ZgJxS{Co8 A{Ng/GgJSRZe&1JXt{ u]ڕ Oi֦I`ŀZ;l黳ɹu/<|1y="{׫ў#{]x9r^ٔpj&Nm,Ok)|!i?r* BRfS8CVW6HRV@f2K@6f *'! tjQe PQwZ@[8+vVpTkVz,͵ZmeڢAٿh<9Csތ Lv,|Y* F)O"26zl"wxWY) $5dv 7;sf4ĻznjꃬL>͞ˏ}jy9|t6:I%wuz-B{'- `&%֙c'"6&¨Zg^.}~7UЊ'.68C}Fs5wVG_8J[?]{EE3fQ[x*NoIv'|ӣ!,Shg'|6-Dp#:08}sFSNؑ RhKo>GvmkyYs5oYM֬&뚣@9_^Ήuqn.#,],hm2%mnYIBen;/ 'I +XB&K(Bjdԓ>KF~ 3umn5>G,9ΰT$C\ ص!hVqvC4yS4 z$0g89|s.f**b#`!H:C wmP;䀩v~j&,.ⱎ03#.<-*k˶˄e0K',ĕX=eArfav=Jg/L '{8OyRX[eQ-l)X0'0e%mc|{{@ss9$d(,#cDvG2Mւl0F~tdS!{h!Xxzf< H%ό1^>zQA'<@;~yf &=~WvXs IΌSj5XOVm3<ڭldܙ! 瘉!Lr ߙR ZsQC4a>Uo՝᰺^NJ얫aa -{0xh1ye1p 6OXŻ,<'MМˢD6q dH#vx6Vڗe}xF[ŀ '}р}{W.Pv6^>PlT 1I֕okh o(5ʚyX#>0p7B{-f7o8;2#>܎Yz-j׊o*Y OkP9S,ge3>wC.<[ Kd9 tz@RdfBjE ; D=,\um `_ CϠw}&I ++F au6TMj Q"B8R4geN@)ҧyb3pFт <#;nv6JV744o條݌]`{'jSMK M`սeFWFxcjO%M"]/9=gݷK'|gl Y "am # S Zw)"ƙ}378lp:Or]P & !*ʋzԸYǥ0Y1lQ#mpƣfǞ!P#U|cSe[]WBս$ŝt;sh#`0` v w#Ԕ@1ILL` ,!uS2BGbv{%6G@b-qBQ9L>qv5_~i:gmQl5AB^ 2k#H$(in[/VULnk.;@2Q$3D ;&3A \w@k . #^%EgM!jujuVNF6r56~/惁C5 #g>{V=1n0L0H |71}{Ckl!5_j6FRU+GwyuUhhtJOͳe6Hy򞭼(->̿RJRnRIكa##@XH\?mGXf}/~sF ѵ0=* gF(g/7'@/і MR , }UHW8z Z-$ZdYTmg&AEa'n1G/Q<ВAVt6;㸓-f7dqgkwe %@gnykV WL$AB7LX'F9f|׃>|$30\Dހ6__?29'9 a"%0r~9 O8\DūO6^69E][e˜:S&qZz*K,OD8X&K'QAkW2쥇>N2߄>Z]ՐKʂ,z98$@DD8lie"kdv>6YYffA {Q#߮D~9OǍmvTF{o*?h/ X K%7!ˢXUZok G,Њ0(tdk_u/Pm{l"KU fyV->1s}wspqZkxjh>H:ii|L1[ 33=ՙV'aoJU,>>$]9ئZAFxكЀhu1%}3ǹ\B!5uiD]𑰼 {dc˺2e h3u4>6 6 uG_2(t+__Le_BF=:. a!Pvje!GzOe 3w{o1e宣rD#@k0_6g鈉J'<{-h'z7^Fe->kՏst8A*AKkx^mIH k^~Be 4B9= ,WS'[?jl' Ev*4!qؘD1m uʤ`ep _:$ܐλ[q,zƞv]xϿ,/^rfqCsp:6$-ɎROƗD  1Pcc=g7"͸6/]Ux|86G4Dyl=HYF|`! 7] L$B8=$^̕wa};y7Z9˅ķ>s=-,2h'R uQpv|߂hĻG*=[dV-kyšAܱ0rSn 0! jŘ1 P>Z "'D ݎH> |nrZN-P0;k"ȥrYb7ձ,ҌS܉'q00:hm%a-mFj @>T܃%aM-B(A{D':x Bޜ{:a~[=&XsOa~=  APB f]HmQޥ]nt0mVޱr;.Ü.7{G@aNIs-(V'[՘)#ݜ.Ge? |.Dmm; 9v1`CQ_Yq55&#>'QAB^ڝ/Ǭ1vk>0sf 9 ߭ULA +47AO|ڸ 5#cDŽxraq0aN`F9p($ȿsr=BP\ Tm(j@NL9?>w:xm3@BHa#︯mxuy)2`Z-TL1w L`#073, U1ffv7klAksz=㠼;!VHۭCoJD/ȄCr> e~>b M ^Բrl2<>T OdpXPe MFZ_ܹ8el*N26? m[ӟD<`UÊo?X*JAV!"6k*R:Q#e=ӊM+FJǎR5KuqekHDhwֆ\L.L`%J?S8z)3W{Ew9ޛhX!&D{B]4|.7_zkNZxe*=Hi;w'DsdOй?!"O kWYiyXR ߛ{LxFfo~V|@cOVn6)uS1V:\"Aäh]vB^'Gf(@1 ({(%@ܗ;1Z4w<Ԟ1 ?r b 6Ix .:erCؐF„2pclցmβoO3(-`Bj_fm{]MOtnMM_LJޛn@䩝Nn}A_q1; )795BNɹ67Agc$t,y['17NL0W14Y'1m'pZ,F :uj>  '{_'ICȚE'W/Տ#UG@l;Bl6{5FvI<7 Tn8:<6ځ@ }BZAsb2„Cp0?>*ӔYtYMhP-2kvflFKpjy` }xDc?y-51Py7D7[dQmT@Ûhx3+. ^׶1ǮS>XEQ ֚BmDSOX8U,"Oxic& (:}ա!842,9{X|4/zBN@-!i&>Z,zG؊>e+ZuL*טB]D@;SR5v1@p#>k.".N,ӄXU؊yٷ2]/Q{փWµUV,B 籠t3$HJVKn1u^ۑF>K6qɴV{sIe%m^}j(/0 5x1Um#k+^pVú1.1kJZ2j5 C[?5!q dMiΪ_OsITUwYE+q5+-:zJFϸ J4uf/ yY.0*76̳nkN$kT>A!p3R3 f9٠)Z^ yZKNɲy6JȞ_l,sf[L wrQNn1춗xSZ R`;pl܅BF+JW}>?a# P:V :u0QL^i)kea;cɺ1(u,NhՊsj p@D}&"&Nd-D_t(g6\@ÔG_P ^L]25$pg%rX+jeVMf؍Mju `٘-B]8o:YJ&պ UN}wӄ7v\8-vrHTF80᠆qpRe<xP=dӱȕ l|HeI*[]mMfok^FqZ (i-ڳ[Z亖հ]gt{-zbVfraiRa!"z QϠiƄ1jՔ0a zKZ{[}zՂsLŊ#, w"7Q`tup,` +9!E3޿FŒ2βx(+eiɛ NX( j4yRX'CY+ΫhUyau+DcN(B . o䌑.y wBL=nԻF'`p PKi(IĘ2U{L֟JQ|˂g̈́bw3>|lŐy%ߵ4jU9h8B MNw./yg~ a0$iCN. 亽 }{-&k}/{?re?R}m8 #;#BnNJ`h/_@\`lk7mwO@;PSCD"@=Fa)Svt&S #x>{En S; 5[IY;6D.pVwI=!B"pMCz=IjxPk׏AdX_Om-]5!B@N-?K>[- D+k6m3غ{ku54N(1.[.5w]fDMV24:9Nm?_]8¯(Ld(6r~iV0EX U?.63[Q¤3Bfc6zQIhd4n>/]$+ (oFy*'<=ex?p~{1S,g hwtFPRC>(46NIb&zϽE3KRZS=I .PXCssoAcmKOW5oPC&aɢ@d!gtNg1)e\OȁAX(I7T_vIFlAWBE]ȡ*p{U%%B .Ӥ́!v'!b/GfuG XR 4E܁?1*( ϸv\ag M>9Ã݃*H'a8 Pc e`dni1u|8H.^\ 5y ( W![CFDdQ]X`|>8C2_Nhw+"eȚ[hv5b DM7ȷwY /}yw?S9!SM'r"Q # fFvʴ>D}5QV8 FffpK뒹HjonCSPc$eBGw-PwC&U*#iems8 (n2.T!5@(Z~ҙk|Z{ jPR;euХtl ft!XQ!$,Eek5kkV>p\Ϳ مZB2`8Ւ6G-QW&puqUA|f 3S~<"Mpn2sv]8.t4d:_fo\&p6W ߔ}(l[lVFS2ZLo9VenA5Gm@ِ~"|q<> )rWmA%D@bsۼ,vNPѸgDQLmrI3$`Ӗ(l Mb7n(!EriI]۽ db Ka̐pNcO*Bq qqƒRVHEm pbsY^X}5.c vkYy]tgzX[&3%HuFLx_h C. q:_dK l%?Z}m.;~A5_RJmm۩Ki9rkkgj0hY}h n{vM%|tFKq&>zB+, 0U9!oS%5 [PjF#KjBTܾև^^`[`a%P0Č (g q H8aH:USGtuև%pC3@Af d:8d-!sF9z«Chiȫ]Z7|eArf+C]t}2(V!R%*h6v@Y =H ̧.4UXIU"d8LMӲDU"\֫*sjGU J=rtt6<āg;EK,Ǧ-zWBbL0.KEaG; '|`ZŕBV qާ2*0k~'K#B7 z[Ԃ̂dtD21fYw_2`4uREXd0hh)K#L| ńl>GX 0R]obM2_mO(J)(,%EKOwRBן`W67;)EjHlDP'K'-c8ТU_uE(& 4˽nL]TuEXꉵ*[TWERW_J/\~UԺ@V&ʘlq#<9}?7 ZPC6|7QҝZ6&r^!YOOq % (hBB;ꏼP%Mv+äEd9Y~'n&H6!JY].:lm˒miZYvD1ق(em/.dx_nIljV@H~6@K-+T[iHj,BmAQ-hcźID9mAJ5m!/b QGZQMphYZ-Zeڋ6 LehVT&Xʄ( ]PhZ,t!cścCkq/zͤP*jxND[_'I !r.bk@DͫZi}/<=,v\Ɋ aR$ԡ.+=|-Z?FW#4lIiҨ>U&Ti|.D9]E)17*R,]]K) FTb׭vQ&L'2@y"ۃʿYi{Vm󂛓Fۭv1sʡ?#zkIۻē]gQb#a#nM+[־ɖ5ЮCVOxGw0]s^5Is'jֵ;藒5'kvuk׭_ТnULwko2uk/__~ރ/?ޜM&ۥG.Y}WL~3iW:ޜ;\U">3tݩEjVLܝjʕmql 4*~.L"?WEt >Y ^TпVq^ć=iQۢ@<6zw9*LQк?W!/iNNiuaSHsPMV6\m6:hŇjYg3wsQC;g\{jZ[Mwlߛ皦ULB?a$~ʿU d\E wnUo+91ZT J߲?kW︱y40 ^jFbS͊NL˼MxlChKK]Bl%.LˆTQCMe=e>o|y/fĠ: l2G /z ׸*۞f"B -2 qPQ)M4@ND6Qi(x]솽wΙiӛ-KWkq"2fDhi:IMpׄ4M'4iɡa܀ɺR}t8sՐNC>ӋT 繁}4xȕII&a]O&~+&~gq tDv:]ΈQ2u#UNz;a ב&<ťMvg笅N V~܃^?xK»_zÎ4. vim'...0{C~" ԛ-xK5b,F]KcG^7Al nn Y?+'re5rs;O1u;c)'{^qҙhěUc6 ?XiiekT~LRܕ5d7]dr'jHנrS&'Sz3zfL&[:m8D]ARu\O>.:Wf ψ4m3X~S(ݎBeʞvߊ9YYja0$Qk|~܈ykw/D[v`8MX'4޺xCc" 36@CU>CHVgn&E2WZD n1)C˔ŚS6sUMBU [ lƫq bu?X"$ }R`KL\}W, tҥ& _xRUb4+DR1JQ1Y Z |LL'⒙>!M*DW3!G*|eg9$k6[D cVY򮐪~>-p$>5 蜍6:ݲm{7:''dtM_ D~ "81 k(0Ibj2ɔ;dZv$USJ%s]~7Oi1uZ+)aOM֔{il=niiW Y0H:NG^dCgg4_4@c. h#^T򢱞У[PW~BCʏImآ9]٢fFSH[\oylMfCztFDfTtAG6 V?yDΪ{ϲ'^>Xg̟V^^XY, 䅼M|!U<# 3,RU??NOYnDVԐ@ܦT610!=sUoMl/h 'v C!kOË b`& ?Cٜ oy:V: ׇ=* ;ƈ(\6Q"6iظV>',fO;њ ub>罉yЋ#wg^1R¦Cza 栱l$l\bL WC4ansF=dVq'd{3wǖ?p`R2z*W'\-GR1J7 w]^}j0w^I(ҝw\cog>;'?w1Y%Az٫6gRZ}eݩ`%lO9+Td9mAeﴬ1klX| gH7>ZsrH*]aikwvL ħ‡u1N| |#؛,H]vMTZ|~mmvW.n0Go928Ge'Lz.;W7^yJk`yǺCrcӝhQ 7ωHY]+/ba'UwD]+9w (d$+3:X!a~g9'b󮱀KoԻ y*!d0/X)FN}[/F$C2r߱G!+g#ywzXHك!3N'ai !AxOy>.Y[QG?̻Fէ?Iz~g) FX$q~S d,s~@L;OrKyA-p fsͿN9 CXS]הת,^էMil Cb{A,0 L&|+)q>qKL?VXٟFi! 6m9D`i"i2Ly;$a=QvP!,JM= VEՊɗ]ۧzgY|2F7|SpZfZPqU]/iC@≵pu-dg['G8O86ˮ a79ُD5JY[NoWu᜿7 QwbHܡb wU3j ׻[~Gݚkյ[,Y{hUR*!7p@`tiIqM;h7P} !Wj7V_䔨y mdힿ7 Ч(6LIy+1ۘi\۩`ML0 հu/y3 c'wa> ܰmLy*U63 m$' c X c ȁF@JbpZ4._J7M`]di.9 a=&]HImiΛ}Jl.++&/\ GY|Zs8˻6YA &<+pO(a +B뾽&XDCdԌ&yYxJ 7uY vjф>*$ߏF5ͮY&ڴ˽*R}*mamB>Zg!\^~}T&)P \MZ=bd@4ɉJŷ/Rzy֊?.G#uaD#RdeB"=OX7~෧Ȏ@EF7Sܴ3&㲲|V_|حϑ:Fś7A>?{Ut=BA!62:\C#lP\sNa )m1Zpa?lVjk57A=˙IݻzhU[ ͲV+۷m#OLӧIzI&98y։gsNl&jIKJ{;zHQ?P(T 0m3Qɂ2XbQ>;@-|6u bXb05:#[ `> `#' f}G:E`Gz,[h{_r R_ qC[QՂs BeCV }Q!vQ7< RO(,4X lRZ1AzO uaj꩐JeXҡqYyddEcX aA0'vڮT;72$F17Zd՘Tv5rOI,0Iwּ@d `AA6u%}6 Х7r҉lyүDeBHR^Y^>V8ԁ)N(8a?F }=Z7X+9&0z^ϱ`C:2鸌mz ~WӞKXqi ݄]*!/UZg#3,)g3g&6,9=K>:Bgd NR{5c,I8>z,U3TՄYP5q5Vi Dתm~rf"V4(atB (0B(HLh)(?$y;02sbtϻQP(P0Sul88棈c.UGQ`$.vMuk]#5.GpƻE(LqqO (NC\"`|.K磸t17W2/J%/`lyiݰͥVcQ@%h dЯߩi/ִ2߮!`|,^]vͳwxlV*u^]]]ͯjX7s\dubBI6uOC.2'%~FV3MeP4QN_>I{LL3rj"<!C|G8]nf\:o9I&U.u&ʐW̩ (_>9"Jsvgʘ-!ye6Bw^!+${L PP 7NC1H\5iIj @>E7Mj[-hBd` Ez/s̪d 0?ִX1eD{ɯ;]{2ՓHmv_]J v)+eL]hܬ#DGce!_ly+1ZA~/5B86Bٌ"o}gGq̃C (WcTSBS9HKMZ%I&,3zZtĈ7L3)?gäb\y?S-<$֮IEucR:H06aZ8i34imm~A򫩇8Q1XGO(XÎru@Sl[mee}V:,t*ʠ! Z8m>f\}ͰTctBrOS)4d_/;XȞF MGOZuٮP$ E3O'a|oxHtctC(Joz%{ZPƝ% DA9wDuL1aTo-!mvۛj^)6MXr(B#S\cesU170B'0ꤏN“Q?7riGUN?Eq Ffutq!]^MMؒ('1H ۥbઋMG ,Td1p[b8Ncn}}5IY pbtR}D`+llE_#}2#A1p4C#\ (#8 1)j=z=/h*/K" PpHNDڊOD&mZdူ> XЇ| tmĨ55G[Q:`:Ig8@u.sg>^i0l%vnxa{ T p 0@? =Lq;3ڱq7>?Qq^׃' 6ޞޯ/ח' 5꼸..PO^Fs^P :}=ycr`u'2MkCFфћ bvu0$ڬoG)H2Ӄ7مb.6hpO.οi X%%۱UT.k]qBF56J$v Z9o>/7Rp'tKA/&:>ɑ֚3,G$4om P`Hg; 9Ez1+ `@]clRD6B&aJ0Z$@DGTB2k5%t+="I-T> #԰'iW4[@ PPL8fXgP {[gqYL9 b5O c7٣^ =#RFhc$9JMnWہ9J^Q[hfw59J]`\?sԷꋻWeh'|ړ9eIks p(Yß9J,0\Fm¨u'|^@-*t{IOn;Ajo;e ښNqYN9ulʦgVSքh"v]h4tf'0ҍ &l(P"jPNA6Jn=WUV1Jl4Jbs;pЕzYㄡPⲤDlcl>(C Ā P"P 1_5fm-<ö)#bF X"^5hk:Ze9o7k@)MYfXwڑdXަ -Py^&-[5tb̓} ռ?y?*s*(ҕw{m`|.^.%>XA9#lU"J$ToǷѻI* įX)}%C p3s!WVRZ^$ }Bs%l?pXH.&gv&Z()zī-?qz|J{wB3{0+9t-ŒJ+pT|fun9ُ| v@P$oVW=&ެ.AmxPonh_,cf=  F7MAjjg,I0{<̜ߊI=^zK|7(/[G_f#t^/3Hl[/3Jzu.OglMXL|w-(e|Ry_=& hAg\f?JVB"07d5bgI(ā qg3ʓ34#v#NB <SuqTczERR-tĪW9-X!vT ,Wk0l%}*]ƵQXe4P凪dA ʶ%14FXQ3΂'bofu>~',|608'ET>El-5waF%@M}= iW3:#o4bwDUY;na+ se!y8];2Z!7ރxx@c+Jq |"2/)i-3 a܆ lLSԷ\l4~EA] h폻-Gh3{od;sÌE,TjF`/3!i<[ I΅Ln$$$.*fBƖ]Vڞ3 v <\٫N`xӎzNي/璭?>dA'k؉#ji4 (16}o9 y 93h<8kYM{F h |Kfa{0 p,fX=c1!C!52 ߩ:dܲ$?p6܁m=`v#|`, K7dXF쁽{`o;epO`mu_pvJM׭UWTlX\a P•™kD#;B65iiS2` (YLM[ x$yċ`;Z ]6㨦0AMv>׾L`2"eBc"4BCFڦdAd'Z*T\ Y45ࠦ3$B9Ѐ4 J0PA/hYwCk]S%@(ZV9Q4v0pG'49>4)L䣲I b_ /8;`a[퀅hS!Ǎ@ϥ[bpjK#;FK@kVZ}q]qRe#&drYR%pzl^l>(K@ЁuJb[=ῑ٣렀|5Eva53[M`l5s}TVӻ[M@o8RV@gy/2"R,Tc?~ˈ Hu 22/Iw \uW}dh`ب*9FZ\_5p^8aKMp,im6*6eDX`:%fծ_5]H3IH3:D]N>޳9wP9qmm>ᘙ `gL -ͤ45L`l&I@P\贰6{;#pp(.|(;@!xὝ!͖lVGv(i<@!V1Z=qȕzY%DSkdrY%(|g3D  SK yFGyP4ozZi<2DuFζS֠jS7Mlʚ0[M]7/sjct:{nPm\#C~b;ClCݶ|F}4]Gm78maNF}4Gc>>ѸG&nIxV'_XĢ['Q;nɇݘ:]΄cv&9&αݙZ_L0sLX[ۍ t|KuLإڥCݭ~wƄ]:=إCݭ'.5v阰Kǿ;tBإڥ.hlgqx!3HM+jŊ/Ɇb%5!,%UikK˚(],V&΄-%wjͣ aM7:ayCM aM:@Kl햍^YŲ 2uo,Jf Y9 Ubwӥ-aMPhA'w $-aCLƮ6oVfՎK.~g% T3`M}f7<֝J @τc`r*̶Zm)xSnщǙ5bn,*]~%, O0W J^EYb}Κx@1#ﳬ|@/vO ~)AVŕD~7xE)L)O1 MYD$) 6M(S ͉wb?BDsעޛ7co#5v/*.Z8Y`AѷW6?BhpSLtl6PzN ]UyKI)9}~Z =~"6>`7߱]lD^ĮSD;:+l=g f2~|JgFZ)uf˳w$NSalUrM5V=NV6Q"4*%@"t0gUjf@YJפyJ% qOg@h8@ qOggU6Jjdɺ h`TDrb8]e ߨ[q|dӴOfxk=,-kIZ4W|d>E;LQ|2_.COIنS2Q/ll<2<,K`exMrGJrK*uNM {Y(؎P7$7Eotbt_j5lO(޻mOvVcڬ4՞`OȾ" Fw_ λHV-ݕ|lL^fi mlmyy䶬BrhKKRQ/Q*I-iZ.(vu]ďKTFw`W^ky/f&^%r+>n>_ oYZ%u!d'_^d6*ltX 1~$ȧS! 3P+>6]ǴfBaիa52k&s5`&Zwx'*߼3].et":!y P~[*xEd(/CwqJ7jː]*er<>[m??77K|ov|XfFc[Tog}|'qsv720 ||DoD{N #͗可7_ާo¸.,?ϗҙ5rBUoS9_|^=w{lDeZgJB(J(7g(sњ SV-]&oaj G=dQl/#8 5_/SXVD߽panl{m[Ycگ faҫ0A>9;{\=-orM+^]ygmU%Ics!Lϕܺro+(d?fKye\IM|{,9[Sע`<_׹G?ǜ+"Kg|AI؏K`Q a/vHv^NhY'лQjY j*ط:GЩ+WbhUukLY򊎭uX3*f*E9=-KoH1w4d7ь m9Ch1 v\s ! D6XEôP=])픂J:G-BRB A9p6g47ėOf2><ujG~ޜ@PL6Y.7wx-־l FڡWݔ=EϛgKɇ%d^eȜu\RkC8*}]骱p,dC{LޗҀhg߸Ϲ^o؂X+: _ g;=Z66k d5gh j 4aAJVZV;W# ,h`+bHnּ_40]"8sUiY{SZT[&П۫BЁ净Yc\}+?",rmGzo%8 *6F豧\v\p~0kyo6)5vCN}N;A^sy%t "fɍUeK'-Pe - ve-v%W ?&Pp,\UKv#ҶFb!~2bI 4Z[ŲhNkZYR7A܉Wzz^фY#8oOFJh#wE՚2,WB19mkVlA-ٜ;]y%.`Ԣ qKȥA@qh^t5mn!~aEb(kkmڭ1:ǶkDڮnBgZ.Bx{QћLY}'!sƈ ! QRf :ZQ:g϶ tAk.c {jN6+mSd^ ~yScs?b5;ݭ%ȔĒ&L :]o*RQȰ @]ev vLKpko˵hUwRLa߁.t5_NW{ Ä|< {*MÖ*8;yz;\?pRKQe$Uo+sNҡJV;qL dy(Xrtk!oцBvh*ދ΋?Tgyנb۸٢g~:G# le,6HP:6=&U>TI[uu%7fb(;lYE8/vIzU2(^]*^UvWYT˟{SEcB'T,p~IvUU5x&Tg0 z*;SO92dhYrb U,`_k/*!sɦx6˴rz]ɠ(?KQbNw% \ϓ8됄ZKV>dZbV}E'NQ ۡm)7kֻCX,ZK|QMOg_OFر+D])E|8+>qYH;L'`B,@Qqo@wέ17WEd4,{U alU۳sfɟZP6_̓|f:R@]Џ`tbDoT֙*Cs}g7½쁨tK,˦lW6RUF n81>{Ⱛ]RX7inw4Y}-!wݲ``tTسKckm1 uh8?! Y'T,ߓgtc#op;,dAwd~vH@81vxH@t1I0Gb5(s*IUfl=i#?dz$[v p m-c) hN}=[t\N~$N53;u N9DqE`Ydi45b!8єR^d 04 i{h+3j%5 };y ]Btˎ4e&YŠat 蓅x +HxѠHHp!)Nx!B0ޡ7[t UNX(.8Bb wXNBr|BR Gd/$7b Cw*0,Mv8!ߒ{j[άd ael+#k-.KP%IַJ 8x+TL^LHԐ 1^{*ET^s!QFanI[^ 6 }3m*^vË|+m|\j%d]EX\P5߲JwNcp-{Z*IL㡘I>bzV&U~BW[צ.f͔ٽ:oS+qۜ6Uߦ^ 6}m Q)pjWN=7! sS* 2EMNT! mT&"eZz{: ?WyI| Uq7DUZŪ3vv KDqeO x v4*eL=}hcB9\r#16Vy?x?*ofzj=fb!Ni %A_gyrZLhՑX=BmPnbORq *FcBS$fl>͓vϭMwzEX;z_)jˡːon>ܘR>|)S|^?8׶~UcSqըYK㈏h'ǓcBk%QqAUW&O{_JڈP~'W]A7 [3y:ECÌ ŒbW[>pD"P9-: &PaZ'1)Dux Q5xj:!L f*:tAfoah}B!2% foOF+>V-=?^Yy0W/2bfHOK;N؝9]#$&_ 0oQ;!|܇@E){v?U+7̟a&k.c:rW|lMO-=JO,!<}76xvBc&\#Wh_1誘+Wݙ=] N=i!xO?//`'L +Na>_?xɦA:qt%O'e?,dw)adN1#wη~/W/%OX-KFJ~xWOQ_Q=Iu46oW*_f+fng(yf*]]e > Ӕ01@5*>kgKxu]4).Ă7b~婚r'_{J(SClvčT2MO{p@_Q{YxV-=@2PSBR:6 b@rFW'=%4)i]ڈ*ƔsLQL%suξy퓿=u/_~K]g2c-wf9!1-Oyjp;o&PkVXF8nrEM>AO:664[ئmlj;j{ϐ0TVS=R&gfu3KIn@˛}OU'`nퟫGv{Hoc2z&Ct& 3DZאp; nRZqj?g.+# %7]Y Ⱦi)ˊ2aYxLI<{2G sZVrrUҕ?rEkTWJCާR[UJ\Ҧc_#9EZRJJJJVNY%5ʃ=)$^Uz*iTr`|L7}WBɛ8^ h^q! )-se\9fL%n!boZt|I)ki K8C%4wqHB֚>/E) XNw-̽lQ[_JY)5j?Nq^g`کϧj Ooȹ/uXqB!4<}ߓ.Ew\Bwr/*|GŬnW :IġChgT21_V5]y$B\-12q3HanŢ)zXā*@)h,NџsTˎ$6F pe1F89jӒˊ4Ptn<^-بmWt ׮QEGvڃV4H7"ܐ#g7Q~A?.zoxGWڸ~ԯ8~O[Gǟk%NG騿^#9#OG}OyԏxSH+;˷GҾhW3q:BVBVzO+gQ~4ioWWe㲬k.Ͷv??vjVF qh>6J 0Y!}VX^;Ag3sα s))0S{1˕yT $#΁9"F@X1)0`z (**0`Dl~^i`$BF}6~s뱾r;?njkvf󨯙͛9>cjA)U*nǞԛn+ cׯ+EMxiSC1v(v6//!{/DsuO#RJI6z߂w0R^on._z4.Ub/RR=ZD̔7&t1vŎ|QŻbܱyKiJ*l'ؾʜ8F2h;]Y{ℝGk+KR'>k ,UM0$x;ZR{ڊ($~{j¾`:|tj%^8Z*է&˄P'ΗXX˧1,O٣GZyQvwБϤ/`O\3]Oj%Nu)^_<_'v^dN 1԰ <ɜ> 'R$^4`4ȧzK@ >3H 7J֬m/;3 ^/urqeËNBhaM.µ=V =Jq"e}2+}S|✚pƐ+ =0};֚!(+xԡu]ő۴ЇLp]YA©vKSt^R2O E6dptl=s3{>a&%C-Yn81PdLzk*m8m>X*ĔB lƶo2^Yӛy6&2\&(eT܃W8]JoG_qG魧w˫]epɛկBMC%4^0f0uʒ*K*oBlٙu/CN@ &Ic9*}yX#tHeOeF6N-tz%^o} Zz.FZ,/Ƅsu^%}2yq}.\.tc.S|;)kfTs|7}֊K' w9aG-ORtD-_L lc6@2@Qk?_s.8 콀cRhDGp>\AHca4-ݤAr0C.¬ 8f-wltܯ!llr*,#,/ |F?y4AGKb2ʀдҴXY- \/sT8rk@MgÚux`Hd֩ݪφ6O[ēG`&K-Ax=ɵ?T-2ŏ EHOCJ^wLb{ǜݻ7'm1vȀcٻnK`%̀ 0wGv%bT^vL66G ws l~zI+Z>-*<%n݆8 Q;=ˆrl %YXBm079Gf5Ð&UV Jbйן0${-&ps<h9ds$!jGXC5aL-xdkĄWBr4kK#tUBerTfp=,]bEX;r|٦m^MzrKS˷;7]z}k7i!̐fJ8~qZ!Z!̐=o+7š0oS‹zeX:eS_uC>q}UݵK:0 $wfC$5]z᣷-BB Z٬B] 9ءvB{ nC$ _gmq??"4G=vd۝c1 1RܺaW[.r^oXw?G no"_/kS˚R(aXo#rp*UAr<*۲W+)y)o7W-[x¾e\b`/~”B?zB}7⏑ kAҢE6٬fBn,VE6ui%ffE-[@&zghbx[wjY@ľ¾]4ꭸzQM0_h,VތZ; kn2`KSȀH}cIV X@&8DTɥ%K8]Yg(t35}yЩ疞(!3&c\ -Z<&c`1Y[{ xGQN~E?kQMը1 0 CǨ?= 6 DDkuX$}iv{}Pa`A ᆛp%vqКfjR1F<͠/ ¯s,ƃ30?fsIE@Y&t(c0lb[ J'' ig!XRP.:Ð:eE<}_<$}IJ_f)N{h<rk t'Nh,4#\I0l_-#sUW:fIn.k2I6LдthE(i8Xg{ӊ ZP9.@9頀*@W VO(ͽ~ 4xzG>v}|OI<լ(x׫Siic/{zh="(į( % tB=7(w彝on&6tÙx9[^K|N//nsnWWE =QhRt|bVF Yv?ANNZgu 64~,bN-V<Պ.9ՑTuDu ޾&\ ƬKNJX`mmܹ2¦JUJ2T'? 5fBhq9^s*+\ʭn/ⅾ6xAʉOhM]oBwA9kNaSP$>spKh2BwTjQ1%lߍ' eRйN/DUad0O[r -r!A`[ ԷJ; w4;@s]&OL>GgD kmO+|,N-# ?e=FH9N *F3 ғXhla<ǔN7B notۉjWM&C|]@ 9?aC}jekÿEm ѰQTm#mt'vŝw{JOM~B=3ouxcL#,=BkbAb"n6,r V2wX)h5Q\oﭧbIUKެ>BOX}'ժ3 jd,&\o0Sݥ"o’nL'@33jaZ?˟z*!ҺSK"ǁ'fV7ƨN, Dr=d@::?Z BYO0e=Ҟ h`i.=F~; M}4E :j>j0]XXrњst; 87V*Yst]ڢ1Lw憝M#j|k7ӫj>Ixl xja} ~jj8! ӐpLxOrM @'8(}@Egs];AO `uh~(h^=6,ǃaAw`6AǗC!>aww8}k褮a {/]ZcZNN%_I~NOa=7M6⟰jtzUZTO1|q| I'!a1\iTpu:@a{]v8l U<~B@+BCmeB6\4 2$0Wi e@ =p ̂l>e&fWH̀l|l?R:D]^@k*^o,R2yj4y@F!j#r3B ,]VcՠͲ,kCPmGi_N&ci:ԍRA/9E}w+Lù6K5!ee]_ .pm׍Z߮;KTMa썢aaa`id UPdm`0=sLwLJ_ 0ەKmSlb82L>x"!+ xF?´xڑ!Gix9k#Io/+B>L27r矦B*=x9ao0{9r'/WEWb{%4z36$^ĞVy^mŻgJqn7J^?sU܇*SoiCT.v6$dX%o{_I(/C]J.6?r M|z ?`}h?/HWNZal8J5[Lݟ}iYg_HS)h^1ç򧄣ůSQ)?w1Փ#1dnKv&\ZaHi6mnP߮OFw 9S>V8TS4mJ,uo|A8Xw#tS`ħvή\j-I)z*??ŕ.|rsUڊe |D3GO7|`RBs9p@C8Fes:OOX ]r6@8HNL OHe7fPn_2V>+7ur{ݗ p Nfb~CGh/,ptdDgJ5,DPBrj G#7|/$q5߱L*"4* zyפɴW=gPsks߼xsp&DC}&x)/ .II7L4dQ46ž6|R ` @|qN~U!GCb(9twO ) Gfumμ{S-ze2{WϜr~jQLPS*8]Sjsʂڄ2v +4H\:"bvdO[/_mwJ]N;]&C[$~-)I#]CFה `GZ % ܤǕo?3n}L#nLMqWTbv#EYQU׆NXm<$ȯ~ԕ#W δU9P͐ sp"VɦfrBM(O+'z^oԟn(ScPTǵ}RlJ:H!,|x2XH'Ԑ)QC2sJTOGԣ),RGݐ]ƍ@٘3?7:lK03/8MLo,}>@7@\Kyt}oPǙئI^DV%&ͫ"{փa!=z?:[w%$MWT 7JHxO5,uLGSXw nS1%0DŽO'G L|?gv["lTOEϜP$CV' 8`@Ijn%*X2p9~o|-W^>ǞLpIneX6!;bgF>#;$CYZ4b>+z{UBk[,'CpR6ZvF/`\zndHPO<:6:] t`vmt* 7_6 P|ŷϡRXc-|CmyL )Y"2m2wWz7`L]0`l@բ@YPj.lgN8.0yU \jd&uHsoX<9_WmOR>(&p o"VwYL@-Xb-`)2gѳ7kيs7a 8'4/O a z4P6S?FI-mʾZvF}ZQh'mJY}5C9:4G9:p5G 1Cf` !8 %'L,c:I[qhv:$ AƊMrZ,8&pg# !3)X۵ΑLDO8ikZ(nes0X`/Cg{b/l} 5laа"y:W&V,DDUZ'ldW+9U "'mašSPt&B^ ]m-I?.6_:2U|G6l|pw5Ft@鞲Pw[z}thftuӌjX QQ`6?*֢Ps}q!5@޶<*ڳ:+OIGh)(NnF-D) N,RJ|Z[ܰE[ mqw bے(DT\kDRQ b9 \B4b?xp˸BJUxH}ڰxDq *_#VxDK5V+CK"x–> @زm\(eZ& LXo8]=Pvƞ X ;c7}0PHtbۋ~~ϘFSo}Ó*iZ^~,7J2$ص ށJ]u=&s O,MRt!^1dvfSD+j@a߫Թ[Ѝ^o}ZFoԭ.ꑡ[KU1_cvmk<9fֻhjlfⰱڪX)z}B'xƺ4vlUJ&As55߱n%uXbB& O`I-{鹜EK^g;/*Q&sH}m+􀇕&#o~e5SKXA㠘bPL=5|pX}aAf7芳QQ?u-bZX /`;G(ɦث`߫h A}Be? k΃'^uPJ˿Syٝq(Ol8{Β#sR@MPïq{.q8 ]p7|yYL@e#@Ч,tx2`Szo=nbKиXh$ر7X;ꐺ)HL^;}>*3=Cќ([۹KrǑI:Z0򽵜bhWu(;%Y-!3(PXQ?˂̠mVB9c5B{.TyZf;T&|W$)y`*j]"jxPKtI O{ǁFN^83?Jn5H'o&{)oE**0V^x=VmX==7毗< ,#˻*k:3Kt,LAv#n'3ʆ"HxdrTp~=E^-e"C4yԙ'}۬K x[PP\Nje/4bO?~e//,܋=Y+oeR%l?%,~B"eO !~B p-vHy'$kBNsN}G*qtǒgNЍ8S -CCP'?0r甓`jf1%ϐFhjb =r~95*Y0(C{S$oH!G5= k uaGnwh?b~squǩp`d,3VJ7%m9py> 3jQ?P˟X0GKN.CG6 9bD蜣uNqiXiE Il;KB)tb NJLl4",ewl#qKY>nL cWwL}+:}ڵN<a֚2u{1a9Y]aOsݲ2ϿUT)Ƅe:b@~ƴ qX@Y>csL j߫7-u|R hlQ~zZ/; 9o]H9qinpdg{?ҹ\*Tgl݌8|Ӈt3Z{&꭪Ci܌/Nkp5KT! F4-UM1^Ynn-.zvT,XەX5b o2qZmF)=B^)35e1*rEt^t,Ƙe2l;]&.!eO}_&^^CB@%8 DӺ߼!AQ{?eq4{B'aC +RZf`Sί  eFVERUc7|qu45CM6$\vl&SQH&VH%NRfcZaxKoE30.K*x,rf+\e }L ~TWLYNWâ,Wܪq]wګ0/)]F45%|a^x?ĸi]bk*'fm cfqk/RqE Q'WT:R'WurE%H*5<߷+jJNɽݸ[&fBQI^;OF]ubS}TK%`c(a0_t`YkE1*fıwIݕW6Xywj5ƢքlB)`%J̙Fvr/N9ԍ'SA?8mUMfO4 ӎ7zLj̀]8rb9wDTIZH<%f}Jy 6ՍlN S}x6 Yܺ C=Y^L20}fQ>dP0bH<稌2A< e`}qY@F{ {sֵ(101X7|TVflٞ[T:ClC2ejOZ#'x.[0Z9eJF}0O}o3x8l$:'l6 2~=_*յy ^2trdze,ae.R0^"eLfP#r\(]W jˇ}W+69tR-j D6KO\=$?\%-TQQզQF!*LS|c!L ZS)*u B8!cOA=!}omro7~'gkڰ0AA.>V9r o:h9<ߞ{??e'kCYCCMbaX甶/Uγy9Oq J۩ҧ:$MJ.  oZ{CxK qN۟d@vhf+ak ?üj awŚAݩRJVb6aXT>_t'Xt Xz5#2Z6kL`H@0OHbGCu43uKFaM`s&j(LqVЙ:G4UT-~Hj] H5Ѯ.Cl% 篁 ̘Z 8N"\i4ցǮǍ\s|of!Jx+N-:RY>P}pύvխr~!1? =+χRp" 2 ewE2[Hv= 5&sLˀl|@6`%2 ,́Ulc}r Sjbh>[pꩣnT |/t֏ͬ_6C0 l\ euq ҺlT_ --l>L0-h=a+WtAn´<[(3IsE::KB7Bp=3| ,Sf=n?~ۍ{3ts-ts-b݆nŤ9B7-Dqv5]9v^B7sυbcغ8 n}F8xozUf1ۣq~5˟<:3Ws9X<MډsLǒ^Q+>D DY)zq5=D$nsF{c3鎇IۈXJ[ը@?3]bQ *˒:ak_,ڳ>W4k#´QmZnwVL@_0¤Zc/g@`ՁR! #Nq˴niaﯝj%N\C鐫^tȅ<r|5}5"#{?1=yUX׈p!l.VK|ռg(kxľtjjouJQNTs5c:jюL##V#n1͊k'!B{GoLǔzG/ sOv'#k}o #j10[[>i * ulcZ>M1a٦je%~\Q˧Gv\뭣i'٘Ɣu|*#cȓ~, =! f]r%ijX̻]f7ʟmDP\MXf?}/yU݃}& hS}~(VC]lz~-^lT$3ʋoh+B?} MfJdדxxqOC RCئ{%>H{|En%N0DHE|#͌.{ 'V Rw Mر[MYPӮc|Z&SemW/jjuJtPQYn8%Cv7fixu7yB%]|k+ rf Jug+C˛dF-1#e)@~f"5)$Vs JBb5N!1XSHL!1}Lڄsro6 LgC68il]"Sة̾VA믓MPXbOd(S½5[6&t߆.]js_f˩'2qюy<% =ߑNi( fI?7qi?BY&~J8hl$^6&OpO 3t?>̾iH[E Ss=E=-嶭A{~f+?%in4gy4b!s✠8'\R9+xqN9!9!1+?]09'D3ܦ'ޟl{nF{/Ū=0NJSu"GbtЇh{6G 4 +trkhkY@fTsqQyf񢢗>WTUvw"Cr2e9c n0oN؈ 6~G($ !Y‰ƣxez#O@]XG#E% Sb9Zbn/si^bS} , 7tx% 55t!#TUռXzE "h-h)J?Ͱv}4xׁtHcDחS{* 0lخ&D3c"A\}/?CReyG.V:owkֵApr %3RD(P;1b`xŭVЕ5.nX[n VG~k$DI=Y=L tֺen;N$Mc@X!0V[#̂14h6I04FP2);spgmU/4E9` FHlkn؋PI9)ݗЋYy${+G)Jfݕk=}lVBG_N(׽Jfnfy#o`*hYx5L`|RV(-9k +H=ȊޜX6&1Q bKN!G!6$a49FShOWNYcBG<iF b? aιK)%_sd-w3R^Kn}CUyS tDP])7in+1icWe)qRޖ4&cayYkTq%.K)QE-wSvCCs \A9y DεK!NXnK# E0}IEWQRU;/)PdcsxUZuG=EG7A( G 8Hjis^ ;qc_+*x:7o4j g%=kYv+6*R~/V8FB#J8 !jO=dUY)4(m١-$ji׭jP,cFbGڍqmi1`"4„sw旃鯃fnd_np߱B,ݟ6'uU(WPڵW!E[}NXJK)}|9absLb iy1 6WE8aԜ0ji ;|]9G6?8t|s!IHRsNeı!K߳ ߜ/CZ9V3~M $oNf9j6vȑϟ;mU4 +ؼԛOZzeRo\aT倊G73; 0 j龂Ճn#f~ X8jg*0b_݋Hup^7M6ȳuنBJuڐB;ax6*oH),B2 \ ժ%~<ӋVmF}Q6vu0nmD1a \pln%lg mloۄ5gZs,j킣N1T=|ѣ ^plB]pSPAV_|GP폠Sϟ'RV8הPzw@58X0խ82>V1t.趢eq[Eۮ. wj_uUr~ Λ:ozjɴC]êb8J-WSw@jo&/*ﻁXfu&C3#b|:d~ڎNKfΎyw b#QR=wS @lʛ*L,|Gͧ_? `*bQA\3p JU<` vY{/>rvkZ?Y-_o{EǸ1?Ô%4lryBI;/W#jQ^u@lONfk ^ax5'~Ss L2K}[m\H2󡓳޸ SJ Uzw?s@2D1cֶ=tl,˰as2&$Myu7]9/ xďIGP9 1vxffJG=|` 1c"r1XowS J &_I4#4f߮o_xƏFw-$#TEG1.CRƳJJދA4m`|pAgN :9#3\GGj̘YGg ޏ #3\G0F~̬"}Vb L9RxL z8B<5>zB<5hvB<5#=\CSk3w! 5:Q6aCCZ9 foFl]BVMfzRg%~ .w=Q>ם-K] HQ@lK"$NDx#^2s]xÇY+hrrUDbŕo))RhJ,q9!C{(-],#41j{o8P)f)ѻZKr7]ACSBG Bvhkm:MDC0luolNrtbۊ?n!!>gl'w^ tQ%F!*D|ͰZ8t÷M 2^WM q;8۟Q7؏XUX4XU>РR!m%MXBwkTVs7BuB(`~㔲q&Zr #O֩Ji~$ZЂ'65h3h0PL&DL.N1! b # qQmly>+ Gp@엪ܣsL\ն22cNuM65&Q6~B忕[ ҨD/ou+yn,˻Ua1 z ]Yn׫>-K>}.xG"@UEk٫;ڊzO|`L1=K1V.?T8OAp^r.&8rs"O+Ԏzua=dUO Fmxr<R#{\I7k\pyun~qKZYǷKb!~8~t,1f0N1;Έ sɁjq& _+S$mp[;]]D#hDi_j&*OQY0lBZcX:qZ^[$^/bnޖ7Fk#}fuwKw-^5; *~Cͷ,dp/:R*I#eWU̱R]uۈN7:]j%|>EڑXvZ) QF\ U1ri$z<ݬߔ;tYDR$$d! zAr#v缊_myza^'uZ9=C sМv%9x2mn=&,1jp~m^@9ɴ4a HZϧ jعVo/xTޑpgHiw7Mď1MMˀOco%J}C2o0LM6B\pL ~*27[d5v\[vhw"P`m+}3&OZPjAq,@H DԤUN@Z> 峝 $sHl )Z^ ug; &&m'V4phs,oM=ʘi%TjiФ@Ѽ P+}6vwHuGLF$B8ƉE*wЁ,-$j!l #ƉI3S ^$>:Yoy#>,sa BC ޛk( %mOsp.Hq .0Kᐃqu5Z2js%z-ǣQ:Z%xȁ0֪,bw >s?tF :~a`cmB ~rhSh!FDqWeĎTqQ=/T|#')n{A9rsˎ.f  `>#F.Qd{)(z-cvؗ- / KD+q'sΕAƋ袗'6esN6:ذnGdMpSsC[顿hb|8'Fq='qGj dqÌjQ45gy_{c:$kH'C@?@S:5@j;(|N_F`azLӘc6f\Lb0nRp8LKW/hqs0Y0:QE*|9wH3EX%Ԇrx9fN1/㳝k$&{aת YggGĄs4\`j$!Էdz ?$D菉K$Wyf?IBhc @} * euy?}>zs8N'I0qQS1U.b}*0" &)!aQ im l#m6>rm{Pp*ܱp&t@RDN4-2aF+Ú|hxEu Ǝ kܪN8mD,J\"^"v. bD,ċ\"r7D,L愭qα5x}r/kꜰV9> >oL/9(sgN$'ˠ`Z:bᜰ]5t'[B[~2',kڲd?`@i+Eld67ۇIDzt__vcވhW|9as`VB, wM 9VA@^p6kb`1wp0oL3E ڀ0M=.8/N]?\S8' pۑC-qJM"!F ~s[p9NP nA@!\p&LFmFfSmFshBvG6&W?YOm -$C5K{~8,]rs^2Xֺ{ZqeV/ĸ7rcۉ ĝqw(qF@͌ 5>}12Yf.12Af\9%?(/<>}#O(3|tW1ƘqHQX[ ``4ᝍ-mgVmS1=&4+=2Ec9׳& I0Ls̔jϤCaAXbԚei0㏍(r<Жp'c`)gJbз++nFۄWĢ XuITKPG*,bc؋B'Ztc=wY89{R4!`PApZ7ħ)f~ZXA<`5JZRrm^ :rCC}Ч-!_|™^R͊MgS<&y(uSSpttA/!'^lNi'M@a {Lx,%撣s:PZpxa͛'~Ev"hRhߨm.O W=G>7$\cA!x%f|YH 5)uQliB)St=IJ l}]Sֆ%y| ٟ|oϔ)]ʤؓ) ,,"u X-~TZ]4Ҡ8>&G0 f`0[#`oʁwZF3[+Mq?e]xS>Ф77)}@R@5Uܐ'^~fȢ#1C_WzӕIx~]d1.Σ7z xʒjTr{UG#)G ol6q%eN9͟Vn6 ?mr9:v_qϷՉڽCusBs0zĈfMbye& uf3'9G뱍Ob78١Yܥʮjg;Crszqၔ3)CRF9ZĤ7ůރC 9Gs*Ν}{2ZgU.Γ"Q+V>XF9.GT!$beŸs>s0^5w-8*шY>~>]=?CrsMh F w|l&i1Fq@d;|Fs|vo(-\Е[XckU#~z $[1T#(nN $)A"(pH ʈ HU W_nu?"-rs* QQshtA :!NN6jU (# U,`Y$/)Zgl7Ov_ŕ6 @6BP6A@?8ƠYȜ^"벞aT"?9z[Nm˥` KrBUkU%QRmV- -1dn[nV>:Oa [vxINs1}%Q\U`ܐ@lJ)*v?|m&B7_(˯MvU,7Bʓ˭Ǻk+߃^/NQy}2%:6\I} J5(-ܼy Uֳ|^{1}xgXgb -}+T_P\QV-[Z +D,&p{xljiUC^)#v3ulPp0{tsV~ r>m'ި$ԚZ&֯J jqlRK~~Ѥ@uZ+8GYiR SSjr-[,Ud]rczW9](\=%dNnO xLy`Sv8ly8N/_R~d'DZTl"S˨ gdG?>e=3|5Gq6SCB1z{m/d¯*QZqra+9u%8Ғs1aNG7GDŽi-vjcaWUy$61a7G2ҾcyZ35.@i8YqkeIBn47rΎ7'"{fUvkNv֖,* MP? {r?šsi eŠshӓ3ow `6%Hf (aQ#`6@L$6!QPtHi9>'9&cݒ?b9jA:y1]L'NO0ě5'X! (ƈO9 wDVY8g> n-J{L蜬H,%1"+_<Vc%vJLvvZp@: E,+6o8 ])jB@~Gh*Qu2mO'];T_PRV!Z68~ PSFnèDv BB Ҿ&0 WX3z[$*i 6K C:-]E+lS#r{ B(-NZ8W#g:.4Po8{^#%G#`SŒf&NwuI&A% *~0JHn^M6Ӕ0#G;֘?stm)<;Sڒ9W+[w^)X .%lžoE6S Rj)B ׊YvId.EQE+XA! mU%K!xڠ\fn]g:'NQ KX&L/R̀FAS?ϢWۢMk~0.e{"='`B/ r!QO3 sdVeE)qċh'?}z1])kʿ%w@5؜5<&H֙u}Fgj^vS+y }._p }] {\-nn7RO.&; ]b:em tnc 0w"{ǯdOnY q+A+3b;h?/tе+!3/E,+0"}fuwKw-^5; *ɵe!Frm H7$U6c#e c:;6VȉCadS S6YAeS;c6UwCK57Rt`GJbpZeGziCQ=$CU~Qf-X:x^ ˨DR$$d! zG UnV-Tt^y}P=w<\`ۯ eAf*rmP3kIt@]-\lWڮ)ŖVTlvC~Aj+BQy2'ma$,rұԿ Gh~4#䔫s vԃѴ)yu^XIFq9XYeEDu⸤ ʩR_yfEq.Wd{uu^-zh6\jK`TqGxtSnxAyaC)M z_ȍ;TԱJyH%# f.u#ў;hT<[axvjyW.؈+^ڴDOlC ;FO_wFnw1-w$?ߏͶ<-o )3ecx-L#\۝! w Aq~80sǁFx";0s(j %UB;uΩ.5Za尦+u9k\kÚkk2_o aOsC)$|'D"b}n-^RlI2&^ N*a (KФC-wK!lB^.o*q-RKՇPMa X GIm;56M 9ak۴}i[h+qAdd8%5u-$'9'`-QrsN+ls瘏?у9 #p~tolZJzy0_{Yov ϻ甘AE2xNٳ,f8i.ޡm&  kuEORU??iOe-M; RP+8^r[*͋E.Ga!?I۩3A0r_Ksu<$I.-byufC޺P-mTx_mGhw !$li!jKP ,67.[CX¹E{jO[lϓi>>ۇecii50kf͊jajE|;@.'i0}d=#v7ܰsť@:9UDRX~ؕ? v"hsb4/B|]<11r2d&/=jU'JGUdo_-WVj4]Dؓ#;kuaȁ.': P֩%syOIZE*M8P"D"J~q}]-ㄪqYN{p^NiH? };6 m yl~3:ǵ1]Ftm?,ʹVa7= OXQxmi1㠜 2,1cSKL~ zF1,_sޟg >cG X$㳍!aNWf4Ks:sl]ZdɭҺC2*wUt dn7VhuS)M-[% IJ,fw13xS~N C  %:xZWu%֕\Kl@-PjZS %O~룪W lbȧt.{ ItMڑCJB)e?_[֠nK6c)Hϱ½:wWt66]'=gSBOπpwLRdrLBPS3mtqԲ;/ӔЩSwz#vJh)G+:oהPnRr)GU9ςGPuы?0ה-S?>ޯ9399gJX_\sຝ?X^_әs4r?9"9*%!:'|vvMg~1ǻ/A?}:'ז;_`Y׶qxuxM@sQ\jHHuAs`^ΰ ? w&#`ӂ<ʋ0 pقL" ٮ`iuA`,8l1s}Y{]hpbz]nQ: U<PuqydQ@WxH( F83j-}FTR[2۾0LꜺ gu![wU_|^Q8&(muˌP3цN&{֝QZϟ @.ȭOk+^A?mpUz5(ndkmۛ{\a;0 X a1^rwaV9#)?89ᆥ}@F,abP3T,3^Ncfy eyO-\`M͡RXnvss*k.6P2V_U&[a'(ig&Ѝ@àe{Vк_<6%jNK9N J6O=$磯|ykjm=!82'TӜu?r#Ӭ-G9vv_ _uVK5my|,o˪ кPrȏr7n}ӏ9 H`j[$󹫄>Um{@|uݪk ٝh9``q$00f#8wG@wy`{ ԯ}Wc0-0g@/ݡNT8[_OldqrIʨ$e$eJ]25sY%)#^䒔$e W[ośr՜WcvX'dSen$p 5zbG@\:0>F^c=~l[h{lۙ\ր=FCfPGWʙE۟'S}nHv[lC{g4"4I6=;tdTVYf-[gp"0ܯΑ[&V>k,%f{䷴( J\j_7oi<`RssNanvXEg)ykڎD LB9Q D#PEߑ3 %4d›rDɨteOO,{I鐋{ܬL`_!j pg&tj0QSOhB\B 9%@XK]bfBBI Q%e@$<|m”M Ll\a31x-z44YO#!ln7:29% r% D'"Yb ߮`&B(K1rE8`=M# ZhEUU=4WD /P0*vk uTRCS移tWnώ"IE?_gP=.ķKyM *}y!Z /r V[G6mR_n/ :8HՍuv|")"GB`4HZBx^e݁I$/;OPdw/Ti$MT,Ky.o0OŤ ȉ1C v(YX`=15֌v2n&[sW?vS-JE:N~|_v@MAXq`_{Q,W_nmmLݤYi򲊪֙AȺ[O j[6'F7*Y p鰊M39Ù]h%.W_.W_R/zW_xW_: n60Ξ#l]Ah v 4oAd#wr*JRV]bFA%5N_чJ cd8Pn#5C%1tjC#յzX cq&̀ZO 2wPV:9PۊFXN#=kyf.7t>oEm<-Oy;- %ڛ4}7q,!4WS|*}S$Zs_YYHh>ӡ zRѧD׊+k W?ʿKޔ{{xH r/ҭݵQ*}Se gr,xE:웟Ճ ٴjI!y1+[VJc  MsOEy툉+L. @rۢu6A }1J9( xЁJJ9( @wXUto1dIcȜVNZ+6(Ss'd!zna9 3sϹYP3`3_|~zU{Us]:{>'P]@E6cU9~? cfց%7VG_.؊>yTt8(ny8CL8VM"T&QtRdNsW ծ,^!t`[G^!H U!`б.:[OO`@>Ӎ;Oe&`.xX#SD$ۀ `@\CW[‡Ɏ%<u(לH @) TDqY uBo%'ޛۅ5:hO kSP >nj}H["%k 8C$˨8Pp @ >">2np4e͸"P=Ɏa)aN?#zԁY` 8~gvw PTe\! &,.[ q cRrdR#RjT)jڠ]c6W|!?#ab +~/ߟH}]aZuЙ Ohx3 C ֟nJQbWH!l^Z8l2hC >41T;yhDh=wׯTJkA_rN`êT~UU~`˗*6AE }-U).ZUo?>m)&mF+5uP~ep-C/((&\>a3W@Kݐ -Ǡ5EpQlqJQvzWBti-X|b0~Bv9~^A' (9r Q=z\pbW !U)VwADDl9S}}bSNv*WUY lRb%ek!.ߔ'AO!GPw;pnf!D.zbsUPx~/݈E8حTwmv@ᛣ9|>j)eH^do6K9`[HvD|CWY!v95ov-&n+UWkUp0<} w[NdYYymԢ .É3ZhԦᆕF6z¶5M)Ɖq|Ffx!PZKKѮ%Ԩ^j+x 5:qhqPL`Yśr9BKBNdlԜQtUMvvU_iQ}*K;5G_ \`SʗA Dԩsvx|A{dQxXwj.[dcyby^ eUa 4 G:{j{_ /JoRFl*rbwkaY)=.r,'th U)A^woƅ0La7M [记d6\j̯/r=)VQVSSRMF@/. =Bc 9kKK VѴ,r!#b[zf[ꦹ%6>iZsenylܒE3"wUgk|ڦXcF ,sBWvXRr5-\%?wޠ<GYÏ MFF0*r׮|$}$B@XNW"o\]5骜)>٢(bEk(Fy/X@jG{ÚI`0nG"qk})V<²1ccX͈Ӕ*lG:VΕStwB~8 I'TnjOiev2۴SԚJLL*12rbBѓhyS78kk8pণdk1aF? o'b2}o,j(mGsMqCGgፓPXMpXAJ@,s[J}@r"yC>2;B+b7XuJs=kltǨa;pn8>S} ,?8ycցf*|SC~U^lS崛GvR6VkY_aֺ[i~׎LHc)1MOXb20`JNȑzk}"?|S\_?R1O a76{>{C9}q6qᑪ.ijtZ}EǶ;`[հaHS1K{چ'iI+=ߕFSZS=H)wy-iT0eV]2 r"wt+yDAe!DalyvaLY c9+99}Aos"xJ?>|G` $J'r-9ӓ tq9As5DV*r`Tt)o^)\Ys<`Vz}򕩳&7_gU*yh䟘NHT"yUlO9+90_svt_C-v?Q+crԓ&jYY?/\ Kua)KWrWFTRf !  C0PcJ3!)GLȄ @9 ƙEH6{ndUi#r"/{e 0A 0D|2?FOK}V똣 )'5'bmO|j`Si @5 Gu`9 jW]m=j) 18P;F8nܵnW3²[v>mTA ŷcKFc.RUf84bF3l05g.1+jEu [JX:3n JNnnjvwSwSOQdA@?Gׂ'[۬ݲHZAƓN 'E鿽E!Us[PDOo1&*˗w;Yתr;C#8glpx%u\S\ʛ]ߖ`qqZ:}1"ag@CC]Ƶ-Ž@ۛS?cRr#;mJP'<جU D ?]"'TTsSzcCE-L*5=| ƸVzNt8r\sR0+x9̙0'0 ^hOV9Ou J J=Ojh>H)[\ uW~.Tu8˃ R S<7䄁,Dc:":$' p9'll9޵r AH:_*0i,SٖAR.0s(NAy"~/AUsa0 ttQ, ^NsoDn4*% `]6!j䄡2GkT˵%zis;/qU=6>Q&nTc(FmI.P|<YhkA41,A6ЖsbT^c]ɰ{ +L]56z$w*bZ4WEV] ʨ;9B#āQJg;c6*|٧l6ϧԻ R'S-Gra~K~1~ =c˗2,3D,Ch&:C\,j_}=6.;v5_\;Yȑi6sTۖEA#yOnANZ/{g$ feAc-Ϭv0GYo;:XՁMymt pC\ΰb_4qWTf9jp)W}e0td"g"Q=r=w3i!I/ڬ l 9uf%_{ѳ"+U#fZi'JZՏ=BXJBX*kwĐ0S 0OH!G"U7sDWR.r(ꙩҪJM7UUO0$g^zzW5gWBB )ծ9si "n"gWe_;1$ٺlin@`m/-kPhit_b-=y,_Xv&Uͅ`6 =2# \e~ Lüj2uJBôieH=qV*NsƑ^#%.[^#RM q!=,"lxFQ)P1 :50`EE@"9Dso6U#z+caŒF0$a!)9khZCC,20lFݪ}J0B'7/uW>z.(c1րDX#BJ9mZ,ďm)iX5#`g_.7RE^,vFc"Hu7(+̮"4xRh7d,e5}!ryf;܍?:[ҀzWo_km$Jn"ԈjVdA"N,i׾3^L`x"q_[`@>$Cq"|E)(Nr5&Yi&6rrV+{fQ<WuWDnY 8FBX/B׸X ,1a9v[Yc„eV[3d (A)fh|ݧux],XL_G 0’i9*Ԫ%DVCLΓjVmI7: SbL crCt6Iou3eLu2D12_ l3cFt eqCH1r/L%Y 1K0:Of8#yOdvAuBX#5ғӏ!-|% Y@8ZyZsZ4 C֌W^ؗ.W˝PrcBYJ83;_~b; V%~}U>׬^6t{/'[rt?izsTWTʹ_L.*wI77 Ne/XOz=#8Fz/?YkP Tc4,Id&JxU‘Nl(A;Am(e; \C ъHMH"GɣU;{%p{*b>'Dk 6 '|.C  U,ch聑\ M\m.CJ!qG`8^rSLb;%nRBHQ2xا(cjn9o);7(_o=Tj!~=]_="}hweNas薏Wb`/0dA*׍vӌte2 ?'ϼQ5dV&˒6MzdiXsN)wU]:db""7g{<cKƙͯaR8 mXo@-K@smls@eyqh j]6O`vWC?gy=﫿R>z?c-K`\m [8 u|XW/])a컠?6L"(0F(Ыq3 ` /f|}1Yւd|_2ka(<<SMBU׼}--iI'U%d&hdȚXnyʰї9qA@;Iz>G/Ecسcw70V4/bVAU5F5l~M/ܫ@Kr Me< . q9/x~.s+.I@hA MySoxjj|l3C~ ڐbJຆ Rvg%1 Կf pS F[63䪑T^?C"#y~dkFOYvkVMаۊ26*/yLw W8}2 -2w?lw\ 52Bk~WyT3΄P5#Yh=Z_pB )5×+!We'e3_ܣϮ$JiPʗ|, ayNo'zpqf9B)UfL(Y9Gɲ&7cCJoXWwnh6{l{-ZG^8EFY8axu2LH{g]^){|,x\Uږ;x>Rc7jy+Nhs{gG3\ċ^{<Oj0iA! #]WXW ը;;蟅9f#~pI?%FQCfkrɋ}}ڔGr/ uU4㏟=[˜I]ӏǪ{uº} hux*ޔbfĿߔ&^u8 b(E-9U?s7BwXF rc}~k_y B>bf4%pQHl!c|f FY;;ڪ9uT=x ̤)[S9G0:R'Iu&'J?r~j"9쮥d-R[uI.#lo "7$Z]b̞u3̫C99-Y67\ M1+ m!tR2lL/z,dE (uPXbpTn0IN~CtCq_ Wm~Ͱ G3\D 7wCynW1W 3"ʄG flNf\5aMfOj7'F$r;!͉ulDhA'iXC^Uhá+FI^ <;HmɗXB{==zƭrܼ n`К#mkk`WIŽJ!HÐ5}b⪐2hҦв#LF"Gn|P̴?Z$uCnwSDh)o(v˲\Bcj.F\AeC`1cwnǠ0Fs+Փgh9ƿ6wBPt",)KNhp>zS!Dr?Sz#$̆ҐDUcnyIOHVZ̦ei)eyO-e6v{x%RMB4QwHGEE $4h7cB)heM#>kް 5)8; 7cB6,TJFˇBQʀzaNB:VYN6qlGi ,%4!9!)Ӵ]g}CUܩV:`VOg2R)1pwd@)UN,?7;yYX 0 l/_q]'$=>DS}U]@}"Ϟ̀Y9]ٗכm|: w=h xNT$hYGϪ`{:vZU= ("|ܾ'ѣ.euZILhFyZXUDo~ͨ䲯~Ā Po_TԽ)BL<$]cY&p/L!)7Dno;!-:(ҿv%sc-g:$L7(r[r`cٳiKm6;K-;cvqݾSJ?mt%sln6} w2uYi=;N!z׮3g "0a:6M)s/-[m *A$poy=9o#-sGѷUaU9Vtl{WŎDINrBg_QY4ƛ2[8S[;[n^jN[d`9Tz BH >j rlSQߌS)/ozw EXNO1DpᦍTDB֍ً򇣸AeܠY9AiC2-6 .裨mK&DPi0PÌTm=KC("Esؤh! q.O)GfǠs'E:GNDLu~#'"u[9r"R0M f.O|DќT_UGNDMI.⼉Hfbb:ozTϚaN>@F9.BQh˂kZO0jK4?+]IG*uӕI>l!M0"hfEY:C2Kg9ڏœ? (Hi2m.#Jo蟇y/[1$>::qNv(dRA/f?$M&+b*~"WNs3ΑAOv=D͐~wU"`vq o#g˚/V/+/˧thX '7j$O,[*\Re/Unxѵ^Z8ؕ/ݍd&r#ݔ?*aת_UY"G& D,]2vLY~KAHBIR,z%9f&M5A, $}+4o MM@#O.V/TڕAUM'm]&P 5F][Xf+[ArU/˵Anu@#h]Agy}cr_{Bxѐ^(hDnεòˊu?UՋ\cG}y‹9uHѿǠDv"?H󊠘G`UnuwUt D]!ԝ~ŃbSΤWbwKiO~L´DbLUS zs}=Wuؼo-6MEl׽#"wlMo^J$>a}l)Y{!r Ո{$ `M]XHI𼽖Ů ,#'U#vJC9^&]#Kf=wW(Hj 9"SjIBYRGJ|H(`IAIa5P"/pf۔!|lnv?Nǀέx> 3Y8i"24oZlNVtb ; :|,/ [޴G&;u&;U؈EQ2ǚm?[_~HT\~*ߔН+Yt}3!rec"ZfMG QMniH74_}jcD' r "2# wVwRb_)bMY%2Ec2z kF, +Pd)XC=N̝sad-45J, ^ˎvY-]fХ yw:޳vm#ݮv$Rv=iܴmޭZmndQ%6_<I!(;}66`DRG-b࿚zq7 <(|̂Ȁ,3tj2p! H8/fѿ'J¹eI4Wm .ntn'v(0gy(}K~E?|R&~ X ~u X6m91o-|g(jA4>ڥcdQ[vM6i+i6B.?u"_ }3T>BX%DQPlh ޶ܤ:w+h'{G/{'N#^ e7BC?dA`/C5S#m6r}s5LB[MM^F爷y DPXrњ$PՖsZ? Lh_=tDFj B!L)8մYfufPP-a:?rZSaVd&g HDɧҊ9хʋ.Xy`^2E'%ٮ["TpDO]"F21ٝ߭Vi=UoܳmbkJ[|k\R_.PIj|.Tg$,I#[M^#bVkTCgHd;SKAT8QH~5sXʯ@ IRФN l/e;Y,n 0[ƢǂwD%x)(HAI]b ZcQ'OKtrQūaTAG0qnl-F Ө0BbC31".PV T.P#CCp`,KrTNcݻ#4&*I#BWl7 @2㣟YvwG+=0ɔ% R? |2n ,K4Xݔ9iGںB"*cJ\ɕiGyB)TmDhyo@]mj zF `ET[ZDadr8,qH*lY.(i!IWCH)$@1=W[L Nى̹`sWV|ѥb':M޿* : u`ƌ4UI\X0:xCW"TyeA~ [@}FyF s}yD%iAr6v_ `D#@e?K#?@:Kl V}MKG nAJU?JMi{ xtwkBO*F*y`e8%])]JO=d'#\(FഓQqqڤE#ByeY?K|w&ָ1Pށ;V_1VӱN<}N}רW*/-jۧXWAm{@>WeMoc*մ ]Uk*7&v}jyu<|'jT *~N5R7PUz8TayMxrDoqPMγ&zX"[BÚY':5PևC5YGɚ/?e76 5{_4KVώ|b2+L2,\V6l*Yy%t!,@L{B2[f Ԑm`1x?(=iKOeH+kEY񀹘1fwwYBq-zbaUe9|ar.w8dÒtƍ`G (>$p[syPV%@"čEĺS]b]bdÍJ)' TIW؎rQVrbگkf- ᳈/ѷXwEHUE~Y_GL؏H:@[.S`QN3Ll92ўSm큤X-{B{[w[b@~&BM}tSy^ b)E[NhZ&ZLok>^/h%aj*u>d5RmH?^[ҨϟW*. 6o>cHŗQ'I֋nmAH4N 3i*vX]z(Z bVS)U,)%SE$rJSt+b)zm6tMHת'u{t۔@-)kJج,hVӬq0($- }z^{ZV\a)i777_"Y>ۮ ;CXZxu+`B1LM)k!\Tgw{'ǿ"Q :\XVފalԽTFvycxYX*$ǃBm ^X!iwOQ dҐ'E;^mBMt 6%tx?<~#)Oی|R'xq @kc'ʯ(odtt a_Ai Pro9Jf!~ޟE(dFАE;^f=2ú "HP;+?!E]7fH ʃj="3_Xص7OTvƝ6NE.?j(nl L5ѡv!ښ=%*X3j([QU 6Bف'U%,NSYDZ(B%\GQ$!~_7:~΄YSva@G]A=ϋ{+bN9N&̵l0ڞ.;[ 㣣8n.@D<"c*>K(wr`.Cw lcz7 NlFsE>( W*B005w2}~i,trAU2?7Tס"Yؼ%g^Kr:yn^7g+SM &)9zwHd[hL\hh  g:?g ߯WWdS7oo+10s+:[py-p^8 u}J$ENDlB"ؚšuPRgeHTWuˠ:!*<;lieUNƉrzȇ@y\)(lYHM> }"0*8*gHudhž|BV0A]\⶧ǴKd]2etspz펏hl2{VwwO;rm98]lR,qf9FNKOSeD^m<>Wq~/ |K%@=YJhrl-e[X( =KDGU-svCz.B̓(_g H9Rѩ<8<8m:(N,7 _9-4y0d$ԯZѥCTTuU^2rLP+SGQGh՞)y o`Πı*πǝb- V*D ]g7ЁS@şT7()OnG1dQ Uǁ9ISbܨYjT"|@GS#w kC7iUe#xa^[ڐnw$oUM{f<︊˄]WeB11IqYք!B'D<^4(.p Lm\d/WfuZD9F8߼J(oH^wBd@a+O^cR@ޢBPksk-"&E sEYCW'z&0jtE.aqx ՟nN'oB;CUs/@~/,PY#WS['9*[pW@sT;`(AOYxzz&h5WVTKQZZjˁqE3*C2fJ%֥I!>#E`5Y\!H3L/ꦈp<8cՍRJv`sXmi<;.4\gdmW@k5=;vv[iJTj'fdDHSg^ i ԋ@g>/%LF\Z >h3Li]%o&yuDdԕ3@6 ɺJIl_h9IRZW"Sذ0\pyY[V&E1Dƣ2uƃOY%k2ܚ&EBvL8k.%O$}q3@مpqJkt(Of23hytle :1$kտZ[,,b rOlʽ9 m{@rO|r 6߁kl`r1\tSHaG}‚iU}~t'99D3Țu9 Nd,VxKelYPW b͔> p9`?̵n-k%?o6J8:U /A<z|Ϳqָ smtP}5U0B"ܽwl9(|:\o7K8<` oA<r.OngD˾%X~gd90?Ǐxsnpe㤉$4$;yd7zIfʙ .M,}m4H9SD-f2Okid7H;j-b'#MځtI^:M`Es-zf|.Tܓ~0„Y!nƿȸ5UҎh$t('amsEjII e\1xH4Z䄇*k[N'NՊp^ْnlz>iG6hUn{?1>C_*WJI;jU%#i6):( @.B2(Q?iGᅁUD>5uDҮVk-ڲZj24GST|ka7XjLƀr=9&D;bad%heGYLƀ=IBP#WCi0ṕ1!\M/: i1oNx-`vR $;4^N0ƀb6th) {ɢ0]\: dC L%MDqvk*L/%gW*OfE*WY)Ӟݜ|\@%C*Z>5+{-] sF@Cz Py>8xڅSTB_'ť2z5\rjvVԬq+v_ySJ+TMWlfت =ȅ ̪5uƅ^ta2+ҞN.θϩ[iI\@ct!Q3%èUiuh\LWWEx1w gP\G yƲWsyS[Z_ŋW>fw zHz MSK*tI6^:4*E[ώj3RRJhSF-쵳0"މpQDM"E=@`#m~V7_A1Adگ+#A1L`JϑJ1JJFVʙuu)!*C@e Y1>˞3꾧6̈́uW (&hy)0ӯ͠VwN[q,]w0e]tp -N"Glf :z{e Z^Ȭ^mЬEO?Y$iBQw`|cRGn $SZc+LmnI_Xԋ=f-`ƚUIYKh!Ӧ]]kʖ,^>8I@ Fca5NzSA3LJLr4! $^΄w"2|/{Zhv/r `~:F͛|.Cf-\H5"l%ur=3=dYu ":ʁAiڢgJN҃@W֭]ϑ pjz&NM9C-Rz3f} <$=ˏ>WG> 6}mL u:h~sg^rntɁҹ;,;, ؕڅl͙G\o`]:vs͢o4)qn$RZ6N>| }PBu)л8@<ŗ=%Y (AxJ=H?T:3 HċT-*χс ka%kIt!MTucfu:d|M aXocqF(H M{g^UaN/=4v's東;oW`1wU3vثsw*oՙ?p&PBΙ?tў!ɮs]k̟,Sh;f7J|:ZNaמ7 wd#Z)41窻$<x&ha>漡=0ߩpGgs$zh=)#bà7~jmmT 9V Fh m'nԡj c`6͝j<@a Q!4m>JWO4:Jmr^*hN@,D)@T2uov_J6w*<^TOXQje `2UzuE}%۬b‚ ;DKe ,M%Eڐ"of\e YGz†UCAE]DH^!@+C}.ho َ[ @{ʦbjHHZF褍Q~>'%(>|nbQϺ6M/%|mD L4Y/zMlf}`o@ ΌM&ĿQqA&8tksnQ|·ϗr؄n,s37*8H}ԘsۮIQu۔]N8|.{%#^ɇg?l }/2'.XZ4a3@#?8}f@/R8D;-4&>Q5ں''IJTt*'^Nug ժifQ;6N+cy'iUU)kf4#hd*'ԬU1{tȩtӝk1elAf zqZ3@z3$ 2{R=ΝWعszqEBtuz'<:{Ƞ+_^[ AW)5AT𑓁6OI(Zh(3єhhnBĎ)xs R5}xn5N4@֢^PwՀ™LQMXKhZ$9 *ѷ@IT5Gd)kHWa' 7hĨleȖ @J9>̂,0!$4f5Lа $(٭)U഑"xH'e[z=-Rum\#tE9پsf<^3 E/07 `k:բ&Ѭ> y,nјh@A ݘC~xood%;MUݵӳGJ 1=8$r 8нn5<̲d>E?n]-/Љ(WCWV7ׇfaP0q 1O^ؠp̡#as7P7g=c1z,Z$"-cmC4΃+0Ɵ [ڗ#J+; l*ūi|{qEUVgh}->x%}pLD߭*ߌImB]JC]AHz c_ #$_nYMoҮrƅ]e45hL-"E\ƤG9qoW ]:Pn1~YE1 eqS!)3Mc9 FXKHs۪byR^DdFi3&ib((Uu#}A-;&w҈JX %JtPY 'W]Ӧu#^'v::,C dSf&P*z(E(gWQIWO]\&9ױ`Ɇbȑ^+\^fr#~}gu'"MJc1aJ=m@܌mMW(Aa  6Q {i36S-j󜜮I9?@{ ar 22`=j(g +~F;ǀ8[3&o*!H4x EyФ~K9c@aSZۑJwbѕ"w Т?ҏ+wqB2@?ëvՆsX/Mʄ+yMA[wP!\(Z,7V:ԆFqRRpW3Ϫn@qM"a6diߠj׫3GJzяu@s',0Q{X9EV8%a9.a^:+X@rץZhzYAWZ*hXHZl0@tzQچ { =XbW ۬\Kim B 0B<(HP-'Ɗ9i""̡7lJjjXhzx9CO\>أ!NFI$>xuWw"FJtY1 )w * yփ [P TIN RV'ɊX~vc.&HU`(ez`ok~ꈴ엋2:L>H9xa4ţ+lU$, 'שZBZkC-/y9v5`L jwbAד\ `OL`5X:~7,CRdt$CybV ౚz4 GF#8f&\="T!e}hX7Ձp@ _I?UgYp=NL\s?y[~8,qoZf_,<*nE9!JΣ 'ۮc<xF<]&TTT4G%VٛD:c~jb O@n d+MJc&ՐLigFK- wFJ)jh7Um5U㤩W*>v?@ȾX gU[ [ϰ^#۸A v- mv3فbB4Fe 0ꆒ*2 >Yg9B< <VfC4E|]Db'$lj1hÞTÏ{/䯽Cyx|ˏg'Edz>g1_>|Akɕ=*vSNR{~JhI/--L|9(7B"^E@.@{ej^\8\Zh6,لM36/}MQؐMO(nMx&-`zPnaon!^IF5٢dl)>DH9ۻ9vNҽEVQ\Z^%Ux,#C5Bfˌ`LgfңnCE1vMSPY]K Td:C|30 s:IuEV/ L 8 wʪіoUɪuN7XSaHZt63j 9eHsQNiZ%>e(/{3jfSlh+ZC.se! ӈH*(g`O)l=p΀CtH>XHc ŏ%Ԃ̉U("T]l'JjUVp-Wxf ZݪL2v)Wmrj}T+u$AN` ?m00(W" n}g ~_P3g&MDTUEK Ӌ-Gr瀨D4saά"P%l.r ΢mWWsqҊe\g伡vJs@DQs@DmD?2.\ hR^Q=0 sVnfXnnsVZ-)fvdD}Fc* ϗ8%ͶK:͆Ϙɵ"gr HN&Z7a1-"wo?{G'O=,9$FRUPd,ݑsYF2SH9y@({ bPĄhqT*zKUC_K]q:ҋҮ(($X?sGOGzDځ5jֹ23$\LFJ=BLIY/3iZ8MեhͬpiqAg;YlWC 0'6)AyI^(g ڽWmgH,v]-=,KtWEI;,]Ѐ>4%xсiևSo{a2L(}Jc>}-b Hl6I)BGCъ܀ur_ G״<~M]Y@Xc 1aU gz?~O_/_<~苇>X, ),Sfj ,m@Dc?#N-%kPB"&RTn6W**:[JPEZw[)y n^Ը 0Ҏ@mņH?C!v#MnjB q=E C-*5j`H ݪܡxC2&~rՏ9]J7m3F &([Fek u9)ZXׯ-9|cS4ud ݒڇ3[2nIzzbd?vL=!\6eL~*w0|}2OM lW28SøA{im^ƚkc뙡hV m ꙍz cllsf>?)jYc3{kǀs1\Gal2)?8s=Sl13gcv+1"ц:wނ>C[ ^HϨ\)]hss}LgGChj:w{wg(s;;u0}^Cg6;] 59CQlT]O\ŜnjOyC,Jw}}bnE&Z) @3K"ł505qϑFh4t^_ɞ ]?3$C{,KM͇)D(m?nXqj#i³p Rd;imU AOa| H5x c|JRQSouʳ)FVu1nLɁ;W)s6?mfhs7p[kٝ w7<}y̫I˦@FEuVCIM\,1hsXinЩ<ȕ|4 N9 /*Yy˳5FfEΖ&,󊱉M)06Lݐk'K[F' &OiRNX5Mbg`Щ8<^αd5ĺf9,rb?qцgx2eʗ`x:[ޱ#0TK7(ѝ8p"$Mh*\Qp NMoFG ؇eu WaZPB&:%hE&qk6M +(%* eifJ`o/ 'Hc鱯9IKBhBGMSU&Z}dK$\FOe>a4z2jV: &6BTfҡ@L-@LldC4^TtB{!Mi@"@q:DѤ(bdU+͉hY_[^)^&f@3:[ZɚB_G0Ֆ@aw  ³@m(QBM眍Бz!2).uЅNK_`]CB.bKT)4pipR+@+ј'a_/U|+>FYU㉉5xtPa#@< 4(o3&!COzc/6 KX 62Ӿo~'ʷV~H>":NY~"`Q!߫^x's_M^ix? bAb|A22OAJojL_oZMGLMl;͜:6m0 GF9TkJ 0Ŧ)@'3koG7ĸQ蘜6}tMt9SB&;60iZuA=w;Z;]*UH}倝;5s{ib84෧m}b"o:R;y^D9yͷM98|u;f:`,$ Q}DюՔ x9(F6g[fLh׎-NMãiph Ȫ89?zH5a[<1m8-Qc)p@Fڙ*]k+]r)Mh . Ŝ*\ sY %d~1`sl"ߡN2Shfr E6zK:?9O*y-?9O =$3Y*-vGդ0u-\Okq+KE$?VowU$^C"p H-&ҽNG׋1rJ7_/!p3S;{ص Q~C6ˎ.V#qw<=k#1Žs jݸ $lX&4p}&Z/@B G"j`F+K M|k5+U%lVlsEi(/zJ+kMѷ?*%@kb7Ak%U>>>;{m+kZx"nHj"fn :PYڠYGcldZ.uTuos'$xMvd=￵Ex5˘p3q',۲tCmOʁ kxRӆNʯd}sn X?hx}6p\gOSA"wVCϲ6)u<Q#Р.=#'+b`B]|bvw_#bL" 1}U;!+*~FhdнFBjZ]8mMHDK~|; omgoe\D~n@.Lw bUs4sl(4s?}fcfck4+MEgo9 E4ڬET G/'f3whΝh@ +!AXfp^T㆏ ż`KAX$]0"Y&0>F" 2V_%,m>ҳ6dA2p:7P,;q9Qj(eENу^.VG6M1pC&JoGNF+8!VuюWN&WTP 8C{>RKA Vsb`5e4;}ߏodz`$HdL =^r$J)𨈎CEٮP z\:VQ&S{߫]|T"2ӹ5\3nڑg@lr$U-i:Q4bfYRލJH67R2#}iG 퀦U?3+!rUȫWWa~JHLp#F0 s6!!f;_ɧMH:.>7|$2U;[JTc( |Js3%!y@_mVQe")Zdn#aZ< 9P i@ـG}lQWnY:lhVC#3;o-6{6A*xnwFxX,J>[8~N[ mz%]*ѝhJ%#2dېEhm,=OsYf6I6WI^|+L>HjS4dNJ>|+-dfʫƟ};+oX ig Fp==Ҥ_{<;{]\ʗzO˚˚q6^sŲn6\XrFخg=zd82lw|vد P'}emn=tAk X ]۬ P&JX 'PdVֻ74Tu传ʛKc1Ѫ|-"7l"zA:OS${s:>_͓Uj|ps|Lx?gs<8_?ŗ||[y62Sm˹7ga%2Jm/GVp$`1h1:?i1PΛp_]*H"*lNu) F'z\Dd ?ևD?lxF HF[X}[*h8'#Q~xF_uϲm\ٞB2vT+(ϒ$0ui\6ְaf+Q[dR/,e/-=5R5 3gB75Y&`3> }Vjx-&iv'xPrT3v¶èX-aԞ^tQ]K%bucު;uD\3[ܴ֗{CZ@]q#n%Iهg&enT1*e}A9Jٲ B.`ޭgP +wjQFP a# |M&efl,ԳP-+i?*eܰi|~qP+sr:=N(_wΪ[կFj8h[ӗB2>.ZPi 8RSbR*ɧ<("Uk'zp{Mc}cs\pr<Ӆ"giP sU'g𘧭#Yk5hvJa?]uK!yNh"F.w/<۟ϣ)/bx aPKaDC;%Ytoc.htmlSO0~_q)a6H+L:m{tkcQ|ms -HX^/`D:KS6F\ɛokw?>|Ȥy6j~>oo`( R^=!2zT %"/lv؞ }taUW@U9!C*,_;BGa"FXVР@P!]P d_˞tcjzy* މOdeq0)|Af*+MEa^ɸXlxc'O><^F !y-R\_>j jk_n,~ja yV:x<ȯw zI:}m-OV8>x q4A`e履x_[SX:[06YN$v^ьcሯĞO7c["/sWZ6R|n |ɉ8+nU:J'}]{罨)еyLGm NV&A9ic =)Z`43 &J7w}#T$=R!F2Ey5ضf0%Ròkù`C>xDv`Sw[±3<{kv-l[ 5<[tyUvp+aNE#/ޡvbG{ jU@r%Lio<̓l)걯DcIy9).$=gۀkv}Q:8pl%16"QKsnlp. >WkI@f6օ/Li-Ѝ#<K')E֘?Q)< N|=SZW}&LFt- תpd2Efo4᷅&A<s ;:mt%+ !{9MA=L:Þ4O5^ C}Zi9,>Z\Y&8 8#f+}uk^a{JQc̫ [ N[4+ ڊ98d|%6FkU8:{Ҁn~7҃!`O% .8%"ù#;N_N)xj8F7 Z!,QN5ŌPBU bʜUHG:k{!-9UtRCf͉&`:B&PFUUtZV9 3jF MBbQ%a"I d/U/~{W%jwqr89 'PKaDOm,#toc-pyparsing.pyparsing-module.html[s(+zӝXI=8$ldkw;>[T@>8)y?> Df _D罳'"|~aE(NϮF(&×ۏCa_O?'w\Qm 1ѧU"5XSKtNaoEjz[ 9߼yS^Lo f0ȶ6~\ 6(_ "Rz@:Bqɶ =T6HFE:.VDL7 j$7 q1E˲"٢&EN3Nєa052%Ve˳?^'n0̽ӂD; P6U#}>A\/rPKLKߤʴWia+,S!V`H۵.D'Gܭi]O\j~|#w'D,PF)o+0IV4^fzr`L!rA_\c糰1,_:eHg.Y* 9]~lp=SUqlp 2aM* uIN.k/.~坐!"7 yrB鲖~/\7hC(r)t` \xz&ff$m#k~XvϠr1.4r7?`'[uc}w.4$c-MAj@ >K,Ga'~&]<͋Tc3FgbB~XGz+fzvQe}Ɉy9 eu8 =[UHqtYMΉ~tYlHDT|ӫvߜƥx[j-)F&T=%dQgHtknbQQm+&bk!Y31 6l{njX ^95 l.尧0]g.ovK QK8KYbUnjaI_A_s4IR=HXQfk~sĆبj9NkK:r8P8D@̴4 3~j4:6Q5VGǓ+(B2I1G 箥) @9{.?;5piKmV\W Z%SݸU̲|YչUlR&X% oL΀r3mN G!c{ c(vOqjYpgv KpdY漫m9/בfJ;x`)}N¦9Ԑq1(Wሬ&C$>lR)fE2fi]Z H9iO逄NwH8wp,dgZ GQs#??U ߣАqrNH}ZbڝkqMPKaD=(` api-objects.txtPKaD'v A H(class-tree.htmlPKaD OT 4crarr.pngPKaDi?  a6epydoc.cssPKaD+4B z*  DFepydoc.jsPKaDq3Q  CQframes.htmlPKaD| *  Rhelp.htmlPKaDaW;t X^identifier-index.htmlPKaDû7b  yindex.htmlPKaD-o %{module-tree.htmlPKaDrC S" pyparsing.pyparsing.And-class.htmlPKaD9s G. vpyparsing.pyparsing.CaselessKeyword-class.htmlPKaDia E. 5pyparsing.pyparsing.CaselessLiteral-class.htmlPKaDY rK) pyparsing.pyparsing.CharsNotIn-class.htmlPKaDR  N& 5pyparsing.pyparsing.Combine-class.htmlPKaD* %E# pyparsing.pyparsing.Dict-class.htmlPKaD2 O# pyparsing.pyparsing.Each-class.htmlPKaD@9Ɨ ;$ pyparsing.pyparsing.Empty-class.htmlPKaDB?Z C) pyparsing.pyparsing.FollowedBy-class.htmlPKaDe& pyparsing.pyparsing.Forward-class.htmlPKaDXo G H) pyparsing.pyparsing.GoToColumn-class.htmlPKaD+4(t UE$ Hpyparsing.pyparsing.Group-class.htmlPKaDrvUW& pyparsing.pyparsing.Keyword-class.htmlPKaDBi;B C& pyparsing.pyparsing.LineEnd-class.htmlPKaDM < ~H( ,pyparsing.pyparsing.LineStart-class.htmlPKaDѳ` D& 7pyparsing.pyparsing.Literal-class.htmlPKaDA) R) CCpyparsing.pyparsing.MatchFirst-class.htmlPKaDpyparsing.pyparsing.ParserElement-class.htmlPKaDQزAֱ+ pyparsing.pyparsing.ParseResults-class.htmlPKaDz^ؿ%3 Gpyparsing.pyparsing.ParseSyntaxException-class.htmlPKaD'* N+ W pyparsing.pyparsing.QuotedString-class.htmlPKaDε׫`^'8 9pyparsing.pyparsing.RecursiveGrammarException-class.htmlPKaD _3 pyparsing.pyparsing.Regex.compiledREtype-class.htmlPKaD#<' #L$ "'pyparsing.pyparsing.Regex-class.htmlPKaD BF% 3pyparsing.pyparsing.SkipTo-class.htmlPKaDq B( ?pyparsing.pyparsing.StringEnd-class.htmlPKaDy B* Jpyparsing.pyparsing.StringStart-class.htmlPKaDtUA UE' Vpyparsing.pyparsing.Suppress-class.htmlPKaDfU| C$ apyparsing.pyparsing.Token-class.htmlPKaD ?- Empyparsing.pyparsing.TokenConverter-class.htmlPKaDv$ C% xpyparsing.pyparsing.Upcase-class.htmlPKaD'\4 V$ ڃpyparsing.pyparsing.White-class.htmlPKaDn P# Ppyparsing.pyparsing.Word-class.htmlPKaD; E& pyparsing.pyparsing.WordEnd-class.htmlPKaD{j E( ˪pyparsing.pyparsing.WordStart-class.htmlPKaDZa; Q) pyparsing.pyparsing.ZeroOrMore-class.htmlPKaDI|2h pyparsing.pyparsing-module.htmlPKaDZ[T pyparsing.pyparsing-pysrc.htmlPKaDq)<  redirect.htmlPKaDC;%Y toc.htmlPKaDt5 toc-everything.htmlPKaDOm,# wtoc-pyparsing.pyparsing-module.htmlPK???pyparsing-2.0.3/htmldoc/toc.html0000664000175000017500000000221612322542216015657 0ustar barrybarry Table of Contents

Table of Contents


Everything

Modules

pyparsing.pyparsing

pyparsing-2.0.3/htmldoc/class-tree.html0000664000175000017500000004040112322542216017132 0ustar barrybarry Class Hierarchy
 
[frames] | no frames]
[ Module Hierarchy | Class Hierarchy ]

Class Hierarchy

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.OneOrMore-class.html0000664000175000017500000004637712322542216024110 0ustar barrybarry pyparsing.pyparsing.OneOrMore
Package pyparsing :: Module pyparsing :: Class OneOrMore
[frames] | no frames]

Class OneOrMore

source code

     object --+        
              |        
  ParserElement --+    
                  |    
ParseElementEnhance --+
                      |
                     OneOrMore

Repetition of one or more of the given expression.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
parseImpl(self, instring, loc, doActions=True) source code
 
__str__(self)
str(x)
source code
 
setResultsName(self, name, listAllMatches=False)
Define name for referencing matching tokens as a nested attribute of the returned parse results.
source code

Inherited from ParseElementEnhance: __init__, checkRecursion, ignore, leaveWhitespace, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, copy, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables
  __slotnames__ = []

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

setResultsName(self, name, listAllMatches=False)

source code 

Define name for referencing matching tokens as a nested attribute of the returned parse results. NOTE: this returns a *copy* of the original ParserElement object; this is so that the client can define a basic element, such as an integer, and reference it in multiple places with different names.

You can also set results names using the abbreviated syntax, expr("name") in place of expr.setResultsName("name") - see __call__.

Overrides: ParserElement.setResultsName
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.LineEnd-class.html0000664000175000017500000004173612322542216023553 0ustar barrybarry pyparsing.pyparsing.LineEnd
Package pyparsing :: Module pyparsing :: Class LineEnd
[frames] | no frames]

Class LineEnd

source code

   object --+            
            |            
ParserElement --+        
                |        
            Token --+    
                    |    
       _PositionToken --+
                        |
                       LineEnd

Matches if current position is at the end of a line within the parse string

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables
  __slotnames__ = []

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

pyparsing-2.0.3/htmldoc/identifier-index.html0000664000175000017500000027232312322542216020331 0ustar barrybarry Identifier Index
 
[frames] | no frames]

Identifier Index

[ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ ]

A

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

Z

_



pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.ParseException-class.html0000664000175000017500000001652312322542216025162 0ustar barrybarry pyparsing.pyparsing.ParseException
Package pyparsing :: Module pyparsing :: Class ParseException
[frames] | no frames]

Class ParseException

source code

              object --+            
                       |            
exceptions.BaseException --+        
                           |        
        exceptions.Exception --+    
                               |    
              ParseBaseException --+
                                   |
                                  ParseException

exception thrown when parse expressions don't match class; supported attributes by name are:

  • lineno - returns the line number of the exception text
  • col - returns the column number of the exception text
  • line - returns the line containing the exception text
Instance Methods

Inherited from ParseBaseException: __dir__, __getattr__, __init__, __repr__, __str__, markInputline

Inherited from exceptions.Exception: __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __setattr__, __setstate__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.MatchFirst-class.html0000664000175000017500000005131212322542216024270 0ustar barrybarry pyparsing.pyparsing.MatchFirst
Package pyparsing :: Module pyparsing :: Class MatchFirst
[frames] | no frames]

Class MatchFirst

source code

   object --+        
            |        
ParserElement --+    
                |    
  ParseExpression --+
                    |
                   MatchFirst

Requires that at least one ParseExpression is found. If two expressions match, the first one listed is the one that will match. May be constructed using the '|' operator.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, exprs, savelist=False)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code
 
__ior__(self, other) source code
 
__str__(self)
str(x)
source code
 
checkRecursion(self, parseElementList) source code

Inherited from ParseExpression: __getitem__, append, copy, ignore, leaveWhitespace, setResultsName, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, exprs, savelist=False)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

checkRecursion(self, parseElementList)

source code 
Overrides: ParserElement.checkRecursion

pyparsing-2.0.3/htmldoc/crarr.png0000664000175000017500000000052412322542215016022 0ustar barrybarryPNG  IHDR eE,tEXtCreation TimeTue 22 Aug 2006 00:43:10 -0500` XtIME)} pHYsnu>gAMA aEPLTEðf4sW ЊrD`@bCܖX{`,lNo@xdE螊dƴ~TwvtRNS@fMIDATxc`@0&+(;; /EXؑ? n  b;'+Y#(r<"IENDB`pyparsing-2.0.3/htmldoc/pyparsing.pyparsing-module.html0000664000175000017500000026435712322542216022424 0ustar barrybarry pyparsing.pyparsing
Package pyparsing :: Module pyparsing
[frames] | no frames]

Module pyparsing

source code

pyparsing module - Classes and methods to define and execute parsing grammars

The pyparsing module is an alternative approach to creating and executing simple grammars, vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you don't need to learn a new syntax for defining grammars or matching expressions - the parsing module provides a library of classes that you use to construct the grammar directly in Python.

Here is a program to parse "Hello, World!" (or any greeting of the form "<salutation>, <addressee>!"):

   from pyparsing import Word, alphas

   # define grammar of a greeting
   greet = Word( alphas ) + "," + Word( alphas ) + "!"

   hello = "Hello, World!"
   print (hello, "->", greet.parseString( hello ))

The program outputs the following:

   Hello, World! -> ['Hello', ',', 'World', '!']

The Python representation of the grammar is quite readable, owing to the self-explanatory class names, and the use of '+', '|' and '^' operators.

The parsed results returned from parseString() can be accessed as a nested list, a dictionary, or an object with named attributes.

The pyparsing module handles some of the problems that are typically vexing when writing text parsers:

  • extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.)
  • quoted strings
  • embedded comments

Version: 2.0.2

Author: Paul McGuire <ptmcg@users.sourceforge.net>

Classes
  ParseBaseException
base exception class for all parsing runtime exceptions
  ParseException
exception thrown when parse expressions don't match class; supported attributes by name are:
  ParseFatalException
user-throwable exception thrown when inconsistent parse content is found; stops all parsing immediately
  ParseSyntaxException
just like ParseFatalException, but thrown internally when an ErrorStop ('-' operator) indicates that parsing is to stop immediately because an unbacktrackable syntax error has been found
  RecursiveGrammarException
exception thrown by validate() if the grammar could be improperly recursive
  ParseResults
Structured parse results, to provide multiple means of access to the parsed data:
  ParserElement
Abstract base level parser element class.
  Token
Abstract ParserElement subclass, for defining atomic matching patterns.
  Empty
An empty token, will always match.
  NoMatch
A token that will never match.
  Literal
Token to exactly match a specified string.
  Keyword
Token to exactly match a specified string as a keyword, that is, it must be immediately followed by a non-keyword character.
  CaselessLiteral
Token to match a specified string, ignoring case of letters.
  CaselessKeyword
  Word
Token for matching words composed of allowed character sets.
  Regex
Token for matching strings that match a given regular expression.
  QuotedString
Token for matching strings that are delimited by quoting characters.
  CharsNotIn
Token for matching words composed of characters *not* in a given set.
  White
Special matching class for matching whitespace.
  GoToColumn
Token to advance to a specific column of input text; useful for tabular report scraping.
  LineStart
Matches if current position is at the beginning of a line within the parse string
  LineEnd
Matches if current position is at the end of a line within the parse string
  StringStart
Matches if current position is at the beginning of the parse string
  StringEnd
Matches if current position is at the end of the parse string
  WordStart
Matches if the current position is at the beginning of a Word, and is not preceded by any character in a given set of wordChars (default=printables).
  WordEnd
Matches if the current position is at the end of a Word, and is not followed by any character in a given set of wordChars (default=printables).
  ParseExpression
Abstract subclass of ParserElement, for combining and post-processing parsed tokens.
  And
Requires all given ParseExpressions to be found in the given order.
  Or
Requires that at least one ParseExpression is found.
  MatchFirst
Requires that at least one ParseExpression is found.
  Each
Requires all given ParseExpressions to be found, but in any order.
  ParseElementEnhance
Abstract subclass of ParserElement, for combining and post-processing parsed tokens.
  FollowedBy
Lookahead matching of the given parse expression.
  NotAny
Lookahead to disallow matching with the given parse expression.
  ZeroOrMore
Optional repetition of zero or more of the given expression.
  OneOrMore
Repetition of one or more of the given expression.
  Optional
Optional matching of the given expression.
  SkipTo
Token for skipping over all undefined text until the matched expression is found.
  Forward
Forward declaration of an expression to be defined later - used for recursive grammars, such as algebraic infix notation.
  TokenConverter
Abstract subclass of ParseExpression, for converting parsed results.
  Upcase
Converter to upper case all matching tokens.
  Combine
Converter to concatenate all matching tokens to a single string.
  Group
Converter to return the matched tokens as a list - useful for returning tokens of ZeroOrMore and OneOrMore expressions.
  Dict
Converter to return a repetitive expression as a list, but also as a dictionary.
  Suppress
Converter for ignoring the results of a parsed expression.
  OnlyOnce
Wrapper for parse actions, to ensure they are only called once.
Functions
 
col(loc, strg)
Returns current column within a string, counting newlines as line separators.
source code
 
lineno(loc, strg)
Returns current line number within a string, counting newlines as line separators.
source code
 
line(loc, strg)
Returns the line of text containing loc within a string, counting newlines as line separators.
source code
 
nullDebugAction(*args)
'Do-nothing' debug action, to suppress debugging output during parsing.
source code
 
traceParseAction(f)
Decorator for debugging parse actions.
source code
 
delimitedList(expr, delim=',', combine=False)
Helper to define a delimited list of expressions - the delimiter defaults to ','.
source code
 
countedArray(expr, intExpr=None)
Helper to define a counted list of expressions.
source code
 
matchPreviousLiteral(expr)
Helper to define an expression that is indirectly defined from the tokens matched in a previous expression, that is, it looks for a 'repeat' of a previous expression.
source code
 
matchPreviousExpr(expr)
Helper to define an expression that is indirectly defined from the tokens matched in a previous expression, that is, it looks for a 'repeat' of a previous expression.
source code
 
oneOf(strs, caseless=False, useRegex=True)
Helper to quickly define a set of alternative Literals, and makes sure to do longest-first testing when there is a conflict, regardless of the input order, but returns a MatchFirst for best performance.
source code
 
dictOf(key, value)
Helper to easily and clearly define a dictionary by specifying the respective patterns for the key and value.
source code
 
originalTextFor(expr, asString=True)
Helper to return the original, untokenized text for a given expression.
source code
 
ungroup(expr)
Helper to undo pyparsing's default grouping of And expressions, even if all but one are non-empty.
source code
 
locatedExpr(expr)
Helper to decorate a returned token with its starting and ending locations in the input string.
source code
 
srange(s)
Helper to easily define string ranges for use in Word construction.
source code
 
matchOnlyAtCol(n)
Helper method for defining parse actions that require matching at a specific column in the input text.
source code
 
replaceWith(replStr)
Helper method for common parse actions that simply return a literal value.
source code
 
removeQuotes(s, l, t)
Helper parse action for removing quotation marks from parsed quoted strings.
source code
 
upcaseTokens(s, l, t)
Helper parse action to convert tokens to upper case.
source code
 
downcaseTokens(s, l, t)
Helper parse action to convert tokens to lower case.
source code
 
keepOriginalText(s, startLoc, t)
DEPRECATED - use new helper method originalTextFor.
source code
 
makeHTMLTags(tagStr)
Helper to construct opening and closing tag expressions for HTML, given a tag name
source code
 
makeXMLTags(tagStr)
Helper to construct opening and closing tag expressions for XML, given a tag name
source code
 
withAttribute(*args, **attrDict)
Helper to create a validating parse action to be used with start tags created with makeXMLTags or makeHTMLTags.
source code
 
infixNotation(baseExpr, opList, lpar=Suppress:("("), rpar=Suppress:(")"))
Helper method for constructing grammars of expressions made up of operators working in a precedence hierarchy.
source code
 
operatorPrecedence(baseExpr, opList, lpar=Suppress:("("), rpar=Suppress:(")"))
Helper method for constructing grammars of expressions made up of operators working in a precedence hierarchy.
source code
 
nestedExpr(opener='(', closer=')', content=None, ignoreExpr=quotedString using single or double quotes)
Helper method for defining nested lists enclosed in opening and closing delimiters ("(" and ")" are the default).
source code
 
indentedBlock(blockStatementExpr, indentStack, indent=True)
Helper method for defining space-delimited indentation blocks, such as those used to define block statements in Python source code.
source code
 
replaceHTMLEntity(t) source code
Variables
  alphas = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  nums = '0123456789'
  hexnums = '0123456789ABCDEFabcdef'
  alphanums = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW...
  printables = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKL...
  empty = empty
  lineStart = lineStart
  lineEnd = lineEnd
  stringStart = stringStart
  stringEnd = stringEnd
  opAssoc = _Constants()
  dblQuotedString = string enclosed in double quotes
  sglQuotedString = string enclosed in single quotes
  quotedString = quotedString using single or double quotes
  unicodeString = Combine:({"u" quotedString using single or dou...
  alphas8bit = u'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîï...
  punc8bit = u'¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿×÷'
  commonHTMLEntity = Combine:({"&" Re:('gt|lt|amp|nbsp|quot') ";"})
  cStyleComment = C style comment
  htmlComment = Re:('<!--[\\s\\S]*?-->')
  restOfLine = Re:('.*')
  dblSlashComment = // comment
  cppStyleComment = C++ style comment
  javaStyleComment = C++ style comment
  pythonStyleComment = Python style comment
  commaSeparatedList = commaSeparatedList
  anyCloseTag = </W:(abcd...,abcd...)>
  anyOpenTag = <W:(abcd...,abcd...)>
Function Details

col(loc, strg)

source code 

Returns current column within a string, counting newlines as line separators. The first column is number 1.

Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See ParserElement.parseString for more information on parsing strings containing <TAB>s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string.

lineno(loc, strg)

source code 

Returns current line number within a string, counting newlines as line separators. The first line is number 1.

Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See ParserElement.parseString for more information on parsing strings containing <TAB>s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string.

delimitedList(expr, delim=',', combine=False)

source code 

Helper to define a delimited list of expressions - the delimiter defaults to ','. By default, the list elements and delimiters can have intervening whitespace, and comments, but this can be overridden by passing combine=True in the constructor. If combine is set to True, the matching tokens are returned as a single token string, with the delimiters included; otherwise, the matching tokens are returned as a list of tokens, with the delimiters suppressed.

countedArray(expr, intExpr=None)

source code 

Helper to define a counted list of expressions. This helper defines a pattern of the form:

   integer expr expr expr...

where the leading integer tells how many expr expressions follow. The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed.

matchPreviousLiteral(expr)

source code 

Helper to define an expression that is indirectly defined from the tokens matched in a previous expression, that is, it looks for a 'repeat' of a previous expression. For example:

   first = Word(nums)
   second = matchPreviousLiteral(first)
   matchExpr = first + ":" + second

will match "1:1", but not "1:2". Because this matches a previous literal, will also match the leading "1:1" in "1:10". If this is not desired, use matchPreviousExpr. Do *not* use with packrat parsing enabled.

matchPreviousExpr(expr)

source code 

Helper to define an expression that is indirectly defined from the tokens matched in a previous expression, that is, it looks for a 'repeat' of a previous expression. For example:

   first = Word(nums)
   second = matchPreviousExpr(first)
   matchExpr = first + ":" + second

will match "1:1", but not "1:2". Because this matches by expressions, will *not* match the leading "1:1" in "1:10"; the expressions are evaluated first, and then compared, so "1" is compared with "10". Do *not* use with packrat parsing enabled.

oneOf(strs, caseless=False, useRegex=True)

source code 

Helper to quickly define a set of alternative Literals, and makes sure to do longest-first testing when there is a conflict, regardless of the input order, but returns a MatchFirst for best performance.

Parameters:

  • strs - a string of space-delimited literals, or a list of string literals
  • caseless - (default=False) - treat all literals as caseless
  • useRegex - (default=True) - as an optimization, will generate a Regex object; otherwise, will generate a MatchFirst object (if caseless=True, or if creating a Regex raises an exception)

dictOf(key, value)

source code 

Helper to easily and clearly define a dictionary by specifying the respective patterns for the key and value. Takes care of defining the Dict, ZeroOrMore, and Group tokens in the proper order. The key pattern can include delimiting markers or punctuation, as long as they are suppressed, thereby leaving the significant key text. The value pattern can include named results, so that the Dict results can include named token fields.

originalTextFor(expr, asString=True)

source code 

Helper to return the original, untokenized text for a given expression. Useful to restore the parsed fields of an HTML start tag into the raw tag text itself, or to revert separate tokens with intervening whitespace back to the original matching input text. Simpler to use than the parse action keepOriginalText, and does not require the inspect module to chase up the call stack. By default, returns a string containing the original parsed text.

If the optional asString argument is passed as False, then the return value is a ParseResults containing any results names that were originally matched, and a single token containing the original matched text from the input string. So if the expression passed to originalTextFor contains expressions with defined results names, you must set asString to False if you want to preserve those results name values.

locatedExpr(expr)

source code 

Helper to decorate a returned token with its starting and ending locations in the input string. This helper adds the following results names:

  • locn_start = location where matched expression begins
  • locn_end = location where matched expression ends
  • value = the actual parsed results

Be careful if the input text contains <TAB> characters, you may want to call ParserElement.parseWithTabs

srange(s)

source code 

Helper to easily define string ranges for use in Word construction. Borrows syntax from regexp '[]' string range definitions:

  srange("[0-9]")   -> "0123456789"
  srange("[a-z]")   -> "abcdefghijklmnopqrstuvwxyz"
  srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_"

The input string must be enclosed in []'s, and the returned string is the expanded character set joined into a single string. The values enclosed in the []'s may be:

  a single character
  an escaped character with a leading backslash (such as \- or \])
  an escaped hex character with a leading '\x' (\x21, which is a '!' character) 
    (\0x## is also supported for backwards compatibility) 
  an escaped octal character with a leading '\0' (\041, which is a '!' character)
  a range of any of the above, separated by a dash ('a-z', etc.)
  any combination of the above ('aeiouy', 'a-zA-Z0-9_$', etc.)

replaceWith(replStr)

source code 

Helper method for common parse actions that simply return a literal value. Especially useful when used with transformString().

removeQuotes(s, l, t)

source code 

Helper parse action for removing quotation marks from parsed quoted strings. To use, add this parse action to quoted string using:

 quotedString.setParseAction( removeQuotes )

keepOriginalText(s, startLoc, t)

source code 

DEPRECATED - use new helper method originalTextFor. Helper parse action to preserve original parsed text, overriding any nested parse actions.

withAttribute(*args, **attrDict)

source code 

Helper to create a validating parse action to be used with start tags created with makeXMLTags or makeHTMLTags. Use withAttribute to qualify a starting tag with a required attribute value, to avoid false matches on common tags such as <TD> or <DIV>.

Call withAttribute with a series of attribute names and values. Specify the list of filter attributes names and values as:

  • keyword arguments, as in (align="right"), or
  • as an explicit dict with ** operator, when an attribute name is also a Python reserved word, as in **{"class":"Customer", "align":"right"}
  • a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") )

For attribute names with a namespace prefix, you must use the second form. Attribute names are matched insensitive to upper/lower case.

To verify that the attribute exists, but without specifying a value, pass withAttribute.ANY_VALUE as the value.

infixNotation(baseExpr, opList, lpar=Suppress:("("), rpar=Suppress:(")"))

source code 

Helper method for constructing grammars of expressions made up of operators working in a precedence hierarchy. Operators may be unary or binary, left- or right-associative. Parse actions can also be attached to operator expressions.

Parameters:

  • baseExpr - expression representing the most basic element for the nested
  • opList - list of tuples, one for each operator precedence level in the expression grammar; each tuple is of the form (opExpr, numTerms, rightLeftAssoc, parseAction), where:
    • opExpr is the pyparsing expression for the operator; may also be a string, which will be converted to a Literal; if numTerms is 3, opExpr is a tuple of two expressions, for the two operators separating the 3 terms
    • numTerms is the number of terms for this operator (must be 1, 2, or 3)
    • rightLeftAssoc is the indicator whether the operator is right or left associative, using the pyparsing-defined constants opAssoc.RIGHT and opAssoc.LEFT.
    • parseAction is the parse action to be associated with expressions matching this operator expression (the parse action tuple member may be omitted)
  • lpar - expression for matching left-parentheses (default=Suppress('('))
  • rpar - expression for matching right-parentheses (default=Suppress(')'))

operatorPrecedence(baseExpr, opList, lpar=Suppress:("("), rpar=Suppress:(")"))

source code 

Helper method for constructing grammars of expressions made up of operators working in a precedence hierarchy. Operators may be unary or binary, left- or right-associative. Parse actions can also be attached to operator expressions.

Parameters:

  • baseExpr - expression representing the most basic element for the nested
  • opList - list of tuples, one for each operator precedence level in the expression grammar; each tuple is of the form (opExpr, numTerms, rightLeftAssoc, parseAction), where:
    • opExpr is the pyparsing expression for the operator; may also be a string, which will be converted to a Literal; if numTerms is 3, opExpr is a tuple of two expressions, for the two operators separating the 3 terms
    • numTerms is the number of terms for this operator (must be 1, 2, or 3)
    • rightLeftAssoc is the indicator whether the operator is right or left associative, using the pyparsing-defined constants opAssoc.RIGHT and opAssoc.LEFT.
    • parseAction is the parse action to be associated with expressions matching this operator expression (the parse action tuple member may be omitted)
  • lpar - expression for matching left-parentheses (default=Suppress('('))
  • rpar - expression for matching right-parentheses (default=Suppress(')'))

nestedExpr(opener='(', closer=')', content=None, ignoreExpr=quotedString using single or double quotes)

source code 

Helper method for defining nested lists enclosed in opening and closing delimiters ("(" and ")" are the default).

Parameters:

  • opener - opening character for a nested list (default="("); can also be a pyparsing expression
  • closer - closing character for a nested list (default=")"); can also be a pyparsing expression
  • content - expression for items within the nested lists (default=None)
  • ignoreExpr - expression for ignoring opening and closing delimiters (default=quotedString)

If an expression is not provided for the content argument, the nested expression will capture all whitespace-delimited content between delimiters as a list of separate values.

Use the ignoreExpr argument to define expressions that may contain opening or closing characters that should not be treated as opening or closing characters for nesting, such as quotedString or a comment expression. Specify multiple expressions using an Or or MatchFirst. The default is quotedString, but if no expressions are to be ignored, then pass None for this argument.

indentedBlock(blockStatementExpr, indentStack, indent=True)

source code 

Helper method for defining space-delimited indentation blocks, such as those used to define block statements in Python source code.

Parameters:

  • blockStatementExpr - expression defining syntax of statement that is repeated within the indented block
  • indentStack - list created by caller to manage indentation stack (multiple statementWithIndentedBlock expressions within a single grammar should share a common indentStack)
  • indent - boolean indicating whether block must be indented beyond the the current level; set to False for block of left-most statements (default=True)

A valid block must contain at least one blockStatement.


Variables Details

alphanums

Value:
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'

printables

Value:
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\\
'()*+,-./:;<=>?@[\\]^_`{|}~'

unicodeString

Value:
Combine:({"u" quotedString using single or double quotes})

alphas8bit

Value:
u'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ'

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Upcase-class.html0000664000175000017500000004141112322542216023443 0ustar barrybarry pyparsing.pyparsing.Upcase
Package pyparsing :: Module pyparsing :: Class Upcase
[frames] | no frames]

Class Upcase

source code

     object --+            
              |            
  ParserElement --+        
                  |        
ParseElementEnhance --+    
                      |    
         TokenConverter --+
                          |
                         Upcase

Converter to upper case all matching tokens.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, *args)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
postParse(self, instring, loc, tokenlist) source code

Inherited from ParseElementEnhance: __str__, checkRecursion, ignore, leaveWhitespace, parseImpl, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, copy, parseFile, parseString, parseWithTabs, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setResultsName, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, *args)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

postParse(self, instring, loc, tokenlist)

source code 
Overrides: ParserElement.postParse

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.FollowedBy-class.html0000664000175000017500000004176112322542216024301 0ustar barrybarry pyparsing.pyparsing.FollowedBy
Package pyparsing :: Module pyparsing :: Class FollowedBy
[frames] | no frames]

Class FollowedBy

source code

     object --+        
              |        
  ParserElement --+    
                  |    
ParseElementEnhance --+
                      |
                     FollowedBy

Lookahead matching of the given parse expression. FollowedBy does *not* advance the parsing position within the input string, it only verifies that the specified parse expression matches at the current position. FollowedBy always returns a null token list.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, expr)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code

Inherited from ParseElementEnhance: __str__, checkRecursion, ignore, leaveWhitespace, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, copy, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setResultsName, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, expr)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.StringStart-class.html0000664000175000017500000004125112322542216024511 0ustar barrybarry pyparsing.pyparsing.StringStart
Package pyparsing :: Module pyparsing :: Class StringStart
[frames] | no frames]

Class StringStart

source code

   object --+            
            |            
ParserElement --+        
                |        
            Token --+    
                    |    
       _PositionToken --+
                        |
                       StringStart

Matches if current position is at the beginning of the parse string

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.ParseBaseException-class.html0000664000175000017500000003652012322542216025754 0ustar barrybarry pyparsing.pyparsing.ParseBaseException
Package pyparsing :: Module pyparsing :: Class ParseBaseException
[frames] | no frames]

Class ParseBaseException

source code

              object --+        
                       |        
exceptions.BaseException --+    
                           |    
        exceptions.Exception --+
                               |
                              ParseBaseException
Known Subclasses:

base exception class for all parsing runtime exceptions

Instance Methods
 
__init__(self, pstr, loc=0, msg=None, elem=None)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
__getattr__(self, aname)
supported attributes by name are:
source code
 
__str__(self)
str(x)
source code
 
__repr__(self)
repr(x)
source code
 
markInputline(self, markerString='>!<')
Extracts the exception line from the input string, and marks the location of the exception with a special symbol.
source code
 
__dir__(self) source code

Inherited from exceptions.Exception: __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __setattr__, __setstate__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

Method Details

__init__(self, pstr, loc=0, msg=None, elem=None)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

__getattr__(self, aname)
(Qualification operator)

source code 

supported attributes by name are:

  • lineno - returns the line number of the exception text
  • col - returns the column number of the exception text
  • line - returns the line containing the exception text

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

__repr__(self)
(Representation operator)

source code 

repr(x)

Overrides: object.__repr__
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.GoToColumn-class.html0000664000175000017500000004436412322542216024263 0ustar barrybarry pyparsing.pyparsing.GoToColumn
Package pyparsing :: Module pyparsing :: Class GoToColumn
[frames] | no frames]

Class GoToColumn

source code

   object --+            
            |            
ParserElement --+        
                |        
            Token --+    
                    |    
       _PositionToken --+
                        |
                       GoToColumn

Token to advance to a specific column of input text; useful for tabular report scraping.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, colno)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
preParse(self, instring, loc) source code
 
parseImpl(self, instring, loc, doActions=True) source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, colno)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

preParse(self, instring, loc)

source code 
Overrides: ParserElement.preParse

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.ZeroOrMore-class.html0000664000175000017500000005076712322542216024304 0ustar barrybarry pyparsing.pyparsing.ZeroOrMore
Package pyparsing :: Module pyparsing :: Class ZeroOrMore
[frames] | no frames]

Class ZeroOrMore

source code

     object --+        
              |        
  ParserElement --+    
                  |    
ParseElementEnhance --+
                      |
                     ZeroOrMore

Optional repetition of zero or more of the given expression.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, expr)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code
 
__str__(self)
str(x)
source code
 
setResultsName(self, name, listAllMatches=False)
Define name for referencing matching tokens as a nested attribute of the returned parse results.
source code

Inherited from ParseElementEnhance: checkRecursion, ignore, leaveWhitespace, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, copy, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, expr)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

setResultsName(self, name, listAllMatches=False)

source code 

Define name for referencing matching tokens as a nested attribute of the returned parse results. NOTE: this returns a *copy* of the original ParserElement object; this is so that the client can define a basic element, such as an integer, and reference it in multiple places with different names.

You can also set results names using the abbreviated syntax, expr("name") in place of expr.setResultsName("name") - see __call__.

Overrides: ParserElement.setResultsName
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.ParseElementEnhance-class.html0000664000175000017500000006612412322542216026101 0ustar barrybarry pyparsing.pyparsing.ParseElementEnhance
Package pyparsing :: Module pyparsing :: Class ParseElementEnhance
[frames] | no frames]

Class ParseElementEnhance

source code

   object --+    
            |    
ParserElement --+
                |
               ParseElementEnhance
Known Subclasses:

Abstract subclass of ParserElement, for combining and post-processing parsed tokens.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, expr, savelist=False)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code
 
leaveWhitespace(self)
Disables the skipping of whitespace before matching the characters in the ParserElement's defined pattern.
source code
 
ignore(self, other)
Define expression to be ignored (e.g., comments) while doing pattern matching; may be called repeatedly, to define multiple comment or other ignorable patterns.
source code
 
streamline(self) source code
 
checkRecursion(self, parseElementList) source code
 
validate(self, validateTrace=[])
Check defined expressions for valid structure, check for infinite recursive definitions.
source code
 
__str__(self)
str(x)
source code

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, copy, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setResultsName, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, expr, savelist=False)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

leaveWhitespace(self)

source code 

Disables the skipping of whitespace before matching the characters in the ParserElement's defined pattern. This is normally only used internally by the pyparsing module, but may be needed in some whitespace-sensitive grammars.

Overrides: ParserElement.leaveWhitespace
(inherited documentation)

ignore(self, other)

source code 

Define expression to be ignored (e.g., comments) while doing pattern matching; may be called repeatedly, to define multiple comment or other ignorable patterns.

Overrides: ParserElement.ignore
(inherited documentation)

streamline(self)

source code 
Overrides: ParserElement.streamline

checkRecursion(self, parseElementList)

source code 
Overrides: ParserElement.checkRecursion

validate(self, validateTrace=[])

source code 

Check defined expressions for valid structure, check for infinite recursive definitions.

Overrides: ParserElement.validate
(inherited documentation)

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.ParseExpression-class.html0000664000175000017500000007127312322542216025366 0ustar barrybarry pyparsing.pyparsing.ParseExpression
Package pyparsing :: Module pyparsing :: Class ParseExpression
[frames] | no frames]

Class ParseExpression

source code

   object --+    
            |    
ParserElement --+
                |
               ParseExpression
Known Subclasses:

Abstract subclass of ParserElement, for combining and post-processing parsed tokens.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, exprs, savelist=False)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
__getitem__(self, i) source code
 
append(self, other) source code
 
leaveWhitespace(self)
Extends leaveWhitespace defined in base class, and also invokes leaveWhitespace on all contained expressions.
source code
 
ignore(self, other)
Define expression to be ignored (e.g., comments) while doing pattern matching; may be called repeatedly, to define multiple comment or other ignorable patterns.
source code
 
__str__(self)
str(x)
source code
 
streamline(self) source code
 
setResultsName(self, name, listAllMatches=False)
Define name for referencing matching tokens as a nested attribute of the returned parse results.
source code
 
validate(self, validateTrace=[])
Check defined expressions for valid structure, check for infinite recursive definitions.
source code
 
copy(self)
Make a copy of this ParserElement.
source code

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, checkRecursion, parseFile, parseImpl, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, exprs, savelist=False)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

leaveWhitespace(self)

source code 

Extends leaveWhitespace defined in base class, and also invokes leaveWhitespace on all contained expressions.

Overrides: ParserElement.leaveWhitespace

ignore(self, other)

source code 

Define expression to be ignored (e.g., comments) while doing pattern matching; may be called repeatedly, to define multiple comment or other ignorable patterns.

Overrides: ParserElement.ignore
(inherited documentation)

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

streamline(self)

source code 
Overrides: ParserElement.streamline

setResultsName(self, name, listAllMatches=False)

source code 

Define name for referencing matching tokens as a nested attribute of the returned parse results. NOTE: this returns a *copy* of the original ParserElement object; this is so that the client can define a basic element, such as an integer, and reference it in multiple places with different names.

You can also set results names using the abbreviated syntax, expr("name") in place of expr.setResultsName("name") - see __call__.

Overrides: ParserElement.setResultsName
(inherited documentation)

validate(self, validateTrace=[])

source code 

Check defined expressions for valid structure, check for infinite recursive definitions.

Overrides: ParserElement.validate
(inherited documentation)

copy(self)

source code 

Make a copy of this ParserElement. Useful for defining different parse actions for the same parsing pattern, using copies of the original parse element.

Overrides: ParserElement.copy
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Literal-class.html0000664000175000017500000004220412322542216023620 0ustar barrybarry pyparsing.pyparsing.Literal
Package pyparsing :: Module pyparsing :: Class Literal
[frames] | no frames]

Class Literal

source code

   object --+        
            |        
ParserElement --+    
                |    
            Token --+
                    |
                   Literal
Known Subclasses:

Token to exactly match a specified string.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, matchString)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables
  __slotnames__ = []

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, matchString)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

pyparsing-2.0.3/htmldoc/module-tree.html0000664000175000017500000000755712322542216017331 0ustar barrybarry Module Hierarchy
 
[frames] | no frames]
[ Module Hierarchy | Class Hierarchy ]

Module Hierarchy

  • pyparsing.pyparsing: pyparsing module - Classes and methods to define and execute parsing grammars
pyparsing-2.0.3/htmldoc/pyparsing.pyparsing-pysrc.html0000664000175000017500000505235512322542217022276 0ustar barrybarry pyparsing.pyparsing
Package pyparsing :: Module pyparsing
[frames] | no frames]

Source Code for Module pyparsing.pyparsing

   1  # module pyparsing.py 
   2  # 
   3  # Copyright (c) 2003-2013  Paul T. McGuire 
   4  # 
   5  # Permission is hereby granted, free of charge, to any person obtaining 
   6  # a copy of this software and associated documentation files (the 
   7  # "Software"), to deal in the Software without restriction, including 
   8  # without limitation the rights to use, copy, modify, merge, publish, 
   9  # distribute, sublicense, and/or sell copies of the Software, and to 
  10  # permit persons to whom the Software is furnished to do so, subject to 
  11  # the following conditions: 
  12  # 
  13  # The above copyright notice and this permission notice shall be 
  14  # included in all copies or substantial portions of the Software. 
  15  # 
  16  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
  17  # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
  18  # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
  19  # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 
  20  # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
  21  # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
  22  # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
  23  # 
  24   
  25  __doc__ = \ 
  26  """ 
  27  pyparsing module - Classes and methods to define and execute parsing grammars 
  28   
  29  The pyparsing module is an alternative approach to creating and executing simple grammars, 
  30  vs. the traditional lex/yacc approach, or the use of regular expressions.  With pyparsing, you 
  31  don't need to learn a new syntax for defining grammars or matching expressions - the parsing module 
  32  provides a library of classes that you use to construct the grammar directly in Python. 
  33   
  34  Here is a program to parse "Hello, World!" (or any greeting of the form C{"<salutation>, <addressee>!"}):: 
  35   
  36      from pyparsing import Word, alphas 
  37   
  38      # define grammar of a greeting 
  39      greet = Word( alphas ) + "," + Word( alphas ) + "!" 
  40   
  41      hello = "Hello, World!" 
  42      print (hello, "->", greet.parseString( hello )) 
  43   
  44  The program outputs the following:: 
  45   
  46      Hello, World! -> ['Hello', ',', 'World', '!'] 
  47   
  48  The Python representation of the grammar is quite readable, owing to the self-explanatory 
  49  class names, and the use of '+', '|' and '^' operators. 
  50   
  51  The parsed results returned from C{parseString()} can be accessed as a nested list, a dictionary, or an 
  52  object with named attributes. 
  53   
  54  The pyparsing module handles some of the problems that are typically vexing when writing text parsers: 
  55   - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello  ,  World  !", etc.) 
  56   - quoted strings 
  57   - embedded comments 
  58  """ 
  59   
  60  __version__ = "2.0.2" 
  61  __versionTime__ = "13 April 2014 11:10" 
  62  __author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" 
  63   
  64  import string 
  65  from weakref import ref as wkref 
  66  import copy 
  67  import sys 
  68  import warnings 
  69  import re 
  70  import sre_constants 
  71  import collections 
  72  import pprint 
  73  #~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) 
  74   
  75  __all__ = [ 
  76  'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', 
  77  'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', 
  78  'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', 
  79  'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', 
  80  'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', 
  81  'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', 'Upcase', 
  82  'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', 
  83  'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', 
  84  'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', 
  85  'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', 
  86  'htmlComment', 'javaStyleComment', 'keepOriginalText', 'line', 'lineEnd', 'lineStart', 'lineno', 
  87  'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', 
  88  'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', 
  89  'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity',  
  90  'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', 
  91  'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', 
  92  'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 
  93  ] 
  94   
  95  PY_3 = sys.version.startswith('3') 
  96  if PY_3: 
  97      _MAX_INT = sys.maxsize 
  98      basestring = str 
  99      unichr = chr 
 100      _ustr = str 
 101   
 102      # build list of single arg builtins, that can be used as parse actions 
 103      singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] 
 104   
 105  else: 
 106      _MAX_INT = sys.maxint 
 107      range = xrange 
 108   
109 - def _ustr(obj):
110 """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries 111 str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It 112 then < returns the unicode object | encodes it with the default encoding | ... >. 113 """ 114 if isinstance(obj,unicode): 115 return obj 116 117 try: 118 # If this works, then _ustr(obj) has the same behaviour as str(obj), so 119 # it won't break any existing code. 120 return str(obj) 121 122 except UnicodeEncodeError: 123 # The Python docs (http://docs.python.org/ref/customization.html#l2h-182) 124 # state that "The return value must be a string object". However, does a 125 # unicode object (being a subclass of basestring) count as a "string 126 # object"? 127 # If so, then return a unicode object: 128 return unicode(obj)
129 # Else encode it... but how? There are many choices... :) 130 # Replace unprintables with escape codes? 131 #return unicode(obj).encode(sys.getdefaultencoding(), 'backslashreplace_errors') 132 # Replace unprintables with question marks? 133 #return unicode(obj).encode(sys.getdefaultencoding(), 'replace') 134 # ... 135 136 # build list of single arg builtins, tolerant of Python version, that can be used as parse actions 137 singleArgBuiltins = [] 138 import __builtin__ 139 for fname in "sum len sorted reversed list tuple set any all min max".split(): 140 try: 141 singleArgBuiltins.append(getattr(__builtin__,fname)) 142 except AttributeError: 143 continue 144 145 _generatorType = type((y for y in range(1))) 146
147 -def _xml_escape(data):
148 """Escape &, <, >, ", ', etc. in a string of data.""" 149 150 # ampersand must be replaced first 151 from_symbols = '&><"\'' 152 to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) 153 for from_,to_ in zip(from_symbols, to_symbols): 154 data = data.replace(from_, to_) 155 return data
156
157 -class _Constants(object):
158 pass
159 160 alphas = string.ascii_lowercase + string.ascii_uppercase 161 nums = "0123456789" 162 hexnums = nums + "ABCDEFabcdef" 163 alphanums = alphas + nums 164 _bslash = chr(92) 165 printables = "".join(c for c in string.printable if c not in string.whitespace) 166
167 -class ParseBaseException(Exception):
168 """base exception class for all parsing runtime exceptions""" 169 # Performance tuning: we construct a *lot* of these, so keep this 170 # constructor as small and fast as possible
171 - def __init__( self, pstr, loc=0, msg=None, elem=None ):
172 self.loc = loc 173 if msg is None: 174 self.msg = pstr 175 self.pstr = "" 176 else: 177 self.msg = msg 178 self.pstr = pstr 179 self.parserElement = elem
180
181 - def __getattr__( self, aname ):
182 """supported attributes by name are: 183 - lineno - returns the line number of the exception text 184 - col - returns the column number of the exception text 185 - line - returns the line containing the exception text 186 """ 187 if( aname == "lineno" ): 188 return lineno( self.loc, self.pstr ) 189 elif( aname in ("col", "column") ): 190 return col( self.loc, self.pstr ) 191 elif( aname == "line" ): 192 return line( self.loc, self.pstr ) 193 else: 194 raise AttributeError(aname)
195
196 - def __str__( self ):
197 return "%s (at char %d), (line:%d, col:%d)" % \ 198 ( self.msg, self.loc, self.lineno, self.column )
199 - def __repr__( self ):
200 return _ustr(self)
201 - def markInputline( self, markerString = ">!<" ):
202 """Extracts the exception line from the input string, and marks 203 the location of the exception with a special symbol. 204 """ 205 line_str = self.line 206 line_column = self.column - 1 207 if markerString: 208 line_str = "".join((line_str[:line_column], 209 markerString, line_str[line_column:])) 210 return line_str.strip()
211 - def __dir__(self):
212 return "loc msg pstr parserElement lineno col line " \ 213 "markInputline __str__ __repr__".split()
214
215 -class ParseException(ParseBaseException):
216 """exception thrown when parse expressions don't match class; 217 supported attributes by name are: 218 - lineno - returns the line number of the exception text 219 - col - returns the column number of the exception text 220 - line - returns the line containing the exception text 221 """ 222 pass
223
224 -class ParseFatalException(ParseBaseException):
225 """user-throwable exception thrown when inconsistent parse content 226 is found; stops all parsing immediately""" 227 pass
228
229 -class ParseSyntaxException(ParseFatalException):
230 """just like C{L{ParseFatalException}}, but thrown internally when an 231 C{L{ErrorStop<And._ErrorStop>}} ('-' operator) indicates that parsing is to stop immediately because 232 an unbacktrackable syntax error has been found"""
233 - def __init__(self, pe):
234 super(ParseSyntaxException, self).__init__( 235 pe.pstr, pe.loc, pe.msg, pe.parserElement)
236 237 #~ class ReparseException(ParseBaseException): 238 #~ """Experimental class - parse actions can raise this exception to cause 239 #~ pyparsing to reparse the input string: 240 #~ - with a modified input string, and/or 241 #~ - with a modified start location 242 #~ Set the values of the ReparseException in the constructor, and raise the 243 #~ exception in a parse action to cause pyparsing to use the new string/location. 244 #~ Setting the values as None causes no change to be made. 245 #~ """ 246 #~ def __init_( self, newstring, restartLoc ): 247 #~ self.newParseText = newstring 248 #~ self.reparseLoc = restartLoc 249
250 -class RecursiveGrammarException(Exception):
251 """exception thrown by C{validate()} if the grammar could be improperly recursive"""
252 - def __init__( self, parseElementList ):
253 self.parseElementTrace = parseElementList
254
255 - def __str__( self ):
256 return "RecursiveGrammarException: %s" % self.parseElementTrace
257
258 -class _ParseResultsWithOffset(object):
259 - def __init__(self,p1,p2):
260 self.tup = (p1,p2)
261 - def __getitem__(self,i):
262 return self.tup[i]
263 - def __repr__(self):
264 return repr(self.tup)
265 - def setOffset(self,i):
266 self.tup = (self.tup[0],i)
267
268 -class ParseResults(object):
269 """Structured parse results, to provide multiple means of access to the parsed data: 270 - as a list (C{len(results)}) 271 - by list index (C{results[0], results[1]}, etc.) 272 - by attribute (C{results.<resultsName>}) 273 """
274 - def __new__(cls, toklist, name=None, asList=True, modal=True ):
275 if isinstance(toklist, cls): 276 return toklist 277 retobj = object.__new__(cls) 278 retobj.__doinit = True 279 return retobj
280 281 # Performance tuning: we construct a *lot* of these, so keep this 282 # constructor as small and fast as possible
283 - def __init__( self, toklist, name=None, asList=True, modal=True, isinstance=isinstance ):
284 if self.__doinit: 285 self.__doinit = False 286 self.__name = None 287 self.__parent = None 288 self.__accumNames = {} 289 if isinstance(toklist, list): 290 self.__toklist = toklist[:] 291 elif isinstance(toklist, _generatorType): 292 self.__toklist = list(toklist) 293 else: 294 self.__toklist = [toklist] 295 self.__tokdict = dict() 296 297 if name is not None and name: 298 if not modal: 299 self.__accumNames[name] = 0 300 if isinstance(name,int): 301 name = _ustr(name) # will always return a str, but use _ustr for consistency 302 self.__name = name 303 if not toklist in (None,'',[]): 304 if isinstance(toklist,basestring): 305 toklist = [ toklist ] 306 if asList: 307 if isinstance(toklist,ParseResults): 308 self[name] = _ParseResultsWithOffset(toklist.copy(),0) 309 else: 310 self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) 311 self[name].__name = name 312 else: 313 try: 314 self[name] = toklist[0] 315 except (KeyError,TypeError,IndexError): 316 self[name] = toklist
317
318 - def __getitem__( self, i ):
319 if isinstance( i, (int,slice) ): 320 return self.__toklist[i] 321 else: 322 if i not in self.__accumNames: 323 return self.__tokdict[i][-1][0] 324 else: 325 return ParseResults([ v[0] for v in self.__tokdict[i] ])
326
327 - def __setitem__( self, k, v, isinstance=isinstance ):
328 if isinstance(v,_ParseResultsWithOffset): 329 self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] 330 sub = v[0] 331 elif isinstance(k,int): 332 self.__toklist[k] = v 333 sub = v 334 else: 335 self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] 336 sub = v 337 if isinstance(sub,ParseResults): 338 sub.__parent = wkref(self)
339
340 - def __delitem__( self, i ):
341 if isinstance(i,(int,slice)): 342 mylen = len( self.__toklist ) 343 del self.__toklist[i] 344 345 # convert int to slice 346 if isinstance(i, int): 347 if i < 0: 348 i += mylen 349 i = slice(i, i+1) 350 # get removed indices 351 removed = list(range(*i.indices(mylen))) 352 removed.reverse() 353 # fixup indices in token dictionary 354 for name in self.__tokdict: 355 occurrences = self.__tokdict[name] 356 for j in removed: 357 for k, (value, position) in enumerate(occurrences): 358 occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) 359 else: 360 del self.__tokdict[i]
361
362 - def __contains__( self, k ):
363 return k in self.__tokdict
364
365 - def __len__( self ): return len( self.__toklist )
366 - def __bool__(self): return len( self.__toklist ) > 0
367 __nonzero__ = __bool__
368 - def __iter__( self ): return iter( self.__toklist )
369 - def __reversed__( self ): return iter( self.__toklist[::-1] )
370 - def iterkeys( self ):
371 """Returns all named result keys.""" 372 if hasattr(self.__tokdict, "iterkeys"): 373 return self.__tokdict.iterkeys() 374 else: 375 return iter(self.__tokdict)
376
377 - def itervalues( self ):
378 """Returns all named result values.""" 379 return (self[k] for k in self.iterkeys())
380
381 - def iteritems( self ):
382 return ((k, self[k]) for k in self.iterkeys())
383 384 if PY_3: 385 keys = iterkeys 386 values = itervalues 387 items = iteritems 388 else:
389 - def keys( self ):
390 """Returns all named result keys.""" 391 return list(self.iterkeys())
392
393 - def values( self ):
394 """Returns all named result values.""" 395 return list(self.itervalues())
396
397 - def items( self ):
398 """Returns all named result keys and values as a list of tuples.""" 399 return list(self.iteritems())
400
401 - def haskeys( self ):
402 """Since keys() returns an iterator, this method is helpful in bypassing 403 code that looks for the existence of any defined results names.""" 404 return bool(self.__tokdict)
405
406 - def pop( self, *args, **kwargs):
407 """Removes and returns item at specified index (default=last). 408 Supports both list and dict semantics for pop(). If passed no 409 argument or an integer argument, it will use list semantics 410 and pop tokens from the list of parsed tokens. If passed a 411 non-integer argument (most likely a string), it will use dict 412 semantics and pop the corresponding value from any defined 413 results names. A second default return value argument is 414 supported, just as in dict.pop().""" 415 if not args: 416 args = [-1] 417 if 'default' in kwargs: 418 args.append(kwargs['default']) 419 if (isinstance(args[0], int) or 420 len(args) == 1 or 421 args[0] in self): 422 ret = self[index] 423 del self[index] 424 return ret 425 else: 426 defaultvalue = args[1] 427 return defaultvalue
428
429 - def get(self, key, defaultValue=None):
430 """Returns named result matching the given key, or if there is no 431 such name, then returns the given C{defaultValue} or C{None} if no 432 C{defaultValue} is specified.""" 433 if key in self: 434 return self[key] 435 else: 436 return defaultValue
437
438 - def insert( self, index, insStr ):
439 """Inserts new element at location index in the list of parsed tokens.""" 440 self.__toklist.insert(index, insStr) 441 # fixup indices in token dictionary 442 for name in self.__tokdict: 443 occurrences = self.__tokdict[name] 444 for k, (value, position) in enumerate(occurrences): 445 occurrences[k] = _ParseResultsWithOffset(value, position + (position > index))
446
447 - def append( self, item ):
448 """Add single element to end of ParseResults list of elements.""" 449 self.__toklist.append(item)
450
451 - def extend( self, itemseq ):
452 """Add sequence of elements to end of ParseResults list of elements.""" 453 if isinstance(itemseq, ParseResults): 454 self += itemseq 455 else: 456 self.__toklist.extend(itemseq)
457
458 - def clear( self ):
459 """Clear all elements and results names.""" 460 del self.__toklist[:] 461 self.__tokdict.clear()
462
463 - def __getattr__( self, name ):
464 try: 465 return self[name] 466 except KeyError: 467 return "" 468 469 if name in self.__tokdict: 470 if name not in self.__accumNames: 471 return self.__tokdict[name][-1][0] 472 else: 473 return ParseResults([ v[0] for v in self.__tokdict[name] ]) 474 else: 475 return ""
476
477 - def __add__( self, other ):
478 ret = self.copy() 479 ret += other 480 return ret
481
482 - def __iadd__( self, other ):
483 if other.__tokdict: 484 offset = len(self.__toklist) 485 addoffset = ( lambda a: (a<0 and offset) or (a+offset) ) 486 otheritems = other.__tokdict.items() 487 otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) 488 for (k,vlist) in otheritems for v in vlist] 489 for k,v in otherdictitems: 490 self[k] = v 491 if isinstance(v[0],ParseResults): 492 v[0].__parent = wkref(self) 493 494 self.__toklist += other.__toklist 495 self.__accumNames.update( other.__accumNames ) 496 return self
497
498 - def __radd__(self, other):
499 if isinstance(other,int) and other == 0: 500 return self.copy()
501
502 - def __repr__( self ):
503 return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) )
504
505 - def __str__( self ):
506 out = [] 507 for i in self.__toklist: 508 if isinstance(i, ParseResults): 509 out.append(_ustr(i)) 510 else: 511 out.append(repr(i)) 512 return '[' + ', '.join(out) + ']'
513
514 - def _asStringList( self, sep='' ):
515 out = [] 516 for item in self.__toklist: 517 if out and sep: 518 out.append(sep) 519 if isinstance( item, ParseResults ): 520 out += item._asStringList() 521 else: 522 out.append( _ustr(item) ) 523 return out
524
525 - def asList( self ):
526 """Returns the parse results as a nested list of matching tokens, all converted to strings.""" 527 out = [] 528 for res in self.__toklist: 529 if isinstance(res,ParseResults): 530 out.append( res.asList() ) 531 else: 532 out.append( res ) 533 return out
534
535 - def asDict( self ):
536 """Returns the named parse results as dictionary.""" 537 if PY_3: 538 return dict( self.items() ) 539 else: 540 return dict( self.iteritems() )
541
542 - def copy( self ):
543 """Returns a new copy of a C{ParseResults} object.""" 544 ret = ParseResults( self.__toklist ) 545 ret.__tokdict = self.__tokdict.copy() 546 ret.__parent = self.__parent 547 ret.__accumNames.update( self.__accumNames ) 548 ret.__name = self.__name 549 return ret
550
551 - def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ):
552 """Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.""" 553 nl = "\n" 554 out = [] 555 namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() 556 for v in vlist) 557 nextLevelIndent = indent + " " 558 559 # collapse out indents if formatting is not desired 560 if not formatted: 561 indent = "" 562 nextLevelIndent = "" 563 nl = "" 564 565 selfTag = None 566 if doctag is not None: 567 selfTag = doctag 568 else: 569 if self.__name: 570 selfTag = self.__name 571 572 if not selfTag: 573 if namedItemsOnly: 574 return "" 575 else: 576 selfTag = "ITEM" 577 578 out += [ nl, indent, "<", selfTag, ">" ] 579 580 worklist = self.__toklist 581 for i,res in enumerate(worklist): 582 if isinstance(res,ParseResults): 583 if i in namedItems: 584 out += [ res.asXML(namedItems[i], 585 namedItemsOnly and doctag is None, 586 nextLevelIndent, 587 formatted)] 588 else: 589 out += [ res.asXML(None, 590 namedItemsOnly and doctag is None, 591 nextLevelIndent, 592 formatted)] 593 else: 594 # individual token, see if there is a name for it 595 resTag = None 596 if i in namedItems: 597 resTag = namedItems[i] 598 if not resTag: 599 if namedItemsOnly: 600 continue 601 else: 602 resTag = "ITEM" 603 xmlBodyText = _xml_escape(_ustr(res)) 604 out += [ nl, nextLevelIndent, "<", resTag, ">", 605 xmlBodyText, 606 "</", resTag, ">" ] 607 608 out += [ nl, indent, "</", selfTag, ">" ] 609 return "".join(out)
610
611 - def __lookup(self,sub):
612 for k,vlist in self.__tokdict.items(): 613 for v,loc in vlist: 614 if sub is v: 615 return k 616 return None
617
618 - def getName(self):
619 """Returns the results name for this token expression.""" 620 if self.__name: 621 return self.__name 622 elif self.__parent: 623 par = self.__parent() 624 if par: 625 return par.__lookup(self) 626 else: 627 return None 628 elif (len(self) == 1 and 629 len(self.__tokdict) == 1 and 630 self.__tokdict.values()[0][0][1] in (0,-1)): 631 return self.__tokdict.keys()[0] 632 else: 633 return None
634
635 - def dump(self,indent='',depth=0):
636 """Diagnostic method for listing out the contents of a C{ParseResults}. 637 Accepts an optional C{indent} argument so that this string can be embedded 638 in a nested display of other data.""" 639 out = [] 640 out.append( indent+_ustr(self.asList()) ) 641 items = sorted(self.items()) 642 for k,v in items: 643 if out: 644 out.append('\n') 645 out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) 646 if isinstance(v,ParseResults): 647 if v.haskeys(): 648 out.append( v.dump(indent,depth+1) ) 649 else: 650 out.append(_ustr(v)) 651 else: 652 out.append(_ustr(v)) 653 return "".join(out)
654
655 - def pprint(self, *args, **kwargs):
656 """Pretty-printer for parsed results as a list, using the C{pprint} module. 657 Accepts additional positional or keyword args as defined for the 658 C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint})""" 659 pprint.pprint(self.asList(), *args, **kwargs)
660 661 # add support for pickle protocol
662 - def __getstate__(self):
663 return ( self.__toklist, 664 ( self.__tokdict.copy(), 665 self.__parent is not None and self.__parent() or None, 666 self.__accumNames, 667 self.__name ) )
668
669 - def __setstate__(self,state):
670 self.__toklist = state[0] 671 (self.__tokdict, 672 par, 673 inAccumNames, 674 self.__name) = state[1] 675 self.__accumNames = {} 676 self.__accumNames.update(inAccumNames) 677 if par is not None: 678 self.__parent = wkref(par) 679 else: 680 self.__parent = None
681
682 - def __dir__(self):
683 return dir(super(ParseResults,self)) + list(self.keys())
684 685 collections.MutableMapping.register(ParseResults) 686
687 -def col (loc,strg):
688 """Returns current column within a string, counting newlines as line separators. 689 The first column is number 1. 690 691 Note: the default parsing behavior is to expand tabs in the input string 692 before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information 693 on parsing strings containing C{<TAB>}s, and suggested methods to maintain a 694 consistent view of the parsed string, the parse location, and line and column 695 positions within the parsed string. 696 """ 697 return (loc<len(strg) and strg[loc] == '\n') and 1 or loc - strg.rfind("\n", 0, loc)
698
699 -def lineno(loc,strg):
700 """Returns current line number within a string, counting newlines as line separators. 701 The first line is number 1. 702 703 Note: the default parsing behavior is to expand tabs in the input string 704 before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information 705 on parsing strings containing C{<TAB>}s, and suggested methods to maintain a 706 consistent view of the parsed string, the parse location, and line and column 707 positions within the parsed string. 708 """ 709 return strg.count("\n",0,loc) + 1
710
711 -def line( loc, strg ):
712 """Returns the line of text containing loc within a string, counting newlines as line separators. 713 """ 714 lastCR = strg.rfind("\n", 0, loc) 715 nextCR = strg.find("\n", loc) 716 if nextCR >= 0: 717 return strg[lastCR+1:nextCR] 718 else: 719 return strg[lastCR+1:]
720
721 -def _defaultStartDebugAction( instring, loc, expr ):
722 print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )))
723
724 -def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ):
725 print ("Matched " + _ustr(expr) + " -> " + str(toks.asList()))
726
727 -def _defaultExceptionDebugAction( instring, loc, expr, exc ):
728 print ("Exception raised:" + _ustr(exc))
729
730 -def nullDebugAction(*args):
731 """'Do-nothing' debug action, to suppress debugging output during parsing.""" 732 pass
733 734 # Only works on Python 3.x - nonlocal is toxic to Python 2 installs 735 #~ 'decorator to trim function calls to match the arity of the target' 736 #~ def _trim_arity(func, maxargs=3): 737 #~ if func in singleArgBuiltins: 738 #~ return lambda s,l,t: func(t) 739 #~ limit = 0 740 #~ foundArity = False 741 #~ def wrapper(*args): 742 #~ nonlocal limit,foundArity 743 #~ while 1: 744 #~ try: 745 #~ ret = func(*args[limit:]) 746 #~ foundArity = True 747 #~ return ret 748 #~ except TypeError: 749 #~ if limit == maxargs or foundArity: 750 #~ raise 751 #~ limit += 1 752 #~ continue 753 #~ return wrapper 754 755 # this version is Python 2.x-3.x cross-compatible 756 'decorator to trim function calls to match the arity of the target'
757 -def _trim_arity(func, maxargs=2):
758 if func in singleArgBuiltins: 759 return lambda s,l,t: func(t) 760 limit = [0] 761 foundArity = [False] 762 def wrapper(*args): 763 while 1: 764 try: 765 ret = func(*args[limit[0]:]) 766 foundArity[0] = True 767 return ret 768 except TypeError: 769 if limit[0] <= maxargs and not foundArity[0]: 770 limit[0] += 1 771 continue 772 raise
773 return wrapper
774
775 -class ParserElement(object):
776 """Abstract base level parser element class.""" 777 DEFAULT_WHITE_CHARS = " \n\t\r" 778 verbose_stacktrace = False 779
780 - def setDefaultWhitespaceChars( chars ):
781 """Overrides the default whitespace chars 782 """ 783 ParserElement.DEFAULT_WHITE_CHARS = chars
784 setDefaultWhitespaceChars = staticmethod(setDefaultWhitespaceChars) 785
786 - def inlineLiteralsUsing(cls):
787 """ 788 Set class to be used for inclusion of string literals into a parser. 789 """ 790 ParserElement.literalStringClass = cls
791 inlineLiteralsUsing = staticmethod(inlineLiteralsUsing) 792
793 - def __init__( self, savelist=False ):
794 self.parseAction = list() 795 self.failAction = None 796 #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall 797 self.strRepr = None 798 self.resultsName = None 799 self.saveAsList = savelist 800 self.skipWhitespace = True 801 self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS 802 self.copyDefaultWhiteChars = True 803 self.mayReturnEmpty = False # used when checking for left-recursion 804 self.keepTabs = False 805 self.ignoreExprs = list() 806 self.debug = False 807 self.streamlined = False 808 self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index 809 self.errmsg = "" 810 self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) 811 self.debugActions = ( None, None, None ) #custom debug actions 812 self.re = None 813 self.callPreparse = True # used to avoid redundant calls to preParse 814 self.callDuringTry = False
815
816 - def copy( self ):
817 """Make a copy of this C{ParserElement}. Useful for defining different parse actions 818 for the same parsing pattern, using copies of the original parse element.""" 819 cpy = copy.copy( self ) 820 cpy.parseAction = self.parseAction[:] 821 cpy.ignoreExprs = self.ignoreExprs[:] 822 if self.copyDefaultWhiteChars: 823 cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS 824 return cpy
825
826 - def setName( self, name ):
827 """Define name for this expression, for use in debugging.""" 828 self.name = name 829 self.errmsg = "Expected " + self.name 830 if hasattr(self,"exception"): 831 self.exception.msg = self.errmsg 832 return self
833
834 - def setResultsName( self, name, listAllMatches=False ):
835 """Define name for referencing matching tokens as a nested attribute 836 of the returned parse results. 837 NOTE: this returns a *copy* of the original C{ParserElement} object; 838 this is so that the client can define a basic element, such as an 839 integer, and reference it in multiple places with different names. 840 841 You can also set results names using the abbreviated syntax, 842 C{expr("name")} in place of C{expr.setResultsName("name")} - 843 see L{I{__call__}<__call__>}. 844 """ 845 newself = self.copy() 846 if name.endswith("*"): 847 name = name[:-1] 848 listAllMatches=True 849 newself.resultsName = name 850 newself.modalResults = not listAllMatches 851 return newself
852
853 - def setBreak(self,breakFlag = True):
854 """Method to invoke the Python pdb debugger when this element is 855 about to be parsed. Set C{breakFlag} to True to enable, False to 856 disable. 857 """ 858 if breakFlag: 859 _parseMethod = self._parse 860 def breaker(instring, loc, doActions=True, callPreParse=True): 861 import pdb 862 pdb.set_trace() 863 return _parseMethod( instring, loc, doActions, callPreParse )
864 breaker._originalParseMethod = _parseMethod 865 self._parse = breaker 866 else: 867 if hasattr(self._parse,"_originalParseMethod"): 868 self._parse = self._parse._originalParseMethod 869 return self
870
871 - def setParseAction( self, *fns, **kwargs ):
872 """Define action to perform when successfully matching parse element definition. 873 Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, 874 C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: 875 - s = the original string being parsed (see note below) 876 - loc = the location of the matching substring 877 - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object 878 If the functions in fns modify the tokens, they can return them as the return 879 value from fn, and the modified list of tokens will replace the original. 880 Otherwise, fn does not need to return any value. 881 882 Note: the default parsing behavior is to expand tabs in the input string 883 before starting the parsing process. See L{I{parseString}<parseString>} for more information 884 on parsing strings containing C{<TAB>}s, and suggested methods to maintain a 885 consistent view of the parsed string, the parse location, and line and column 886 positions within the parsed string. 887 """ 888 self.parseAction = list(map(_trim_arity, list(fns))) 889 self.callDuringTry = ("callDuringTry" in kwargs and kwargs["callDuringTry"]) 890 return self
891
892 - def addParseAction( self, *fns, **kwargs ):
893 """Add parse action to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}.""" 894 self.parseAction += list(map(_trim_arity, list(fns))) 895 self.callDuringTry = self.callDuringTry or ("callDuringTry" in kwargs and kwargs["callDuringTry"]) 896 return self
897
898 - def setFailAction( self, fn ):
899 """Define action to perform if parsing fails at this expression. 900 Fail acton fn is a callable function that takes the arguments 901 C{fn(s,loc,expr,err)} where: 902 - s = string being parsed 903 - loc = location where expression match was attempted and failed 904 - expr = the parse expression that failed 905 - err = the exception thrown 906 The function returns no value. It may throw C{L{ParseFatalException}} 907 if it is desired to stop parsing immediately.""" 908 self.failAction = fn 909 return self
910
911 - def _skipIgnorables( self, instring, loc ):
912 exprsFound = True 913 while exprsFound: 914 exprsFound = False 915 for e in self.ignoreExprs: 916 try: 917 while 1: 918 loc,dummy = e._parse( instring, loc ) 919 exprsFound = True 920 except ParseException: 921 pass 922 return loc
923
924 - def preParse( self, instring, loc ):
925 if self.ignoreExprs: 926 loc = self._skipIgnorables( instring, loc ) 927 928 if self.skipWhitespace: 929 wt = self.whiteChars 930 instrlen = len(instring) 931 while loc < instrlen and instring[loc] in wt: 932 loc += 1 933 934 return loc
935
936 - def parseImpl( self, instring, loc, doActions=True ):
937 return loc, []
938
939 - def postParse( self, instring, loc, tokenlist ):
940 return tokenlist
941 942 #~ @profile
943 - def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ):
944 debugging = ( self.debug ) #and doActions ) 945 946 if debugging or self.failAction: 947 #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) 948 if (self.debugActions[0] ): 949 self.debugActions[0]( instring, loc, self ) 950 if callPreParse and self.callPreparse: 951 preloc = self.preParse( instring, loc ) 952 else: 953 preloc = loc 954 tokensStart = preloc 955 try: 956 try: 957 loc,tokens = self.parseImpl( instring, preloc, doActions ) 958 except IndexError: 959 raise ParseException( instring, len(instring), self.errmsg, self ) 960 except ParseBaseException as err: 961 #~ print ("Exception raised:", err) 962 if self.debugActions[2]: 963 self.debugActions[2]( instring, tokensStart, self, err ) 964 if self.failAction: 965 self.failAction( instring, tokensStart, self, err ) 966 raise 967 else: 968 if callPreParse and self.callPreparse: 969 preloc = self.preParse( instring, loc ) 970 else: 971 preloc = loc 972 tokensStart = preloc 973 if self.mayIndexError or loc >= len(instring): 974 try: 975 loc,tokens = self.parseImpl( instring, preloc, doActions ) 976 except IndexError: 977 raise ParseException( instring, len(instring), self.errmsg, self ) 978 else: 979 loc,tokens = self.parseImpl( instring, preloc, doActions ) 980 981 tokens = self.postParse( instring, loc, tokens ) 982 983 retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) 984 if self.parseAction and (doActions or self.callDuringTry): 985 if debugging: 986 try: 987 for fn in self.parseAction: 988 tokens = fn( instring, tokensStart, retTokens ) 989 if tokens is not None: 990 retTokens = ParseResults( tokens, 991 self.resultsName, 992 asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), 993 modal=self.modalResults ) 994 except ParseBaseException as err: 995 #~ print "Exception raised in user parse action:", err 996 if (self.debugActions[2] ): 997 self.debugActions[2]( instring, tokensStart, self, err ) 998 raise 999 else: 1000 for fn in self.parseAction: 1001 tokens = fn( instring, tokensStart, retTokens ) 1002 if tokens is not None: 1003 retTokens = ParseResults( tokens, 1004 self.resultsName, 1005 asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), 1006 modal=self.modalResults ) 1007 1008 if debugging: 1009 #~ print ("Matched",self,"->",retTokens.asList()) 1010 if (self.debugActions[1] ): 1011 self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) 1012 1013 return loc, retTokens
1014
1015 - def tryParse( self, instring, loc ):
1016 try: 1017 return self._parse( instring, loc, doActions=False )[0] 1018 except ParseFatalException: 1019 raise ParseException( instring, loc, self.errmsg, self)
1020 1021 # this method gets repeatedly called during backtracking with the same arguments - 1022 # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression
1023 - def _parseCache( self, instring, loc, doActions=True, callPreParse=True ):
1024 lookup = (self,instring,loc,callPreParse,doActions) 1025 if lookup in ParserElement._exprArgCache: 1026 value = ParserElement._exprArgCache[ lookup ] 1027 if isinstance(value, Exception): 1028 raise value 1029 return (value[0],value[1].copy()) 1030 else: 1031 try: 1032 value = self._parseNoCache( instring, loc, doActions, callPreParse ) 1033 ParserElement._exprArgCache[ lookup ] = (value[0],value[1].copy()) 1034 return value 1035 except ParseBaseException as pe: 1036 pe.__traceback__ = None 1037 ParserElement._exprArgCache[ lookup ] = pe 1038 raise
1039 1040 _parse = _parseNoCache 1041 1042 # argument cache for optimizing repeated calls when backtracking through recursive expressions 1043 _exprArgCache = {}
1044 - def resetCache():
1046 resetCache = staticmethod(resetCache) 1047 1048 _packratEnabled = False
1049 - def enablePackrat():
1050 """Enables "packrat" parsing, which adds memoizing to the parsing logic. 1051 Repeated parse attempts at the same string location (which happens 1052 often in many complex grammars) can immediately return a cached value, 1053 instead of re-executing parsing/validating code. Memoizing is done of 1054 both valid results and parsing exceptions. 1055 1056 This speedup may break existing programs that use parse actions that 1057 have side-effects. For this reason, packrat parsing is disabled when 1058 you first import pyparsing. To activate the packrat feature, your 1059 program must call the class method C{ParserElement.enablePackrat()}. If 1060 your program uses C{psyco} to "compile as you go", you must call 1061 C{enablePackrat} before calling C{psyco.full()}. If you do not do this, 1062 Python will crash. For best results, call C{enablePackrat()} immediately 1063 after importing pyparsing. 1064 """ 1065 if not ParserElement._packratEnabled: 1066 ParserElement._packratEnabled = True 1067 ParserElement._parse = ParserElement._parseCache
1068 enablePackrat = staticmethod(enablePackrat) 1069
1070 - def parseString( self, instring, parseAll=False ):
1071 """Execute the parse expression with the given string. 1072 This is the main interface to the client code, once the complete 1073 expression has been built. 1074 1075 If you want the grammar to require that the entire input string be 1076 successfully parsed, then set C{parseAll} to True (equivalent to ending 1077 the grammar with C{L{StringEnd()}}). 1078 1079 Note: C{parseString} implicitly calls C{expandtabs()} on the input string, 1080 in order to report proper column numbers in parse actions. 1081 If the input string contains tabs and 1082 the grammar uses parse actions that use the C{loc} argument to index into the 1083 string being parsed, you can ensure you have a consistent view of the input 1084 string by: 1085 - calling C{parseWithTabs} on your grammar before calling C{parseString} 1086 (see L{I{parseWithTabs}<parseWithTabs>}) 1087 - define your parse action using the full C{(s,loc,toks)} signature, and 1088 reference the input string using the parse action's C{s} argument 1089 - explictly expand the tabs in your input string before calling 1090 C{parseString} 1091 """ 1092 ParserElement.resetCache() 1093 if not self.streamlined: 1094 self.streamline() 1095 #~ self.saveAsList = True 1096 for e in self.ignoreExprs: 1097 e.streamline() 1098 if not self.keepTabs: 1099 instring = instring.expandtabs() 1100 try: 1101 loc, tokens = self._parse( instring, 0 ) 1102 if parseAll: 1103 loc = self.preParse( instring, loc ) 1104 se = Empty() + StringEnd() 1105 se._parse( instring, loc ) 1106 except ParseBaseException as exc: 1107 if ParserElement.verbose_stacktrace: 1108 raise 1109 else: 1110 # catch and re-raise exception from here, clears out pyparsing internal stack trace 1111 raise exc 1112 else: 1113 return tokens
1114
1115 - def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ):
1116 """Scan the input string for expression matches. Each match will return the 1117 matching tokens, start location, and end location. May be called with optional 1118 C{maxMatches} argument, to clip scanning after 'n' matches are found. If 1119 C{overlap} is specified, then overlapping matches will be reported. 1120 1121 Note that the start and end locations are reported relative to the string 1122 being parsed. See L{I{parseString}<parseString>} for more information on parsing 1123 strings with embedded tabs.""" 1124 if not self.streamlined: 1125 self.streamline() 1126 for e in self.ignoreExprs: 1127 e.streamline() 1128 1129 if not self.keepTabs: 1130 instring = _ustr(instring).expandtabs() 1131 instrlen = len(instring) 1132 loc = 0 1133 preparseFn = self.preParse 1134 parseFn = self._parse 1135 ParserElement.resetCache() 1136 matches = 0 1137 try: 1138 while loc <= instrlen and matches < maxMatches: 1139 try: 1140 preloc = preparseFn( instring, loc ) 1141 nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) 1142 except ParseException: 1143 loc = preloc+1 1144 else: 1145 if nextLoc > loc: 1146 matches += 1 1147 yield tokens, preloc, nextLoc 1148 if overlap: 1149 nextloc = preparseFn( instring, loc ) 1150 if nextloc > loc: 1151 loc = nextLoc 1152 else: 1153 loc += 1 1154 else: 1155 loc = nextLoc 1156 else: 1157 loc = preloc+1 1158 except ParseBaseException as exc: 1159 if ParserElement.verbose_stacktrace: 1160 raise 1161 else: 1162 # catch and re-raise exception from here, clears out pyparsing internal stack trace 1163 raise exc
1164
1165 - def transformString( self, instring ):
1166 """Extension to C{L{scanString}}, to modify matching text with modified tokens that may 1167 be returned from a parse action. To use C{transformString}, define a grammar and 1168 attach a parse action to it that modifies the returned token list. 1169 Invoking C{transformString()} on a target string will then scan for matches, 1170 and replace the matched text patterns according to the logic in the parse 1171 action. C{transformString()} returns the resulting transformed string.""" 1172 out = [] 1173 lastE = 0 1174 # force preservation of <TAB>s, to minimize unwanted transformation of string, and to 1175 # keep string locs straight between transformString and scanString 1176 self.keepTabs = True 1177 try: 1178 for t,s,e in self.scanString( instring ): 1179 out.append( instring[lastE:s] ) 1180 if t: 1181 if isinstance(t,ParseResults): 1182 out += t.asList() 1183 elif isinstance(t,list): 1184 out += t 1185 else: 1186 out.append(t) 1187 lastE = e 1188 out.append(instring[lastE:]) 1189 out = [o for o in out if o] 1190 return "".join(map(_ustr,_flatten(out))) 1191 except ParseBaseException as exc: 1192 if ParserElement.verbose_stacktrace: 1193 raise 1194 else: 1195 # catch and re-raise exception from here, clears out pyparsing internal stack trace 1196 raise exc
1197
1198 - def searchString( self, instring, maxMatches=_MAX_INT ):
1199 """Another extension to C{L{scanString}}, simplifying the access to the tokens found 1200 to match the given parse expression. May be called with optional 1201 C{maxMatches} argument, to clip searching after 'n' matches are found. 1202 """ 1203 try: 1204 return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) 1205 except ParseBaseException as exc: 1206 if ParserElement.verbose_stacktrace: 1207 raise 1208 else: 1209 # catch and re-raise exception from here, clears out pyparsing internal stack trace 1210 raise exc
1211
1212 - def __add__(self, other ):
1213 """Implementation of + operator - returns C{L{And}}""" 1214 if isinstance( other, basestring ): 1215 other = ParserElement.literalStringClass( other ) 1216 if not isinstance( other, ParserElement ): 1217 warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), 1218 SyntaxWarning, stacklevel=2) 1219 return None 1220 return And( [ self, other ] )
1221
1222 - def __radd__(self, other ):
1223 """Implementation of + operator when left operand is not a C{L{ParserElement}}""" 1224 if isinstance( other, basestring ): 1225 other = ParserElement.literalStringClass( other ) 1226 if not isinstance( other, ParserElement ): 1227 warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), 1228 SyntaxWarning, stacklevel=2) 1229 return None 1230 return other + self
1231
1232 - def __sub__(self, other):
1233 """Implementation of - operator, returns C{L{And}} with error stop""" 1234 if isinstance( other, basestring ): 1235 other = ParserElement.literalStringClass( other ) 1236 if not isinstance( other, ParserElement ): 1237 warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), 1238 SyntaxWarning, stacklevel=2) 1239 return None 1240 return And( [ self, And._ErrorStop(), other ] )
1241
1242 - def __rsub__(self, other ):
1243 """Implementation of - operator when left operand is not a C{L{ParserElement}}""" 1244 if isinstance( other, basestring ): 1245 other = ParserElement.literalStringClass( other ) 1246 if not isinstance( other, ParserElement ): 1247 warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), 1248 SyntaxWarning, stacklevel=2) 1249 return None 1250 return other - self
1251
1252 - def __mul__(self,other):
1253 """Implementation of * operator, allows use of C{expr * 3} in place of 1254 C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer 1255 tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples 1256 may also include C{None} as in: 1257 - C{expr*(n,None)} or C{expr*(n,)} is equivalent 1258 to C{expr*n + L{ZeroOrMore}(expr)} 1259 (read as "at least n instances of C{expr}") 1260 - C{expr*(None,n)} is equivalent to C{expr*(0,n)} 1261 (read as "0 to n instances of C{expr}") 1262 - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} 1263 - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} 1264 1265 Note that C{expr*(None,n)} does not raise an exception if 1266 more than n exprs exist in the input stream; that is, 1267 C{expr*(None,n)} does not enforce a maximum number of expr 1268 occurrences. If this behavior is desired, then write 1269 C{expr*(None,n) + ~expr} 1270 1271 """ 1272 if isinstance(other,int): 1273 minElements, optElements = other,0 1274 elif isinstance(other,tuple): 1275 other = (other + (None, None))[:2] 1276 if other[0] is None: 1277 other = (0, other[1]) 1278 if isinstance(other[0],int) and other[1] is None: 1279 if other[0] == 0: 1280 return ZeroOrMore(self) 1281 if other[0] == 1: 1282 return OneOrMore(self) 1283 else: 1284 return self*other[0] + ZeroOrMore(self) 1285 elif isinstance(other[0],int) and isinstance(other[1],int): 1286 minElements, optElements = other 1287 optElements -= minElements 1288 else: 1289 raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) 1290 else: 1291 raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) 1292 1293 if minElements < 0: 1294 raise ValueError("cannot multiply ParserElement by negative value") 1295 if optElements < 0: 1296 raise ValueError("second tuple value must be greater or equal to first tuple value") 1297 if minElements == optElements == 0: 1298 raise ValueError("cannot multiply ParserElement by 0 or (0,0)") 1299 1300 if (optElements): 1301 def makeOptionalList(n): 1302 if n>1: 1303 return Optional(self + makeOptionalList(n-1)) 1304 else: 1305 return Optional(self)
1306 if minElements: 1307 if minElements == 1: 1308 ret = self + makeOptionalList(optElements) 1309 else: 1310 ret = And([self]*minElements) + makeOptionalList(optElements) 1311 else: 1312 ret = makeOptionalList(optElements) 1313 else: 1314 if minElements == 1: 1315 ret = self 1316 else: 1317 ret = And([self]*minElements) 1318 return ret
1319
1320 - def __rmul__(self, other):
1321 return self.__mul__(other)
1322
1323 - def __or__(self, other ):
1324 """Implementation of | operator - returns C{L{MatchFirst}}""" 1325 if isinstance( other, basestring ): 1326 other = ParserElement.literalStringClass( other ) 1327 if not isinstance( other, ParserElement ): 1328 warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), 1329 SyntaxWarning, stacklevel=2) 1330 return None 1331 return MatchFirst( [ self, other ] )
1332
1333 - def __ror__(self, other ):
1334 """Implementation of | operator when left operand is not a C{L{ParserElement}}""" 1335 if isinstance( other, basestring ): 1336 other = ParserElement.literalStringClass( other ) 1337 if not isinstance( other, ParserElement ): 1338 warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), 1339 SyntaxWarning, stacklevel=2) 1340 return None 1341 return other | self
1342
1343 - def __xor__(self, other ):
1344 """Implementation of ^ operator - returns C{L{Or}}""" 1345 if isinstance( other, basestring ): 1346 other = ParserElement.literalStringClass( other ) 1347 if not isinstance( other, ParserElement ): 1348 warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), 1349 SyntaxWarning, stacklevel=2) 1350 return None 1351 return Or( [ self, other ] )
1352
1353 - def __rxor__(self, other ):
1354 """Implementation of ^ operator when left operand is not a C{L{ParserElement}}""" 1355 if isinstance( other, basestring ): 1356 other = ParserElement.literalStringClass( other ) 1357 if not isinstance( other, ParserElement ): 1358 warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), 1359 SyntaxWarning, stacklevel=2) 1360 return None 1361 return other ^ self
1362
1363 - def __and__(self, other ):
1364 """Implementation of & operator - returns C{L{Each}}""" 1365 if isinstance( other, basestring ): 1366 other = ParserElement.literalStringClass( other ) 1367 if not isinstance( other, ParserElement ): 1368 warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), 1369 SyntaxWarning, stacklevel=2) 1370 return None 1371 return Each( [ self, other ] )
1372
1373 - def __rand__(self, other ):
1374 """Implementation of & operator when left operand is not a C{L{ParserElement}}""" 1375 if isinstance( other, basestring ): 1376 other = ParserElement.literalStringClass( other ) 1377 if not isinstance( other, ParserElement ): 1378 warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), 1379 SyntaxWarning, stacklevel=2) 1380 return None 1381 return other & self
1382
1383 - def __invert__( self ):
1384 """Implementation of ~ operator - returns C{L{NotAny}}""" 1385 return NotAny( self )
1386
1387 - def __call__(self, name=None):
1388 """Shortcut for C{L{setResultsName}}, with C{listAllMatches=default}:: 1389 userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") 1390 could be written as:: 1391 userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") 1392 1393 If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be 1394 passed as C{True}. 1395 1396 If C{name} is omitted, same as calling C{L{copy}}. 1397 """ 1398 if name is not None: 1399 return self.setResultsName(name) 1400 else: 1401 return self.copy()
1402
1403 - def suppress( self ):
1404 """Suppresses the output of this C{ParserElement}; useful to keep punctuation from 1405 cluttering up returned output. 1406 """ 1407 return Suppress( self )
1408
1409 - def leaveWhitespace( self ):
1410 """Disables the skipping of whitespace before matching the characters in the 1411 C{ParserElement}'s defined pattern. This is normally only used internally by 1412 the pyparsing module, but may be needed in some whitespace-sensitive grammars. 1413 """ 1414 self.skipWhitespace = False 1415 return self
1416
1417 - def setWhitespaceChars( self, chars ):
1418 """Overrides the default whitespace chars 1419 """ 1420 self.skipWhitespace = True 1421 self.whiteChars = chars 1422 self.copyDefaultWhiteChars = False 1423 return self
1424
1425 - def parseWithTabs( self ):
1426 """Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. 1427 Must be called before C{parseString} when the input grammar contains elements that 1428 match C{<TAB>} characters.""" 1429 self.keepTabs = True 1430 return self
1431
1432 - def ignore( self, other ):
1433 """Define expression to be ignored (e.g., comments) while doing pattern 1434 matching; may be called repeatedly, to define multiple comment or other 1435 ignorable patterns. 1436 """ 1437 if isinstance( other, Suppress ): 1438 if other not in self.ignoreExprs: 1439 self.ignoreExprs.append( other.copy() ) 1440 else: 1441 self.ignoreExprs.append( Suppress( other.copy() ) ) 1442 return self
1443
1444 - def setDebugActions( self, startAction, successAction, exceptionAction ):
1445 """Enable display of debugging messages while doing pattern matching.""" 1446 self.debugActions = (startAction or _defaultStartDebugAction, 1447 successAction or _defaultSuccessDebugAction, 1448 exceptionAction or _defaultExceptionDebugAction) 1449 self.debug = True 1450 return self
1451
1452 - def setDebug( self, flag=True ):
1453 """Enable display of debugging messages while doing pattern matching. 1454 Set C{flag} to True to enable, False to disable.""" 1455 if flag: 1456 self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) 1457 else: 1458 self.debug = False 1459 return self
1460
1461 - def __str__( self ):
1462 return self.name
1463
1464 - def __repr__( self ):
1465 return _ustr(self)
1466
1467 - def streamline( self ):
1468 self.streamlined = True 1469 self.strRepr = None 1470 return self
1471
1472 - def checkRecursion( self, parseElementList ):
1473 pass
1474
1475 - def validate( self, validateTrace=[] ):
1476 """Check defined expressions for valid structure, check for infinite recursive definitions.""" 1477 self.checkRecursion( [] )
1478
1479 - def parseFile( self, file_or_filename, parseAll=False ):
1480 """Execute the parse expression on the given file or filename. 1481 If a filename is specified (instead of a file object), 1482 the entire file is opened, read, and closed before parsing. 1483 """ 1484 try: 1485 file_contents = file_or_filename.read() 1486 except AttributeError: 1487 f = open(file_or_filename, "r") 1488 file_contents = f.read() 1489 f.close() 1490 try: 1491 return self.parseString(file_contents, parseAll) 1492 except ParseBaseException as exc: 1493 if ParserElement.verbose_stacktrace: 1494 raise 1495 else: 1496 # catch and re-raise exception from here, clears out pyparsing internal stack trace 1497 raise exc
1498
1499 - def __eq__(self,other):
1500 if isinstance(other, ParserElement): 1501 return self is other or self.__dict__ == other.__dict__ 1502 elif isinstance(other, basestring): 1503 try: 1504 self.parseString(_ustr(other), parseAll=True) 1505 return True 1506 except ParseBaseException: 1507 return False 1508 else: 1509 return super(ParserElement,self)==other
1510
1511 - def __ne__(self,other):
1512 return not (self == other)
1513
1514 - def __hash__(self):
1515 return hash(id(self))
1516
1517 - def __req__(self,other):
1518 return self == other
1519
1520 - def __rne__(self,other):
1521 return not (self == other)
1522 1523
1524 -class Token(ParserElement):
1525 """Abstract C{ParserElement} subclass, for defining atomic matching patterns."""
1526 - def __init__( self ):
1527 super(Token,self).__init__( savelist=False )
1528
1529 - def setName(self, name):
1530 s = super(Token,self).setName(name) 1531 self.errmsg = "Expected " + self.name 1532 return s
1533 1534
1535 -class Empty(Token):
1536 """An empty token, will always match."""
1537 - def __init__( self ):
1538 super(Empty,self).__init__() 1539 self.name = "Empty" 1540 self.mayReturnEmpty = True 1541 self.mayIndexError = False
1542 1543
1544 -class NoMatch(Token):
1545 """A token that will never match."""
1546 - def __init__( self ):
1547 super(NoMatch,self).__init__() 1548 self.name = "NoMatch" 1549 self.mayReturnEmpty = True 1550 self.mayIndexError = False 1551 self.errmsg = "Unmatchable token"
1552
1553 - def parseImpl( self, instring, loc, doActions=True ):
1554 raise ParseException(instring, loc, self.errmsg, self)
1555 1556
1557 -class Literal(Token):
1558 """Token to exactly match a specified string."""
1559 - def __init__( self, matchString ):
1560 super(Literal,self).__init__() 1561 self.match = matchString 1562 self.matchLen = len(matchString) 1563 try: 1564 self.firstMatchChar = matchString[0] 1565 except IndexError: 1566 warnings.warn("null string passed to Literal; use Empty() instead", 1567 SyntaxWarning, stacklevel=2) 1568 self.__class__ = Empty 1569 self.name = '"%s"' % _ustr(self.match) 1570 self.errmsg = "Expected " + self.name 1571 self.mayReturnEmpty = False 1572 self.mayIndexError = False
1573 1574 # Performance tuning: this routine gets called a *lot* 1575 # if this is a single character match string and the first character matches, 1576 # short-circuit as quickly as possible, and avoid calling startswith 1577 #~ @profile
1578 - def parseImpl( self, instring, loc, doActions=True ):
1579 if (instring[loc] == self.firstMatchChar and 1580 (self.matchLen==1 or instring.startswith(self.match,loc)) ): 1581 return loc+self.matchLen, self.match 1582 raise ParseException(instring, loc, self.errmsg, self)
1583 _L = Literal 1584 ParserElement.literalStringClass = Literal 1585
1586 -class Keyword(Token):
1587 """Token to exactly match a specified string as a keyword, that is, it must be 1588 immediately followed by a non-keyword character. Compare with C{L{Literal}}:: 1589 Literal("if") will match the leading C{'if'} in C{'ifAndOnlyIf'}. 1590 Keyword("if") will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} 1591 Accepts two optional constructor arguments in addition to the keyword string: 1592 C{identChars} is a string of characters that would be valid identifier characters, 1593 defaulting to all alphanumerics + "_" and "$"; C{caseless} allows case-insensitive 1594 matching, default is C{False}. 1595 """ 1596 DEFAULT_KEYWORD_CHARS = alphanums+"_$" 1597
1598 - def __init__( self, matchString, identChars=DEFAULT_KEYWORD_CHARS, caseless=False ):
1599 super(Keyword,self).__init__() 1600 self.match = matchString 1601 self.matchLen = len(matchString) 1602 try: 1603 self.firstMatchChar = matchString[0] 1604 except IndexError: 1605 warnings.warn("null string passed to Keyword; use Empty() instead", 1606 SyntaxWarning, stacklevel=2) 1607 self.name = '"%s"' % self.match 1608 self.errmsg = "Expected " + self.name 1609 self.mayReturnEmpty = False 1610 self.mayIndexError = False 1611 self.caseless = caseless 1612 if caseless: 1613 self.caselessmatch = matchString.upper() 1614 identChars = identChars.upper() 1615 self.identChars = set(identChars)
1616
1617 - def parseImpl( self, instring, loc, doActions=True ):
1618 if self.caseless: 1619 if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and 1620 (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and 1621 (loc == 0 or instring[loc-1].upper() not in self.identChars) ): 1622 return loc+self.matchLen, self.match 1623 else: 1624 if (instring[loc] == self.firstMatchChar and 1625 (self.matchLen==1 or instring.startswith(self.match,loc)) and 1626 (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and 1627 (loc == 0 or instring[loc-1] not in self.identChars) ): 1628 return loc+self.matchLen, self.match 1629 raise ParseException(instring, loc, self.errmsg, self)
1630
1631 - def copy(self):
1632 c = super(Keyword,self).copy() 1633 c.identChars = Keyword.DEFAULT_KEYWORD_CHARS 1634 return c
1635
1636 - def setDefaultKeywordChars( chars ):
1637 """Overrides the default Keyword chars 1638 """ 1639 Keyword.DEFAULT_KEYWORD_CHARS = chars
1640 setDefaultKeywordChars = staticmethod(setDefaultKeywordChars)
1641
1642 -class CaselessLiteral(Literal):
1643 """Token to match a specified string, ignoring case of letters. 1644 Note: the matched results will always be in the case of the given 1645 match string, NOT the case of the input text. 1646 """
1647 - def __init__( self, matchString ):
1648 super(CaselessLiteral,self).__init__( matchString.upper() ) 1649 # Preserve the defining literal. 1650 self.returnString = matchString 1651 self.name = "'%s'" % self.returnString 1652 self.errmsg = "Expected " + self.name
1653
1654 - def parseImpl( self, instring, loc, doActions=True ):
1655 if instring[ loc:loc+self.matchLen ].upper() == self.match: 1656 return loc+self.matchLen, self.returnString 1657 raise ParseException(instring, loc, self.errmsg, self)
1658
1659 -class CaselessKeyword(Keyword):
1660 - def __init__( self, matchString, identChars=Keyword.DEFAULT_KEYWORD_CHARS ):
1661 super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True )
1662
1663 - def parseImpl( self, instring, loc, doActions=True ):
1664 if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and 1665 (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): 1666 return loc+self.matchLen, self.match 1667 raise ParseException(instring, loc, self.errmsg, self)
1668
1669 -class Word(Token):
1670 """Token for matching words composed of allowed character sets. 1671 Defined with string containing all allowed initial characters, 1672 an optional string containing allowed body characters (if omitted, 1673 defaults to the initial character set), and an optional minimum, 1674 maximum, and/or exact length. The default value for C{min} is 1 (a 1675 minimum value < 1 is not valid); the default values for C{max} and C{exact} 1676 are 0, meaning no maximum or exact length restriction. An optional 1677 C{exclude} parameter can list characters that might be found in 1678 the input C{bodyChars} string; useful to define a word of all printables 1679 except for one or two characters, for instance. 1680 """
1681 - def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ):
1682 super(Word,self).__init__() 1683 if excludeChars: 1684 initChars = ''.join(c for c in initChars if c not in excludeChars) 1685 if bodyChars: 1686 bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) 1687 self.initCharsOrig = initChars 1688 self.initChars = set(initChars) 1689 if bodyChars : 1690 self.bodyCharsOrig = bodyChars 1691 self.bodyChars = set(bodyChars) 1692 else: 1693 self.bodyCharsOrig = initChars 1694 self.bodyChars = set(initChars) 1695 1696 self.maxSpecified = max > 0 1697 1698 if min < 1: 1699 raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") 1700 1701 self.minLen = min 1702 1703 if max > 0: 1704 self.maxLen = max 1705 else: 1706 self.maxLen = _MAX_INT 1707 1708 if exact > 0: 1709 self.maxLen = exact 1710 self.minLen = exact 1711 1712 self.name = _ustr(self) 1713 self.errmsg = "Expected " + self.name 1714 self.mayIndexError = False 1715 self.asKeyword = asKeyword 1716 1717 if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): 1718 if self.bodyCharsOrig == self.initCharsOrig: 1719 self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) 1720 elif len(self.bodyCharsOrig) == 1: 1721 self.reString = "%s[%s]*" % \ 1722 (re.escape(self.initCharsOrig), 1723 _escapeRegexRangeChars(self.bodyCharsOrig),) 1724 else: 1725 self.reString = "[%s][%s]*" % \ 1726 (_escapeRegexRangeChars(self.initCharsOrig), 1727 _escapeRegexRangeChars(self.bodyCharsOrig),) 1728 if self.asKeyword: 1729 self.reString = r"\b"+self.reString+r"\b" 1730 try: 1731 self.re = re.compile( self.reString ) 1732 except: 1733 self.re = None
1734
1735 - def parseImpl( self, instring, loc, doActions=True ):
1736 if self.re: 1737 result = self.re.match(instring,loc) 1738 if not result: 1739 raise ParseException(instring, loc, self.errmsg, self) 1740 1741 loc = result.end() 1742 return loc, result.group() 1743 1744 if not(instring[ loc ] in self.initChars): 1745 raise ParseException(instring, loc, self.errmsg, self) 1746 1747 start = loc 1748 loc += 1 1749 instrlen = len(instring) 1750 bodychars = self.bodyChars 1751 maxloc = start + self.maxLen 1752 maxloc = min( maxloc, instrlen ) 1753 while loc < maxloc and instring[loc] in bodychars: 1754 loc += 1 1755 1756 throwException = False 1757 if loc - start < self.minLen: 1758 throwException = True 1759 if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: 1760 throwException = True 1761 if self.asKeyword: 1762 if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): 1763 throwException = True 1764 1765 if throwException: 1766 raise ParseException(instring, loc, self.errmsg, self) 1767 1768 return loc, instring[start:loc]
1769
1770 - def __str__( self ):
1771 try: 1772 return super(Word,self).__str__() 1773 except: 1774 pass 1775 1776 1777 if self.strRepr is None: 1778 1779 def charsAsStr(s): 1780 if len(s)>4: 1781 return s[:4]+"..." 1782 else: 1783 return s
1784 1785 if ( self.initCharsOrig != self.bodyCharsOrig ): 1786 self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) 1787 else: 1788 self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) 1789 1790 return self.strRepr
1791 1792
1793 -class Regex(Token):
1794 """Token for matching strings that match a given regular expression. 1795 Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. 1796 """ 1797 compiledREtype = type(re.compile("[A-Z]"))
1798 - def __init__( self, pattern, flags=0):
1799 """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" 1800 super(Regex,self).__init__() 1801 1802 if isinstance(pattern, basestring): 1803 if len(pattern) == 0: 1804 warnings.warn("null string passed to Regex; use Empty() instead", 1805 SyntaxWarning, stacklevel=2) 1806 1807 self.pattern = pattern 1808 self.flags = flags 1809 1810 try: 1811 self.re = re.compile(self.pattern, self.flags) 1812 self.reString = self.pattern 1813 except sre_constants.error: 1814 warnings.warn("invalid pattern (%s) passed to Regex" % pattern, 1815 SyntaxWarning, stacklevel=2) 1816 raise 1817 1818 elif isinstance(pattern, Regex.compiledREtype): 1819 self.re = pattern 1820 self.pattern = \ 1821 self.reString = str(pattern) 1822 self.flags = flags 1823 1824 else: 1825 raise ValueError("Regex may only be constructed with a string or a compiled RE object") 1826 1827 self.name = _ustr(self) 1828 self.errmsg = "Expected " + self.name 1829 self.mayIndexError = False 1830 self.mayReturnEmpty = True
1831
1832 - def parseImpl( self, instring, loc, doActions=True ):
1833 result = self.re.match(instring,loc) 1834 if not result: 1835 raise ParseException(instring, loc, self.errmsg, self) 1836 1837 loc = result.end() 1838 d = result.groupdict() 1839 ret = ParseResults(result.group()) 1840 if d: 1841 for k in d: 1842 ret[k] = d[k] 1843 return loc,ret
1844
1845 - def __str__( self ):
1846 try: 1847 return super(Regex,self).__str__() 1848 except: 1849 pass 1850 1851 if self.strRepr is None: 1852 self.strRepr = "Re:(%s)" % repr(self.pattern) 1853 1854 return self.strRepr
1855 1856
1857 -class QuotedString(Token):
1858 """Token for matching strings that are delimited by quoting characters. 1859 """
1860 - def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None):
1861 """ 1862 Defined with the following parameters: 1863 - quoteChar - string of one or more characters defining the quote delimiting string 1864 - escChar - character to escape quotes, typically backslash (default=None) 1865 - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=None) 1866 - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) 1867 - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) 1868 - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) 1869 """ 1870 super(QuotedString,self).__init__() 1871 1872 # remove white space from quote chars - wont work anyway 1873 quoteChar = quoteChar.strip() 1874 if len(quoteChar) == 0: 1875 warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) 1876 raise SyntaxError() 1877 1878 if endQuoteChar is None: 1879 endQuoteChar = quoteChar 1880 else: 1881 endQuoteChar = endQuoteChar.strip() 1882 if len(endQuoteChar) == 0: 1883 warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) 1884 raise SyntaxError() 1885 1886 self.quoteChar = quoteChar 1887 self.quoteCharLen = len(quoteChar) 1888 self.firstQuoteChar = quoteChar[0] 1889 self.endQuoteChar = endQuoteChar 1890 self.endQuoteCharLen = len(endQuoteChar) 1891 self.escChar = escChar 1892 self.escQuote = escQuote 1893 self.unquoteResults = unquoteResults 1894 1895 if multiline: 1896 self.flags = re.MULTILINE | re.DOTALL 1897 self.pattern = r'%s(?:[^%s%s]' % \ 1898 ( re.escape(self.quoteChar), 1899 _escapeRegexRangeChars(self.endQuoteChar[0]), 1900 (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) 1901 else: 1902 self.flags = 0 1903 self.pattern = r'%s(?:[^%s\n\r%s]' % \ 1904 ( re.escape(self.quoteChar), 1905 _escapeRegexRangeChars(self.endQuoteChar[0]), 1906 (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) 1907 if len(self.endQuoteChar) > 1: 1908 self.pattern += ( 1909 '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), 1910 _escapeRegexRangeChars(self.endQuoteChar[i])) 1911 for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' 1912 ) 1913 if escQuote: 1914 self.pattern += (r'|(?:%s)' % re.escape(escQuote)) 1915 if escChar: 1916 self.pattern += (r'|(?:%s.)' % re.escape(escChar)) 1917 charset = ''.join(set(self.quoteChar[0]+self.endQuoteChar[0])).replace('^',r'\^').replace('-',r'\-') 1918 self.escCharReplacePattern = re.escape(self.escChar)+("([%s])" % charset) 1919 self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) 1920 1921 try: 1922 self.re = re.compile(self.pattern, self.flags) 1923 self.reString = self.pattern 1924 except sre_constants.error: 1925 warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, 1926 SyntaxWarning, stacklevel=2) 1927 raise 1928 1929 self.name = _ustr(self) 1930 self.errmsg = "Expected " + self.name 1931 self.mayIndexError = False 1932 self.mayReturnEmpty = True
1933
1934 - def parseImpl( self, instring, loc, doActions=True ):
1935 result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None 1936 if not result: 1937 raise ParseException(instring, loc, self.errmsg, self) 1938 1939 loc = result.end() 1940 ret = result.group() 1941 1942 if self.unquoteResults: 1943 1944 # strip off quotes 1945 ret = ret[self.quoteCharLen:-self.endQuoteCharLen] 1946 1947 if isinstance(ret,basestring): 1948 # replace escaped characters 1949 if self.escChar: 1950 ret = re.sub(self.escCharReplacePattern,"\g<1>",ret) 1951 1952 # replace escaped quotes 1953 if self.escQuote: 1954 ret = ret.replace(self.escQuote, self.endQuoteChar) 1955 1956 return loc, ret
1957
1958 - def __str__( self ):
1959 try: 1960 return super(QuotedString,self).__str__() 1961 except: 1962 pass 1963 1964 if self.strRepr is None: 1965 self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) 1966 1967 return self.strRepr
1968 1969
1970 -class CharsNotIn(Token):
1971 """Token for matching words composed of characters *not* in a given set. 1972 Defined with string containing all disallowed characters, and an optional 1973 minimum, maximum, and/or exact length. The default value for C{min} is 1 (a 1974 minimum value < 1 is not valid); the default values for C{max} and C{exact} 1975 are 0, meaning no maximum or exact length restriction. 1976 """
1977 - def __init__( self, notChars, min=1, max=0, exact=0 ):
1978 super(CharsNotIn,self).__init__() 1979 self.skipWhitespace = False 1980 self.notChars = notChars 1981 1982 if min < 1: 1983 raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") 1984 1985 self.minLen = min 1986 1987 if max > 0: 1988 self.maxLen = max 1989 else: 1990 self.maxLen = _MAX_INT 1991 1992 if exact > 0: 1993 self.maxLen = exact 1994 self.minLen = exact 1995 1996 self.name = _ustr(self) 1997 self.errmsg = "Expected " + self.name 1998 self.mayReturnEmpty = ( self.minLen == 0 ) 1999 self.mayIndexError = False
2000
2001 - def parseImpl( self, instring, loc, doActions=True ):
2002 if instring[loc] in self.notChars: 2003 raise ParseException(instring, loc, self.errmsg, self) 2004 2005 start = loc 2006 loc += 1 2007 notchars = self.notChars 2008 maxlen = min( start+self.maxLen, len(instring) ) 2009 while loc < maxlen and \ 2010 (instring[loc] not in notchars): 2011 loc += 1 2012 2013 if loc - start < self.minLen: 2014 raise ParseException(instring, loc, self.errmsg, self) 2015 2016 return loc, instring[start:loc]
2017
2018 - def __str__( self ):
2019 try: 2020 return super(CharsNotIn, self).__str__() 2021 except: 2022 pass 2023 2024 if self.strRepr is None: 2025 if len(self.notChars) > 4: 2026 self.strRepr = "!W:(%s...)" % self.notChars[:4] 2027 else: 2028 self.strRepr = "!W:(%s)" % self.notChars 2029 2030 return self.strRepr
2031
2032 -class White(Token):
2033 """Special matching class for matching whitespace. Normally, whitespace is ignored 2034 by pyparsing grammars. This class is included when some whitespace structures 2035 are significant. Define with a string containing the whitespace characters to be 2036 matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, 2037 as defined for the C{L{Word}} class.""" 2038 whiteStrs = { 2039 " " : "<SPC>", 2040 "\t": "<TAB>", 2041 "\n": "<LF>", 2042 "\r": "<CR>", 2043 "\f": "<FF>", 2044 }
2045 - def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0):
2046 super(White,self).__init__() 2047 self.matchWhite = ws 2048 self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) 2049 #~ self.leaveWhitespace() 2050 self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) 2051 self.mayReturnEmpty = True 2052 self.errmsg = "Expected " + self.name 2053 2054 self.minLen = min 2055 2056 if max > 0: 2057 self.maxLen = max 2058 else: 2059 self.maxLen = _MAX_INT 2060 2061 if exact > 0: 2062 self.maxLen = exact 2063 self.minLen = exact
2064
2065 - def parseImpl( self, instring, loc, doActions=True ):
2066 if not(instring[ loc ] in self.matchWhite): 2067 raise ParseException(instring, loc, self.errmsg, self) 2068 start = loc 2069 loc += 1 2070 maxloc = start + self.maxLen 2071 maxloc = min( maxloc, len(instring) ) 2072 while loc < maxloc and instring[loc] in self.matchWhite: 2073 loc += 1 2074 2075 if loc - start < self.minLen: 2076 raise ParseException(instring, loc, self.errmsg, self) 2077 2078 return loc, instring[start:loc]
2079 2080
2081 -class _PositionToken(Token):
2082 - def __init__( self ):
2083 super(_PositionToken,self).__init__() 2084 self.name=self.__class__.__name__ 2085 self.mayReturnEmpty = True 2086 self.mayIndexError = False
2087
2088 -class GoToColumn(_PositionToken):
2089 """Token to advance to a specific column of input text; useful for tabular report scraping."""
2090 - def __init__( self, colno ):
2091 super(GoToColumn,self).__init__() 2092 self.col = colno
2093
2094 - def preParse( self, instring, loc ):
2095 if col(loc,instring) != self.col: 2096 instrlen = len(instring) 2097 if self.ignoreExprs: 2098 loc = self._skipIgnorables( instring, loc ) 2099 while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : 2100 loc += 1 2101 return loc
2102
2103 - def parseImpl( self, instring, loc, doActions=True ):
2104 thiscol = col( loc, instring ) 2105 if thiscol > self.col: 2106 raise ParseException( instring, loc, "Text not in expected column", self ) 2107 newloc = loc + self.col - thiscol 2108 ret = instring[ loc: newloc ] 2109 return newloc, ret
2110
2111 -class LineStart(_PositionToken):
2112 """Matches if current position is at the beginning of a line within the parse string"""
2113 - def __init__( self ):
2114 super(LineStart,self).__init__() 2115 self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) 2116 self.errmsg = "Expected start of line"
2117
2118 - def preParse( self, instring, loc ):
2119 preloc = super(LineStart,self).preParse(instring,loc) 2120 if instring[preloc] == "\n": 2121 loc += 1 2122 return loc
2123
2124 - def parseImpl( self, instring, loc, doActions=True ):
2125 if not( loc==0 or 2126 (loc == self.preParse( instring, 0 )) or 2127 (instring[loc-1] == "\n") ): #col(loc, instring) != 1: 2128 raise ParseException(instring, loc, self.errmsg, self) 2129 return loc, []
2130
2131 -class LineEnd(_PositionToken):
2132 """Matches if current position is at the end of a line within the parse string"""
2133 - def __init__( self ):
2134 super(LineEnd,self).__init__() 2135 self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) 2136 self.errmsg = "Expected end of line"
2137
2138 - def parseImpl( self, instring, loc, doActions=True ):
2139 if loc<len(instring): 2140 if instring[loc] == "\n": 2141 return loc+1, "\n" 2142 else: 2143 raise ParseException(instring, loc, self.errmsg, self) 2144 elif loc == len(instring): 2145 return loc+1, [] 2146 else: 2147 raise ParseException(instring, loc, self.errmsg, self)
2148
2149 -class StringStart(_PositionToken):
2150 """Matches if current position is at the beginning of the parse string"""
2151 - def __init__( self ):
2152 super(StringStart,self).__init__() 2153 self.errmsg = "Expected start of text"
2154
2155 - def parseImpl( self, instring, loc, doActions=True ):
2156 if loc != 0: 2157 # see if entire string up to here is just whitespace and ignoreables 2158 if loc != self.preParse( instring, 0 ): 2159 raise ParseException(instring, loc, self.errmsg, self) 2160 return loc, []
2161
2162 -class StringEnd(_PositionToken):
2163 """Matches if current position is at the end of the parse string"""
2164 - def __init__( self ):
2165 super(StringEnd,self).__init__() 2166 self.errmsg = "Expected end of text"
2167
2168 - def parseImpl( self, instring, loc, doActions=True ):
2169 if loc < len(instring): 2170 raise ParseException(instring, loc, self.errmsg, self) 2171 elif loc == len(instring): 2172 return loc+1, [] 2173 elif loc > len(instring): 2174 return loc, [] 2175 else: 2176 raise ParseException(instring, loc, self.errmsg, self)
2177
2178 -class WordStart(_PositionToken):
2179 """Matches if the current position is at the beginning of a Word, and 2180 is not preceded by any character in a given set of C{wordChars} 2181 (default=C{printables}). To emulate the C{\b} behavior of regular expressions, 2182 use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of 2183 the string being parsed, or at the beginning of a line. 2184 """
2185 - def __init__(self, wordChars = printables):
2186 super(WordStart,self).__init__() 2187 self.wordChars = set(wordChars) 2188 self.errmsg = "Not at the start of a word"
2189
2190 - def parseImpl(self, instring, loc, doActions=True ):
2191 if loc != 0: 2192 if (instring[loc-1] in self.wordChars or 2193 instring[loc] not in self.wordChars): 2194 raise ParseException(instring, loc, self.errmsg, self) 2195 return loc, []
2196
2197 -class WordEnd(_PositionToken):
2198 """Matches if the current position is at the end of a Word, and 2199 is not followed by any character in a given set of C{wordChars} 2200 (default=C{printables}). To emulate the C{\b} behavior of regular expressions, 2201 use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of 2202 the string being parsed, or at the end of a line. 2203 """
2204 - def __init__(self, wordChars = printables):
2205 super(WordEnd,self).__init__() 2206 self.wordChars = set(wordChars) 2207 self.skipWhitespace = False 2208 self.errmsg = "Not at the end of a word"
2209
2210 - def parseImpl(self, instring, loc, doActions=True ):
2211 instrlen = len(instring) 2212 if instrlen>0 and loc<instrlen: 2213 if (instring[loc] in self.wordChars or 2214 instring[loc-1] not in self.wordChars): 2215 raise ParseException(instring, loc, self.errmsg, self) 2216 return loc, []
2217 2218
2219 -class ParseExpression(ParserElement):
2220 """Abstract subclass of ParserElement, for combining and post-processing parsed tokens."""
2221 - def __init__( self, exprs, savelist = False ):
2222 super(ParseExpression,self).__init__(savelist) 2223 if isinstance( exprs, _generatorType ): 2224 exprs = list(exprs) 2225 2226 if isinstance( exprs, basestring ): 2227 self.exprs = [ Literal( exprs ) ] 2228 elif isinstance( exprs, collections.Sequence ): 2229 # if sequence of strings provided, wrap with Literal 2230 if all(isinstance(expr, basestring) for expr in exprs): 2231 exprs = map(Literal, exprs) 2232 self.exprs = list(exprs) 2233 else: 2234 try: 2235 self.exprs = list( exprs ) 2236 except TypeError: 2237 self.exprs = [ exprs ] 2238 self.callPreparse = False
2239
2240 - def __getitem__( self, i ):
2241 return self.exprs[i]
2242
2243 - def append( self, other ):
2244 self.exprs.append( other ) 2245 self.strRepr = None 2246 return self
2247
2248 - def leaveWhitespace( self ):
2249 """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on 2250 all contained expressions.""" 2251 self.skipWhitespace = False 2252 self.exprs = [ e.copy() for e in self.exprs ] 2253 for e in self.exprs: 2254 e.leaveWhitespace() 2255 return self
2256
2257 - def ignore( self, other ):
2258 if isinstance( other, Suppress ): 2259 if other not in self.ignoreExprs: 2260 super( ParseExpression, self).ignore( other ) 2261 for e in self.exprs: 2262 e.ignore( self.ignoreExprs[-1] ) 2263 else: 2264 super( ParseExpression, self).ignore( other ) 2265 for e in self.exprs: 2266 e.ignore( self.ignoreExprs[-1] ) 2267 return self
2268
2269 - def __str__( self ):
2270 try: 2271 return super(ParseExpression,self).__str__() 2272 except: 2273 pass 2274 2275 if self.strRepr is None: 2276 self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) 2277 return self.strRepr
2278
2279 - def streamline( self ):
2280 super(ParseExpression,self).streamline() 2281 2282 for e in self.exprs: 2283 e.streamline() 2284 2285 # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) 2286 # but only if there are no parse actions or resultsNames on the nested And's 2287 # (likewise for Or's and MatchFirst's) 2288 if ( len(self.exprs) == 2 ): 2289 other = self.exprs[0] 2290 if ( isinstance( other, self.__class__ ) and 2291 not(other.parseAction) and 2292 other.resultsName is None and 2293 not other.debug ): 2294 self.exprs = other.exprs[:] + [ self.exprs[1] ] 2295 self.strRepr = None 2296 self.mayReturnEmpty |= other.mayReturnEmpty 2297 self.mayIndexError |= other.mayIndexError 2298 2299 other = self.exprs[-1] 2300 if ( isinstance( other, self.__class__ ) and 2301 not(other.parseAction) and 2302 other.resultsName is None and 2303 not other.debug ): 2304 self.exprs = self.exprs[:-1] + other.exprs[:] 2305 self.strRepr = None 2306 self.mayReturnEmpty |= other.mayReturnEmpty 2307 self.mayIndexError |= other.mayIndexError 2308 2309 return self
2310
2311 - def setResultsName( self, name, listAllMatches=False ):
2312 ret = super(ParseExpression,self).setResultsName(name,listAllMatches) 2313 return ret
2314
2315 - def validate( self, validateTrace=[] ):
2316 tmp = validateTrace[:]+[self] 2317 for e in self.exprs: 2318 e.validate(tmp) 2319 self.checkRecursion( [] )
2320
2321 - def copy(self):
2322 ret = super(ParseExpression,self).copy() 2323 ret.exprs = [e.copy() for e in self.exprs] 2324 return ret
2325
2326 -class And(ParseExpression):
2327 """Requires all given C{ParseExpression}s to be found in the given order. 2328 Expressions may be separated by whitespace. 2329 May be constructed using the C{'+'} operator. 2330 """ 2331
2332 - class _ErrorStop(Empty):
2333 - def __init__(self, *args, **kwargs):
2334 super(And._ErrorStop,self).__init__(*args, **kwargs) 2335 self.name = '-' 2336 self.leaveWhitespace()
2337
2338 - def __init__( self, exprs, savelist = True ):
2339 super(And,self).__init__(exprs, savelist) 2340 self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) 2341 self.setWhitespaceChars( exprs[0].whiteChars ) 2342 self.skipWhitespace = exprs[0].skipWhitespace 2343 self.callPreparse = True
2344
2345 - def parseImpl( self, instring, loc, doActions=True ):
2346 # pass False as last arg to _parse for first element, since we already 2347 # pre-parsed the string as part of our And pre-parsing 2348 loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) 2349 errorStop = False 2350 for e in self.exprs[1:]: 2351 if isinstance(e, And._ErrorStop): 2352 errorStop = True 2353 continue 2354 if errorStop: 2355 try: 2356 loc, exprtokens = e._parse( instring, loc, doActions ) 2357 except ParseSyntaxException: 2358 raise 2359 except ParseBaseException as pe: 2360 pe.__traceback__ = None 2361 raise ParseSyntaxException(pe) 2362 except IndexError: 2363 raise ParseSyntaxException( ParseException(instring, len(instring), self.errmsg, self) ) 2364 else: 2365 loc, exprtokens = e._parse( instring, loc, doActions ) 2366 if exprtokens or exprtokens.haskeys(): 2367 resultlist += exprtokens 2368 return loc, resultlist
2369
2370 - def __iadd__(self, other ):
2371 if isinstance( other, basestring ): 2372 other = Literal( other ) 2373 return self.append( other ) #And( [ self, other ] )
2374
2375 - def checkRecursion( self, parseElementList ):
2376 subRecCheckList = parseElementList[:] + [ self ] 2377 for e in self.exprs: 2378 e.checkRecursion( subRecCheckList ) 2379 if not e.mayReturnEmpty: 2380 break
2381
2382 - def __str__( self ):
2383 if hasattr(self,"name"): 2384 return self.name 2385 2386 if self.strRepr is None: 2387 self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" 2388 2389 return self.strRepr
2390 2391
2392 -class Or(ParseExpression):
2393 """Requires that at least one C{ParseExpression} is found. 2394 If two expressions match, the expression that matches the longest string will be used. 2395 May be constructed using the C{'^'} operator. 2396 """
2397 - def __init__( self, exprs, savelist = False ):
2398 super(Or,self).__init__(exprs, savelist) 2399 if self.exprs: 2400 self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) 2401 else: 2402 self.mayReturnEmpty = True
2403
2404 - def parseImpl( self, instring, loc, doActions=True ):
2405 maxExcLoc = -1 2406 maxMatchLoc = -1 2407 maxException = None 2408 for e in self.exprs: 2409 try: 2410 loc2 = e.tryParse( instring, loc ) 2411 except ParseException as err: 2412 err.__traceback__ = None 2413 if err.loc > maxExcLoc: 2414 maxException = err 2415 maxExcLoc = err.loc 2416 except IndexError: 2417 if len(instring) > maxExcLoc: 2418 maxException = ParseException(instring,len(instring),e.errmsg,self) 2419 maxExcLoc = len(instring) 2420 else: 2421 if loc2 > maxMatchLoc: 2422 maxMatchLoc = loc2 2423 maxMatchExp = e 2424 2425 if maxMatchLoc < 0: 2426 if maxException is not None: 2427 raise maxException 2428 else: 2429 raise ParseException(instring, loc, "no defined alternatives to match", self) 2430 2431 return maxMatchExp._parse( instring, loc, doActions )
2432
2433 - def __ixor__(self, other ):
2434 if isinstance( other, basestring ): 2435 other = ParserElement.literalStringClass( other ) 2436 return self.append( other ) #Or( [ self, other ] )
2437
2438 - def __str__( self ):
2439 if hasattr(self,"name"): 2440 return self.name 2441 2442 if self.strRepr is None: 2443 self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" 2444 2445 return self.strRepr
2446
2447 - def checkRecursion( self, parseElementList ):
2448 subRecCheckList = parseElementList[:] + [ self ] 2449 for e in self.exprs: 2450 e.checkRecursion( subRecCheckList )
2451 2452
2453 -class MatchFirst(ParseExpression):
2454 """Requires that at least one C{ParseExpression} is found. 2455 If two expressions match, the first one listed is the one that will match. 2456 May be constructed using the C{'|'} operator. 2457 """
2458 - def __init__( self, exprs, savelist = False ):
2459 super(MatchFirst,self).__init__(exprs, savelist) 2460 if self.exprs: 2461 self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) 2462 else: 2463 self.mayReturnEmpty = True
2464
2465 - def parseImpl( self, instring, loc, doActions=True ):
2466 maxExcLoc = -1 2467 maxException = None 2468 for e in self.exprs: 2469 try: 2470 ret = e._parse( instring, loc, doActions ) 2471 return ret 2472 except ParseException as err: 2473 if err.loc > maxExcLoc: 2474 maxException = err 2475 maxExcLoc = err.loc 2476 except IndexError: 2477 if len(instring) > maxExcLoc: 2478 maxException = ParseException(instring,len(instring),e.errmsg,self) 2479 maxExcLoc = len(instring) 2480 2481 # only got here if no expression matched, raise exception for match that made it the furthest 2482 else: 2483 if maxException is not None: 2484 raise maxException 2485 else: 2486 raise ParseException(instring, loc, "no defined alternatives to match", self)
2487
2488 - def __ior__(self, other ):
2489 if isinstance( other, basestring ): 2490 other = ParserElement.literalStringClass( other ) 2491 return self.append( other ) #MatchFirst( [ self, other ] )
2492
2493 - def __str__( self ):
2494 if hasattr(self,"name"): 2495 return self.name 2496 2497 if self.strRepr is None: 2498 self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" 2499 2500 return self.strRepr
2501
2502 - def checkRecursion( self, parseElementList ):
2503 subRecCheckList = parseElementList[:] + [ self ] 2504 for e in self.exprs: 2505 e.checkRecursion( subRecCheckList )
2506 2507
2508 -class Each(ParseExpression):
2509 """Requires all given C{ParseExpression}s to be found, but in any order. 2510 Expressions may be separated by whitespace. 2511 May be constructed using the C{'&'} operator. 2512 """
2513 - def __init__( self, exprs, savelist = True ):
2514 super(Each,self).__init__(exprs, savelist) 2515 self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) 2516 self.skipWhitespace = True 2517 self.initExprGroups = True
2518
2519 - def parseImpl( self, instring, loc, doActions=True ):
2520 if self.initExprGroups: 2521 opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] 2522 opt2 = [ e for e in self.exprs if e.mayReturnEmpty and e not in opt1 ] 2523 self.optionals = opt1 + opt2 2524 self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] 2525 self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] 2526 self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] 2527 self.required += self.multirequired 2528 self.initExprGroups = False 2529 tmpLoc = loc 2530 tmpReqd = self.required[:] 2531 tmpOpt = self.optionals[:] 2532 matchOrder = [] 2533 2534 keepMatching = True 2535 while keepMatching: 2536 tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired 2537 failed = [] 2538 for e in tmpExprs: 2539 try: 2540 tmpLoc = e.tryParse( instring, tmpLoc ) 2541 except ParseException: 2542 failed.append(e) 2543 else: 2544 matchOrder.append(e) 2545 if e in tmpReqd: 2546 tmpReqd.remove(e) 2547 elif e in tmpOpt: 2548 tmpOpt.remove(e) 2549 if len(failed) == len(tmpExprs): 2550 keepMatching = False 2551 2552 if tmpReqd: 2553 missing = ", ".join(_ustr(e) for e in tmpReqd) 2554 raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) 2555 2556 # add any unmatched Optionals, in case they have default values defined 2557 matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] 2558 2559 resultlist = [] 2560 for e in matchOrder: 2561 loc,results = e._parse(instring,loc,doActions) 2562 resultlist.append(results) 2563 2564 finalResults = ParseResults([]) 2565 for r in resultlist: 2566 dups = {} 2567 for k in r.keys(): 2568 if k in finalResults: 2569 tmp = ParseResults(finalResults[k]) 2570 tmp += ParseResults(r[k]) 2571 dups[k] = tmp 2572 finalResults += ParseResults(r) 2573 for k,v in dups.items(): 2574 finalResults[k] = v 2575 return loc, finalResults
2576
2577 - def __str__( self ):
2578 if hasattr(self,"name"): 2579 return self.name 2580 2581 if self.strRepr is None: 2582 self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" 2583 2584 return self.strRepr
2585
2586 - def checkRecursion( self, parseElementList ):
2587 subRecCheckList = parseElementList[:] + [ self ] 2588 for e in self.exprs: 2589 e.checkRecursion( subRecCheckList )
2590 2591
2592 -class ParseElementEnhance(ParserElement):
2593 """Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens."""
2594 - def __init__( self, expr, savelist=False ):
2595 super(ParseElementEnhance,self).__init__(savelist) 2596 if isinstance( expr, basestring ): 2597 expr = Literal(expr) 2598 self.expr = expr 2599 self.strRepr = None 2600 if expr is not None: 2601 self.mayIndexError = expr.mayIndexError 2602 self.mayReturnEmpty = expr.mayReturnEmpty 2603 self.setWhitespaceChars( expr.whiteChars ) 2604 self.skipWhitespace = expr.skipWhitespace 2605 self.saveAsList = expr.saveAsList 2606 self.callPreparse = expr.callPreparse 2607 self.ignoreExprs.extend(expr.ignoreExprs)
2608
2609 - def parseImpl( self, instring, loc, doActions=True ):
2610 if self.expr is not None: 2611 return self.expr._parse( instring, loc, doActions, callPreParse=False ) 2612 else: 2613 raise ParseException("",loc,self.errmsg,self)
2614
2615 - def leaveWhitespace( self ):
2616 self.skipWhitespace = False 2617 self.expr = self.expr.copy() 2618 if self.expr is not None: 2619 self.expr.leaveWhitespace() 2620 return self
2621
2622 - def ignore( self, other ):
2623 if isinstance( other, Suppress ): 2624 if other not in self.ignoreExprs: 2625 super( ParseElementEnhance, self).ignore( other ) 2626 if self.expr is not None: 2627 self.expr.ignore( self.ignoreExprs[-1] ) 2628 else: 2629 super( ParseElementEnhance, self).ignore( other ) 2630 if self.expr is not None: 2631 self.expr.ignore( self.ignoreExprs[-1] ) 2632 return self
2633
2634 - def streamline( self ):
2635 super(ParseElementEnhance,self).streamline() 2636 if self.expr is not None: 2637 self.expr.streamline() 2638 return self
2639
2640 - def checkRecursion( self, parseElementList ):
2641 if self in parseElementList: 2642 raise RecursiveGrammarException( parseElementList+[self] ) 2643 subRecCheckList = parseElementList[:] + [ self ] 2644 if self.expr is not None: 2645 self.expr.checkRecursion( subRecCheckList )
2646
2647 - def validate( self, validateTrace=[] ):
2648 tmp = validateTrace[:]+[self] 2649 if self.expr is not None: 2650 self.expr.validate(tmp) 2651 self.checkRecursion( [] )
2652
2653 - def __str__( self ):
2654 try: 2655 return super(ParseElementEnhance,self).__str__() 2656 except: 2657 pass 2658 2659 if self.strRepr is None and self.expr is not None: 2660 self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) 2661 return self.strRepr
2662 2663
2664 -class FollowedBy(ParseElementEnhance):
2665 """Lookahead matching of the given parse expression. C{FollowedBy} 2666 does *not* advance the parsing position within the input string, it only 2667 verifies that the specified parse expression matches at the current 2668 position. C{FollowedBy} always returns a null token list."""
2669 - def __init__( self, expr ):
2670 super(FollowedBy,self).__init__(expr) 2671 self.mayReturnEmpty = True
2672
2673 - def parseImpl( self, instring, loc, doActions=True ):
2674 self.expr.tryParse( instring, loc ) 2675 return loc, []
2676 2677
2678 -class NotAny(ParseElementEnhance):
2679 """Lookahead to disallow matching with the given parse expression. C{NotAny} 2680 does *not* advance the parsing position within the input string, it only 2681 verifies that the specified parse expression does *not* match at the current 2682 position. Also, C{NotAny} does *not* skip over leading whitespace. C{NotAny} 2683 always returns a null token list. May be constructed using the '~' operator."""
2684 - def __init__( self, expr ):
2685 super(NotAny,self).__init__(expr) 2686 #~ self.leaveWhitespace() 2687 self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs 2688 self.mayReturnEmpty = True 2689 self.errmsg = "Found unwanted token, "+_ustr(self.expr)
2690
2691 - def parseImpl( self, instring, loc, doActions=True ):
2692 try: 2693 self.expr.tryParse( instring, loc ) 2694 except (ParseException,IndexError): 2695 pass 2696 else: 2697 raise ParseException(instring, loc, self.errmsg, self) 2698 return loc, []
2699
2700 - def __str__( self ):
2701 if hasattr(self,"name"): 2702 return self.name 2703 2704 if self.strRepr is None: 2705 self.strRepr = "~{" + _ustr(self.expr) + "}" 2706 2707 return self.strRepr
2708 2709
2710 -class ZeroOrMore(ParseElementEnhance):
2711 """Optional repetition of zero or more of the given expression."""
2712 - def __init__( self, expr ):
2713 super(ZeroOrMore,self).__init__(expr) 2714 self.mayReturnEmpty = True
2715
2716 - def parseImpl( self, instring, loc, doActions=True ):
2717 tokens = [] 2718 try: 2719 loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) 2720 hasIgnoreExprs = ( len(self.ignoreExprs) > 0 ) 2721 while 1: 2722 if hasIgnoreExprs: 2723 preloc = self._skipIgnorables( instring, loc ) 2724 else: 2725 preloc = loc 2726 loc, tmptokens = self.expr._parse( instring, preloc, doActions ) 2727 if tmptokens or tmptokens.haskeys(): 2728 tokens += tmptokens 2729 except (ParseException,IndexError): 2730 pass 2731 2732 return loc, tokens
2733
2734 - def __str__( self ):
2735 if hasattr(self,"name"): 2736 return self.name 2737 2738 if self.strRepr is None: 2739 self.strRepr = "[" + _ustr(self.expr) + "]..." 2740 2741 return self.strRepr
2742
2743 - def setResultsName( self, name, listAllMatches=False ):
2744 ret = super(ZeroOrMore,self).setResultsName(name,listAllMatches) 2745 ret.saveAsList = True 2746 return ret
2747 2748
2749 -class OneOrMore(ParseElementEnhance):
2750 """Repetition of one or more of the given expression."""
2751 - def parseImpl( self, instring, loc, doActions=True ):
2752 # must be at least one 2753 loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) 2754 try: 2755 hasIgnoreExprs = ( len(self.ignoreExprs) > 0 ) 2756 while 1: 2757 if hasIgnoreExprs: 2758 preloc = self._skipIgnorables( instring, loc ) 2759 else: 2760 preloc = loc 2761 loc, tmptokens = self.expr._parse( instring, preloc, doActions ) 2762 if tmptokens or tmptokens.haskeys(): 2763 tokens += tmptokens 2764 except (ParseException,IndexError): 2765 pass 2766 2767 return loc, tokens
2768
2769 - def __str__( self ):
2770 if hasattr(self,"name"): 2771 return self.name 2772 2773 if self.strRepr is None: 2774 self.strRepr = "{" + _ustr(self.expr) + "}..." 2775 2776 return self.strRepr
2777
2778 - def setResultsName( self, name, listAllMatches=False ):
2779 ret = super(OneOrMore,self).setResultsName(name,listAllMatches) 2780 ret.saveAsList = True 2781 return ret
2782
2783 -class _NullToken(object):
2784 - def __bool__(self):
2785 return False
2786 __nonzero__ = __bool__
2787 - def __str__(self):
2788 return ""
2789 2790 _optionalNotMatched = _NullToken()
2791 -class Optional(ParseElementEnhance):
2792 """Optional matching of the given expression. 2793 A default return string can also be specified, if the optional expression 2794 is not found. 2795 """
2796 - def __init__( self, expr, default=_optionalNotMatched ):
2797 super(Optional,self).__init__( expr, savelist=False ) 2798 self.defaultValue = default 2799 self.mayReturnEmpty = True
2800
2801 - def parseImpl( self, instring, loc, doActions=True ):
2802 try: 2803 loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) 2804 except (ParseException,IndexError): 2805 if self.defaultValue is not _optionalNotMatched: 2806 if self.expr.resultsName: 2807 tokens = ParseResults([ self.defaultValue ]) 2808 tokens[self.expr.resultsName] = self.defaultValue 2809 else: 2810 tokens = [ self.defaultValue ] 2811 else: 2812 tokens = [] 2813 return loc, tokens
2814
2815 - def __str__( self ):
2816 if hasattr(self,"name"): 2817 return self.name 2818 2819 if self.strRepr is None: 2820 self.strRepr = "[" + _ustr(self.expr) + "]" 2821 2822 return self.strRepr
2823 2824
2825 -class SkipTo(ParseElementEnhance):
2826 """Token for skipping over all undefined text until the matched expression is found. 2827 If C{include} is set to true, the matched expression is also parsed (the skipped text 2828 and matched expression are returned as a 2-element list). The C{ignore} 2829 argument is used to define grammars (typically quoted strings and comments) that 2830 might contain false matches. 2831 """
2832 - def __init__( self, other, include=False, ignore=None, failOn=None ):
2833 super( SkipTo, self ).__init__( other ) 2834 self.ignoreExpr = ignore 2835 self.mayReturnEmpty = True 2836 self.mayIndexError = False 2837 self.includeMatch = include 2838 self.asList = False 2839 if failOn is not None and isinstance(failOn, basestring): 2840 self.failOn = Literal(failOn) 2841 else: 2842 self.failOn = failOn 2843 self.errmsg = "No match found for "+_ustr(self.expr)
2844
2845 - def parseImpl( self, instring, loc, doActions=True ):
2846 startLoc = loc 2847 instrlen = len(instring) 2848 expr = self.expr 2849 failParse = False 2850 while loc <= instrlen: 2851 try: 2852 if self.failOn: 2853 try: 2854 self.failOn.tryParse(instring, loc) 2855 except ParseBaseException: 2856 pass 2857 else: 2858 failParse = True 2859 raise ParseException(instring, loc, "Found expression " + str(self.failOn)) 2860 failParse = False 2861 if self.ignoreExpr is not None: 2862 while 1: 2863 try: 2864 loc = self.ignoreExpr.tryParse(instring,loc) 2865 # print("found ignoreExpr, advance to", loc) 2866 except ParseBaseException: 2867 break 2868 expr._parse( instring, loc, doActions=False, callPreParse=False ) 2869 skipText = instring[startLoc:loc] 2870 if self.includeMatch: 2871 loc,mat = expr._parse(instring,loc,doActions,callPreParse=False) 2872 if mat: 2873 skipRes = ParseResults( skipText ) 2874 skipRes += mat 2875 return loc, [ skipRes ] 2876 else: 2877 return loc, [ skipText ] 2878 else: 2879 return loc, [ skipText ] 2880 except (ParseException,IndexError): 2881 if failParse: 2882 raise 2883 else: 2884 loc += 1 2885 raise ParseException(instring, loc, self.errmsg, self)
2886
2887 -class Forward(ParseElementEnhance):
2888 """Forward declaration of an expression to be defined later - 2889 used for recursive grammars, such as algebraic infix notation. 2890 When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. 2891 2892 Note: take care when assigning to C{Forward} not to overlook precedence of operators. 2893 Specifically, '|' has a lower precedence than '<<', so that:: 2894 fwdExpr << a | b | c 2895 will actually be evaluated as:: 2896 (fwdExpr << a) | b | c 2897 thereby leaving b and c out as parseable alternatives. It is recommended that you 2898 explicitly group the values inserted into the C{Forward}:: 2899 fwdExpr << (a | b | c) 2900 Converting to use the '<<=' operator instead will avoid this problem. 2901 """
2902 - def __init__( self, other=None ):
2903 super(Forward,self).__init__( other, savelist=False )
2904
2905 - def __lshift__( self, other ):
2906 if isinstance( other, basestring ): 2907 other = ParserElement.literalStringClass(other) 2908 self.expr = other 2909 self.mayReturnEmpty = other.mayReturnEmpty 2910 self.strRepr = None 2911 self.mayIndexError = self.expr.mayIndexError 2912 self.mayReturnEmpty = self.expr.mayReturnEmpty 2913 self.setWhitespaceChars( self.expr.whiteChars ) 2914 self.skipWhitespace = self.expr.skipWhitespace 2915 self.saveAsList = self.expr.saveAsList 2916 self.ignoreExprs.extend(self.expr.ignoreExprs) 2917 return self
2918
2919 - def __ilshift__(self, other):
2920 return self << other
2921
2922 - def leaveWhitespace( self ):
2923 self.skipWhitespace = False 2924 return self
2925
2926 - def streamline( self ):
2927 if not self.streamlined: 2928 self.streamlined = True 2929 if self.expr is not None: 2930 self.expr.streamline() 2931 return self
2932
2933 - def validate( self, validateTrace=[] ):
2934 if self not in validateTrace: 2935 tmp = validateTrace[:]+[self] 2936 if self.expr is not None: 2937 self.expr.validate(tmp) 2938 self.checkRecursion([])
2939
2940 - def __str__( self ):
2941 if hasattr(self,"name"): 2942 return self.name 2943 2944 self._revertClass = self.__class__ 2945 self.__class__ = _ForwardNoRecurse 2946 try: 2947 if self.expr is not None: 2948 retString = _ustr(self.expr) 2949 else: 2950 retString = "None" 2951 finally: 2952 self.__class__ = self._revertClass 2953 return self.__class__.__name__ + ": " + retString
2954
2955 - def copy(self):
2956 if self.expr is not None: 2957 return super(Forward,self).copy() 2958 else: 2959 ret = Forward() 2960 ret <<= self 2961 return ret
2962
2963 -class _ForwardNoRecurse(Forward):
2964 - def __str__( self ):
2965 return "..."
2966
2967 -class TokenConverter(ParseElementEnhance):
2968 """Abstract subclass of C{ParseExpression}, for converting parsed results."""
2969 - def __init__( self, expr, savelist=False ):
2970 super(TokenConverter,self).__init__( expr )#, savelist ) 2971 self.saveAsList = False
2972
2973 -class Upcase(TokenConverter):
2974 """Converter to upper case all matching tokens."""
2975 - def __init__(self, *args):
2976 super(Upcase,self).__init__(*args) 2977 warnings.warn("Upcase class is deprecated, use upcaseTokens parse action instead", 2978 DeprecationWarning,stacklevel=2)
2979
2980 - def postParse( self, instring, loc, tokenlist ):
2981 return list(map( str.upper, tokenlist ))
2982 2983
2984 -class Combine(TokenConverter):
2985 """Converter to concatenate all matching tokens to a single string. 2986 By default, the matching patterns must also be contiguous in the input string; 2987 this can be disabled by specifying C{'adjacent=False'} in the constructor. 2988 """
2989 - def __init__( self, expr, joinString="", adjacent=True ):
2990 super(Combine,self).__init__( expr ) 2991 # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself 2992 if adjacent: 2993 self.leaveWhitespace() 2994 self.adjacent = adjacent 2995 self.skipWhitespace = True 2996 self.joinString = joinString 2997 self.callPreparse = True
2998
2999 - def ignore( self, other ):
3000 if self.adjacent: 3001 ParserElement.ignore(self, other) 3002 else: 3003 super( Combine, self).ignore( other ) 3004 return self
3005
3006 - def postParse( self, instring, loc, tokenlist ):
3007 retToks = tokenlist.copy() 3008 del retToks[:] 3009 retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) 3010 3011 if self.resultsName and retToks.haskeys(): 3012 return [ retToks ] 3013 else: 3014 return retToks
3015
3016 -class Group(TokenConverter):
3017 """Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions."""
3018 - def __init__( self, expr ):
3019 super(Group,self).__init__( expr ) 3020 self.saveAsList = True
3021
3022 - def postParse( self, instring, loc, tokenlist ):
3023 return [ tokenlist ]
3024
3025 -class Dict(TokenConverter):
3026 """Converter to return a repetitive expression as a list, but also as a dictionary. 3027 Each element can also be referenced using the first token in the expression as its key. 3028 Useful for tabular report scraping when the first column can be used as a item key. 3029 """
3030 - def __init__( self, expr ):
3031 super(Dict,self).__init__( expr ) 3032 self.saveAsList = True
3033
3034 - def postParse( self, instring, loc, tokenlist ):
3035 for i,tok in enumerate(tokenlist): 3036 if len(tok) == 0: 3037 continue 3038 ikey = tok[0] 3039 if isinstance(ikey,int): 3040 ikey = _ustr(tok[0]).strip() 3041 if len(tok)==1: 3042 tokenlist[ikey] = _ParseResultsWithOffset("",i) 3043 elif len(tok)==2 and not isinstance(tok[1],ParseResults): 3044 tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) 3045 else: 3046 dictvalue = tok.copy() #ParseResults(i) 3047 del dictvalue[0] 3048 if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): 3049 tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) 3050 else: 3051 tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) 3052 3053 if self.resultsName: 3054 return [ tokenlist ] 3055 else: 3056 return tokenlist
3057 3058
3059 -class Suppress(TokenConverter):
3060 """Converter for ignoring the results of a parsed expression."""
3061 - def postParse( self, instring, loc, tokenlist ):
3062 return []
3063
3064 - def suppress( self ):
3065 return self
3066 3067
3068 -class OnlyOnce(object):
3069 """Wrapper for parse actions, to ensure they are only called once."""
3070 - def __init__(self, methodCall):
3071 self.callable = _trim_arity(methodCall) 3072 self.called = False
3073 - def __call__(self,s,l,t):
3074 if not self.called: 3075 results = self.callable(s,l,t) 3076 self.called = True 3077 return results 3078 raise ParseException(s,l,"")
3079 - def reset(self):
3080 self.called = False
3081
3082 -def traceParseAction(f):
3083 """Decorator for debugging parse actions.""" 3084 f = _trim_arity(f) 3085 def z(*paArgs): 3086 thisFunc = f.func_name 3087 s,l,t = paArgs[-3:] 3088 if len(paArgs)>3: 3089 thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc 3090 sys.stderr.write( ">>entering %s(line: '%s', %d, %s)\n" % (thisFunc,line(l,s),l,t) ) 3091 try: 3092 ret = f(*paArgs) 3093 except Exception as exc: 3094 sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) 3095 raise 3096 sys.stderr.write( "<<leaving %s (ret: %s)\n" % (thisFunc,ret) ) 3097 return ret
3098 try: 3099 z.__name__ = f.__name__ 3100 except AttributeError: 3101 pass 3102 return z 3103 3104 # 3105 # global helpers 3106 #
3107 -def delimitedList( expr, delim=",", combine=False ):
3108 """Helper to define a delimited list of expressions - the delimiter defaults to ','. 3109 By default, the list elements and delimiters can have intervening whitespace, and 3110 comments, but this can be overridden by passing C{combine=True} in the constructor. 3111 If C{combine} is set to C{True}, the matching tokens are returned as a single token 3112 string, with the delimiters included; otherwise, the matching tokens are returned 3113 as a list of tokens, with the delimiters suppressed. 3114 """ 3115 dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." 3116 if combine: 3117 return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) 3118 else: 3119 return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName)
3120
3121 -def countedArray( expr, intExpr=None ):
3122 """Helper to define a counted list of expressions. 3123 This helper defines a pattern of the form:: 3124 integer expr expr expr... 3125 where the leading integer tells how many expr expressions follow. 3126 The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. 3127 """ 3128 arrayExpr = Forward() 3129 def countFieldParseAction(s,l,t): 3130 n = t[0] 3131 arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) 3132 return []
3133 if intExpr is None: 3134 intExpr = Word(nums).setParseAction(lambda t:int(t[0])) 3135 else: 3136 intExpr = intExpr.copy() 3137 intExpr.setName("arrayLen") 3138 intExpr.addParseAction(countFieldParseAction, callDuringTry=True) 3139 return ( intExpr + arrayExpr ) 3140
3141 -def _flatten(L):
3142 ret = [] 3143 for i in L: 3144 if isinstance(i,list): 3145 ret.extend(_flatten(i)) 3146 else: 3147 ret.append(i) 3148 return ret
3149
3150 -def matchPreviousLiteral(expr):
3151 """Helper to define an expression that is indirectly defined from 3152 the tokens matched in a previous expression, that is, it looks 3153 for a 'repeat' of a previous expression. For example:: 3154 first = Word(nums) 3155 second = matchPreviousLiteral(first) 3156 matchExpr = first + ":" + second 3157 will match C{"1:1"}, but not C{"1:2"}. Because this matches a 3158 previous literal, will also match the leading C{"1:1"} in C{"1:10"}. 3159 If this is not desired, use C{matchPreviousExpr}. 3160 Do *not* use with packrat parsing enabled. 3161 """ 3162 rep = Forward() 3163 def copyTokenToRepeater(s,l,t): 3164 if t: 3165 if len(t) == 1: 3166 rep << t[0] 3167 else: 3168 # flatten t tokens 3169 tflat = _flatten(t.asList()) 3170 rep << And( [ Literal(tt) for tt in tflat ] ) 3171 else: 3172 rep << Empty()
3173 expr.addParseAction(copyTokenToRepeater, callDuringTry=True) 3174 return rep 3175
3176 -def matchPreviousExpr(expr):
3177 """Helper to define an expression that is indirectly defined from 3178 the tokens matched in a previous expression, that is, it looks 3179 for a 'repeat' of a previous expression. For example:: 3180 first = Word(nums) 3181 second = matchPreviousExpr(first) 3182 matchExpr = first + ":" + second 3183 will match C{"1:1"}, but not C{"1:2"}. Because this matches by 3184 expressions, will *not* match the leading C{"1:1"} in C{"1:10"}; 3185 the expressions are evaluated first, and then compared, so 3186 C{"1"} is compared with C{"10"}. 3187 Do *not* use with packrat parsing enabled. 3188 """ 3189 rep = Forward() 3190 e2 = expr.copy() 3191 rep <<= e2 3192 def copyTokenToRepeater(s,l,t): 3193 matchTokens = _flatten(t.asList()) 3194 def mustMatchTheseTokens(s,l,t): 3195 theseTokens = _flatten(t.asList()) 3196 if theseTokens != matchTokens: 3197 raise ParseException("",0,"")
3198 rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) 3199 expr.addParseAction(copyTokenToRepeater, callDuringTry=True) 3200 return rep 3201
3203 #~ escape these chars: ^-] 3204 for c in r"\^-]": 3205 s = s.replace(c,_bslash+c) 3206 s = s.replace("\n",r"\n") 3207 s = s.replace("\t",r"\t") 3208 return _ustr(s)
3209
3210 -def oneOf( strs, caseless=False, useRegex=True ):
3211 """Helper to quickly define a set of alternative Literals, and makes sure to do 3212 longest-first testing when there is a conflict, regardless of the input order, 3213 but returns a C{L{MatchFirst}} for best performance. 3214 3215 Parameters: 3216 - strs - a string of space-delimited literals, or a list of string literals 3217 - caseless - (default=False) - treat all literals as caseless 3218 - useRegex - (default=True) - as an optimization, will generate a Regex 3219 object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or 3220 if creating a C{Regex} raises an exception) 3221 """ 3222 if caseless: 3223 isequal = ( lambda a,b: a.upper() == b.upper() ) 3224 masks = ( lambda a,b: b.upper().startswith(a.upper()) ) 3225 parseElementClass = CaselessLiteral 3226 else: 3227 isequal = ( lambda a,b: a == b ) 3228 masks = ( lambda a,b: b.startswith(a) ) 3229 parseElementClass = Literal 3230 3231 if isinstance(strs,basestring): 3232 symbols = strs.split() 3233 elif isinstance(strs, collections.Sequence): 3234 symbols = list(strs[:]) 3235 elif isinstance(strs, _generatorType): 3236 symbols = list(strs) 3237 else: 3238 warnings.warn("Invalid argument to oneOf, expected string or list", 3239 SyntaxWarning, stacklevel=2) 3240 3241 i = 0 3242 while i < len(symbols)-1: 3243 cur = symbols[i] 3244 for j,other in enumerate(symbols[i+1:]): 3245 if ( isequal(other, cur) ): 3246 del symbols[i+j+1] 3247 break 3248 elif ( masks(cur, other) ): 3249 del symbols[i+j+1] 3250 symbols.insert(i,other) 3251 cur = other 3252 break 3253 else: 3254 i += 1 3255 3256 if not caseless and useRegex: 3257 #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) 3258 try: 3259 if len(symbols)==len("".join(symbols)): 3260 return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ) 3261 else: 3262 return Regex( "|".join(re.escape(sym) for sym in symbols) ) 3263 except: 3264 warnings.warn("Exception creating Regex for oneOf, building MatchFirst", 3265 SyntaxWarning, stacklevel=2) 3266 3267 3268 # last resort, just use MatchFirst 3269 return MatchFirst( [ parseElementClass(sym) for sym in symbols ] )
3270
3271 -def dictOf( key, value ):
3272 """Helper to easily and clearly define a dictionary by specifying the respective patterns 3273 for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens 3274 in the proper order. The key pattern can include delimiting markers or punctuation, 3275 as long as they are suppressed, thereby leaving the significant key text. The value 3276 pattern can include named results, so that the C{Dict} results can include named token 3277 fields. 3278 """ 3279 return Dict( ZeroOrMore( Group ( key + value ) ) )
3280
3281 -def originalTextFor(expr, asString=True):
3282 """Helper to return the original, untokenized text for a given expression. Useful to 3283 restore the parsed fields of an HTML start tag into the raw tag text itself, or to 3284 revert separate tokens with intervening whitespace back to the original matching 3285 input text. Simpler to use than the parse action C{L{keepOriginalText}}, and does not 3286 require the inspect module to chase up the call stack. By default, returns a 3287 string containing the original parsed text. 3288 3289 If the optional C{asString} argument is passed as C{False}, then the return value is a 3290 C{L{ParseResults}} containing any results names that were originally matched, and a 3291 single token containing the original matched text from the input string. So if 3292 the expression passed to C{L{originalTextFor}} contains expressions with defined 3293 results names, you must set C{asString} to C{False} if you want to preserve those 3294 results name values.""" 3295 locMarker = Empty().setParseAction(lambda s,loc,t: loc) 3296 endlocMarker = locMarker.copy() 3297 endlocMarker.callPreparse = False 3298 matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") 3299 if asString: 3300 extractText = lambda s,l,t: s[t._original_start:t._original_end] 3301 else: 3302 def extractText(s,l,t): 3303 del t[:] 3304 t.insert(0, s[t._original_start:t._original_end]) 3305 del t["_original_start"] 3306 del t["_original_end"]
3307 matchExpr.setParseAction(extractText) 3308 return matchExpr 3309
3310 -def ungroup(expr):
3311 """Helper to undo pyparsing's default grouping of And expressions, even 3312 if all but one are non-empty.""" 3313 return TokenConverter(expr).setParseAction(lambda t:t[0]) 3314
3315 -def locatedExpr(expr):
3316 """Helper to decorate a returned token with its starting and ending locations in the input string. 3317 This helper adds the following results names: 3318 - locn_start = location where matched expression begins 3319 - locn_end = location where matched expression ends 3320 - value = the actual parsed results 3321 3322 Be careful if the input text contains C{<TAB>} characters, you may want to call 3323 C{L{ParserElement.parseWithTabs}} 3324 """ 3325 locator = Empty().setParseAction(lambda s,l,t: l) 3326 return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end"))
3327 3328 3329 # convenience constants for positional expressions 3330 empty = Empty().setName("empty") 3331 lineStart = LineStart().setName("lineStart") 3332 lineEnd = LineEnd().setName("lineEnd") 3333 stringStart = StringStart().setName("stringStart") 3334 stringEnd = StringEnd().setName("stringEnd") 3335 3336 _escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) 3337 _escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) 3338 _escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) 3339 _singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | Word(printables, excludeChars=r'\]', exact=1) 3340 _charRange = Group(_singleChar + Suppress("-") + _singleChar) 3341 _reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" 3342
3343 -def srange(s):
3344 r"""Helper to easily define string ranges for use in Word construction. Borrows 3345 syntax from regexp '[]' string range definitions:: 3346 srange("[0-9]") -> "0123456789" 3347 srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" 3348 srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" 3349 The input string must be enclosed in []'s, and the returned string is the expanded 3350 character set joined into a single string. 3351 The values enclosed in the []'s may be:: 3352 a single character 3353 an escaped character with a leading backslash (such as \- or \]) 3354 an escaped hex character with a leading '\x' (\x21, which is a '!' character) 3355 (\0x## is also supported for backwards compatibility) 3356 an escaped octal character with a leading '\0' (\041, which is a '!' character) 3357 a range of any of the above, separated by a dash ('a-z', etc.) 3358 any combination of the above ('aeiouy', 'a-zA-Z0-9_$', etc.) 3359 """ 3360 _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) 3361 try: 3362 return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) 3363 except: 3364 return ""
3365
3366 -def matchOnlyAtCol(n):
3367 """Helper method for defining parse actions that require matching at a specific 3368 column in the input text. 3369 """ 3370 def verifyCol(strg,locn,toks): 3371 if col(locn,strg) != n: 3372 raise ParseException(strg,locn,"matched token not at column %d" % n)
3373 return verifyCol 3374
3375 -def replaceWith(replStr):
3376 """Helper method for common parse actions that simply return a literal value. Especially 3377 useful when used with C{L{transformString<ParserElement.transformString>}()}. 3378 """ 3379 def _replFunc(*args): 3380 return [replStr]
3381 return _replFunc 3382
3383 -def removeQuotes(s,l,t):
3384 """Helper parse action for removing quotation marks from parsed quoted strings. 3385 To use, add this parse action to quoted string using:: 3386 quotedString.setParseAction( removeQuotes ) 3387 """ 3388 return t[0][1:-1]
3389
3390 -def upcaseTokens(s,l,t):
3391 """Helper parse action to convert tokens to upper case.""" 3392 return [ tt.upper() for tt in map(_ustr,t) ]
3393
3394 -def downcaseTokens(s,l,t):
3395 """Helper parse action to convert tokens to lower case.""" 3396 return [ tt.lower() for tt in map(_ustr,t) ]
3397
3398 -def keepOriginalText(s,startLoc,t):
3399 """DEPRECATED - use new helper method C{L{originalTextFor}}. 3400 Helper parse action to preserve original parsed text, 3401 overriding any nested parse actions.""" 3402 try: 3403 endloc = getTokensEndLoc() 3404 except ParseException: 3405 raise ParseFatalException("incorrect usage of keepOriginalText - may only be called as a parse action") 3406 del t[:] 3407 t += ParseResults(s[startLoc:endloc]) 3408 return t
3409
3410 -def getTokensEndLoc():
3411 """Method to be called from within a parse action to determine the end 3412 location of the parsed tokens.""" 3413 import inspect 3414 fstack = inspect.stack() 3415 try: 3416 # search up the stack (through intervening argument normalizers) for correct calling routine 3417 for f in fstack[2:]: 3418 if f[3] == "_parseNoCache": 3419 endloc = f[0].f_locals["loc"] 3420 return endloc 3421 else: 3422 raise ParseFatalException("incorrect usage of getTokensEndLoc - may only be called from within a parse action") 3423 finally: 3424 del fstack
3425
3426 -def _makeTags(tagStr, xml):
3427 """Internal helper to construct opening and closing tag expressions, given a tag name""" 3428 if isinstance(tagStr,basestring): 3429 resname = tagStr 3430 tagStr = Keyword(tagStr, caseless=not xml) 3431 else: 3432 resname = tagStr.name 3433 3434 tagAttrName = Word(alphas,alphanums+"_-:") 3435 if (xml): 3436 tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) 3437 openTag = Suppress("<") + tagStr("tag") + \ 3438 Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ 3439 Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") 3440 else: 3441 printablesLessRAbrack = "".join(c for c in printables if c not in ">") 3442 tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) 3443 openTag = Suppress("<") + tagStr("tag") + \ 3444 Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ 3445 Optional( Suppress("=") + tagAttrValue ) ))) + \ 3446 Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") 3447 closeTag = Combine(_L("</") + tagStr + ">") 3448 3449 openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % tagStr) 3450 closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % tagStr) 3451 openTag.tag = resname 3452 closeTag.tag = resname 3453 return openTag, closeTag
3454
3455 -def makeHTMLTags(tagStr):
3456 """Helper to construct opening and closing tag expressions for HTML, given a tag name""" 3457 return _makeTags( tagStr, False )
3458
3459 -def makeXMLTags(tagStr):
3460 """Helper to construct opening and closing tag expressions for XML, given a tag name""" 3461 return _makeTags( tagStr, True )
3462
3463 -def withAttribute(*args,**attrDict):
3464 """Helper to create a validating parse action to be used with start tags created 3465 with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag 3466 with a required attribute value, to avoid false matches on common tags such as 3467 C{<TD>} or C{<DIV>}. 3468 3469 Call C{withAttribute} with a series of attribute names and values. Specify the list 3470 of filter attributes names and values as: 3471 - keyword arguments, as in C{(align="right")}, or 3472 - as an explicit dict with C{**} operator, when an attribute name is also a Python 3473 reserved word, as in C{**{"class":"Customer", "align":"right"}} 3474 - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) 3475 For attribute names with a namespace prefix, you must use the second form. Attribute 3476 names are matched insensitive to upper/lower case. 3477 3478 To verify that the attribute exists, but without specifying a value, pass 3479 C{withAttribute.ANY_VALUE} as the value. 3480 """ 3481 if args: 3482 attrs = args[:] 3483 else: 3484 attrs = attrDict.items() 3485 attrs = [(k,v) for k,v in attrs] 3486 def pa(s,l,tokens): 3487 for attrName,attrValue in attrs: 3488 if attrName not in tokens: 3489 raise ParseException(s,l,"no matching attribute " + attrName) 3490 if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: 3491 raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % 3492 (attrName, tokens[attrName], attrValue))
3493 return pa 3494 withAttribute.ANY_VALUE = object() 3495 3496 opAssoc = _Constants() 3497 opAssoc.LEFT = object() 3498 opAssoc.RIGHT = object() 3499
3500 -def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ):
3501 """Helper method for constructing grammars of expressions made up of 3502 operators working in a precedence hierarchy. Operators may be unary or 3503 binary, left- or right-associative. Parse actions can also be attached 3504 to operator expressions. 3505 3506 Parameters: 3507 - baseExpr - expression representing the most basic element for the nested 3508 - opList - list of tuples, one for each operator precedence level in the 3509 expression grammar; each tuple is of the form 3510 (opExpr, numTerms, rightLeftAssoc, parseAction), where: 3511 - opExpr is the pyparsing expression for the operator; 3512 may also be a string, which will be converted to a Literal; 3513 if numTerms is 3, opExpr is a tuple of two expressions, for the 3514 two operators separating the 3 terms 3515 - numTerms is the number of terms for this operator (must 3516 be 1, 2, or 3) 3517 - rightLeftAssoc is the indicator whether the operator is 3518 right or left associative, using the pyparsing-defined 3519 constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. 3520 - parseAction is the parse action to be associated with 3521 expressions matching this operator expression (the 3522 parse action tuple member may be omitted) 3523 - lpar - expression for matching left-parentheses (default=Suppress('(')) 3524 - rpar - expression for matching right-parentheses (default=Suppress(')')) 3525 """ 3526 ret = Forward() 3527 lastExpr = baseExpr | ( lpar + ret + rpar ) 3528 for i,operDef in enumerate(opList): 3529 opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] 3530 if arity == 3: 3531 if opExpr is None or len(opExpr) != 2: 3532 raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") 3533 opExpr1, opExpr2 = opExpr 3534 thisExpr = Forward()#.setName("expr%d" % i) 3535 if rightLeftAssoc == opAssoc.LEFT: 3536 if arity == 1: 3537 matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) 3538 elif arity == 2: 3539 if opExpr is not None: 3540 matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) 3541 else: 3542 matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) 3543 elif arity == 3: 3544 matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ 3545 Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) 3546 else: 3547 raise ValueError("operator must be unary (1), binary (2), or ternary (3)") 3548 elif rightLeftAssoc == opAssoc.RIGHT: 3549 if arity == 1: 3550 # try to avoid LR with this extra test 3551 if not isinstance(opExpr, Optional): 3552 opExpr = Optional(opExpr) 3553 matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) 3554 elif arity == 2: 3555 if opExpr is not None: 3556 matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) 3557 else: 3558 matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) 3559 elif arity == 3: 3560 matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ 3561 Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) 3562 else: 3563 raise ValueError("operator must be unary (1), binary (2), or ternary (3)") 3564 else: 3565 raise ValueError("operator must indicate right or left associativity") 3566 if pa: 3567 matchExpr.setParseAction( pa ) 3568 thisExpr <<= ( matchExpr | lastExpr ) 3569 lastExpr = thisExpr 3570 ret <<= lastExpr 3571 return ret
3572 operatorPrecedence = infixNotation 3573 3574 dblQuotedString = Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*"').setName("string enclosed in double quotes") 3575 sglQuotedString = Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*'").setName("string enclosed in single quotes") 3576 quotedString = Regex(r'''(?:"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*")|(?:'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*')''').setName("quotedString using single or double quotes") 3577 unicodeString = Combine(_L('u') + quotedString.copy()) 3578
3579 -def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()):
3580 """Helper method for defining nested lists enclosed in opening and closing 3581 delimiters ("(" and ")" are the default). 3582 3583 Parameters: 3584 - opener - opening character for a nested list (default="("); can also be a pyparsing expression 3585 - closer - closing character for a nested list (default=")"); can also be a pyparsing expression 3586 - content - expression for items within the nested lists (default=None) 3587 - ignoreExpr - expression for ignoring opening and closing delimiters (default=quotedString) 3588 3589 If an expression is not provided for the content argument, the nested 3590 expression will capture all whitespace-delimited content between delimiters 3591 as a list of separate values. 3592 3593 Use the C{ignoreExpr} argument to define expressions that may contain 3594 opening or closing characters that should not be treated as opening 3595 or closing characters for nesting, such as quotedString or a comment 3596 expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. 3597 The default is L{quotedString}, but if no expressions are to be ignored, 3598 then pass C{None} for this argument. 3599 """ 3600 if opener == closer: 3601 raise ValueError("opening and closing strings cannot be the same") 3602 if content is None: 3603 if isinstance(opener,basestring) and isinstance(closer,basestring): 3604 if len(opener) == 1 and len(closer)==1: 3605 if ignoreExpr is not None: 3606 content = (Combine(OneOrMore(~ignoreExpr + 3607 CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) 3608 ).setParseAction(lambda t:t[0].strip())) 3609 else: 3610 content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS 3611 ).setParseAction(lambda t:t[0].strip())) 3612 else: 3613 if ignoreExpr is not None: 3614 content = (Combine(OneOrMore(~ignoreExpr + 3615 ~Literal(opener) + ~Literal(closer) + 3616 CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) 3617 ).setParseAction(lambda t:t[0].strip())) 3618 else: 3619 content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + 3620 CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) 3621 ).setParseAction(lambda t:t[0].strip())) 3622 else: 3623 raise ValueError("opening and closing arguments must be strings if no content expression is given") 3624 ret = Forward() 3625 if ignoreExpr is not None: 3626 ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) 3627 else: 3628 ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) 3629 return ret
3630
3631 -def indentedBlock(blockStatementExpr, indentStack, indent=True):
3632 """Helper method for defining space-delimited indentation blocks, such as 3633 those used to define block statements in Python source code. 3634 3635 Parameters: 3636 - blockStatementExpr - expression defining syntax of statement that 3637 is repeated within the indented block 3638 - indentStack - list created by caller to manage indentation stack 3639 (multiple statementWithIndentedBlock expressions within a single grammar 3640 should share a common indentStack) 3641 - indent - boolean indicating whether block must be indented beyond the 3642 the current level; set to False for block of left-most statements 3643 (default=True) 3644 3645 A valid block must contain at least one C{blockStatement}. 3646 """ 3647 def checkPeerIndent(s,l,t): 3648 if l >= len(s): return 3649 curCol = col(l,s) 3650 if curCol != indentStack[-1]: 3651 if curCol > indentStack[-1]: 3652 raise ParseFatalException(s,l,"illegal nesting") 3653 raise ParseException(s,l,"not a peer entry")
3654 3655 def checkSubIndent(s,l,t): 3656 curCol = col(l,s) 3657 if curCol > indentStack[-1]: 3658 indentStack.append( curCol ) 3659 else: 3660 raise ParseException(s,l,"not a subentry") 3661 3662 def checkUnindent(s,l,t): 3663 if l >= len(s): return 3664 curCol = col(l,s) 3665 if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): 3666 raise ParseException(s,l,"not an unindent") 3667 indentStack.pop() 3668 3669 NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) 3670 INDENT = Empty() + Empty().setParseAction(checkSubIndent) 3671 PEER = Empty().setParseAction(checkPeerIndent) 3672 UNDENT = Empty().setParseAction(checkUnindent) 3673 if indent: 3674 smExpr = Group( Optional(NL) + 3675 #~ FollowedBy(blockStatementExpr) + 3676 INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) 3677 else: 3678 smExpr = Group( Optional(NL) + 3679 (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) 3680 blockStatementExpr.ignore(_bslash + LineEnd()) 3681 return smExpr 3682 3683 alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") 3684 punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") 3685 3686 anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:")) 3687 commonHTMLEntity = Combine(_L("&") + oneOf("gt lt amp nbsp quot").setResultsName("entity") +";").streamline() 3688 _htmlEntityMap = dict(zip("gt lt amp nbsp quot".split(),'><& "')) 3689 replaceHTMLEntity = lambda t : t.entity in _htmlEntityMap and _htmlEntityMap[t.entity] or None 3690 3691 # it's easy to get these comment structures wrong - they're very common, so may as well make them available 3692 cStyleComment = Regex(r"/\*(?:[^*]*\*+)+?/").setName("C style comment") 3693 3694 htmlComment = Regex(r"<!--[\s\S]*?-->") 3695 restOfLine = Regex(r".*").leaveWhitespace() 3696 dblSlashComment = Regex(r"\/\/(\\\n|.)*").setName("// comment") 3697 cppStyleComment = Regex(r"/(?:\*(?:[^*]*\*+)+?/|/[^\n]*(?:\n[^\n]*)*?(?:(?<!\\)|\Z))").setName("C++ style comment") 3698 3699 javaStyleComment = cppStyleComment 3700 pythonStyleComment = Regex(r"#.*").setName("Python style comment") 3701 _commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + 3702 Optional( Word(" \t") + 3703 ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") 3704 commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") 3705 3706 3707 if __name__ == "__main__": 3708
3709 - def test( teststring ):
3710 try: 3711 tokens = simpleSQL.parseString( teststring ) 3712 tokenlist = tokens.asList() 3713 print (teststring + "->" + str(tokenlist)) 3714 print ("tokens = " + str(tokens)) 3715 print ("tokens.columns = " + str(tokens.columns)) 3716 print ("tokens.tables = " + str(tokens.tables)) 3717 print (tokens.asXML("SQL",True)) 3718 except ParseBaseException as err: 3719 print (teststring + "->") 3720 print (err.line) 3721 print (" "*(err.column-1) + "^") 3722 print (err) 3723 print()
3724 3725 selectToken = CaselessLiteral( "select" ) 3726 fromToken = CaselessLiteral( "from" ) 3727 3728 ident = Word( alphas, alphanums + "_$" ) 3729 columnName = delimitedList( ident, ".", combine=True ).setParseAction( upcaseTokens ) 3730 columnNameList = Group( delimitedList( columnName ) )#.setName("columns") 3731 tableName = delimitedList( ident, ".", combine=True ).setParseAction( upcaseTokens ) 3732 tableNameList = Group( delimitedList( tableName ) )#.setName("tables") 3733 simpleSQL = ( selectToken + \ 3734 ( '*' | columnNameList ).setResultsName( "columns" ) + \ 3735 fromToken + \ 3736 tableNameList.setResultsName( "tables" ) ) 3737 3738 test( "SELECT * from XYZZY, ABC" ) 3739 test( "select * from SYS.XYZZY" ) 3740 test( "Select A from Sys.dual" ) 3741 test( "Select AA,BB,CC from Sys.dual" ) 3742 test( "Select A, B, C from Sys.dual" ) 3743 test( "Select A, B, C from Sys.dual" ) 3744 test( "Xelect A, B, C from Sys.dual" ) 3745 test( "Select A, B, C frox Sys.dual" ) 3746 test( "Select" ) 3747 test( "Select ^^^ frox Sys.dual" ) 3748 test( "Select A, B, C from Sys.dual, Table2 " ) 3749
pyparsing-2.0.3/htmldoc/redirect.html0000664000175000017500000000520612322542217016676 0ustar barrybarryEpydoc Redirect Page

Epydoc Auto-redirect page

When javascript is enabled, this page will redirect URLs of the form redirect.html#dotted.name to the documentation for the object with the given fully-qualified dotted name.

 

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.White-class.html0000664000175000017500000005321712322542216023312 0ustar barrybarry pyparsing.pyparsing.White
Package pyparsing :: Module pyparsing :: Class White
[frames] | no frames]

Class White

source code

   object --+        
            |        
ParserElement --+    
                |    
            Token --+
                    |
                   White

Special matching class for matching whitespace. Normally, whitespace is ignored by pyparsing grammars. This class is included when some whitespace structures are significant. Define with a string containing the whitespace characters to be matched; default is " \t\r\n". Also takes optional min, max, and exact arguments, as defined for the Word class.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, ws=' \t\r\n', min=1, max=0, exact=0)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables
  whiteStrs = {'\t': '<TAB>', '\n': '<LF>', '\x0c': '<FF>', '\r'...

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, ws=' \t\r\n', min=1, max=0, exact=0)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

Class Variable Details

whiteStrs

Value:
{'\t': '<TAB>',
 '''
''': '<LF>',
 '\x0c': '<FF>',
 '\r': '<CR>',
 ' ': '<SPC>'}

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.OnlyOnce-class.html0000664000175000017500000002160712322542216023756 0ustar barrybarry pyparsing.pyparsing.OnlyOnce
Package pyparsing :: Module pyparsing :: Class OnlyOnce
[frames] | no frames]

Class OnlyOnce

source code

object --+
         |
        OnlyOnce

Wrapper for parse actions, to ensure they are only called once.

Instance Methods
 
__init__(self, methodCall)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
__call__(self, s, l, t) source code
 
reset(self) source code

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties

Inherited from object: __class__

Method Details

__init__(self, methodCall)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

pyparsing-2.0.3/htmldoc/api-objects.txt0000664000175000017500000077714012322542217017165 0ustar barrybarrypyparsing.pyparsing pyparsing.pyparsing-module.html pyparsing.pyparsing.removeQuotes pyparsing.pyparsing-module.html#removeQuotes pyparsing.pyparsing.alphanums pyparsing.pyparsing-module.html#alphanums pyparsing.pyparsing._bslash pyparsing.pyparsing-module.html#_bslash pyparsing.pyparsing._escapedPunc pyparsing.pyparsing-module.html#_escapedPunc pyparsing.pyparsing._escapedOctChar pyparsing.pyparsing-module.html#_escapedOctChar pyparsing.pyparsing.PY_3 pyparsing.pyparsing-module.html#PY_3 pyparsing.pyparsing._trim_arity pyparsing.pyparsing-module.html#_trim_arity pyparsing.pyparsing.infixNotation pyparsing.pyparsing-module.html#infixNotation pyparsing.pyparsing._defaultStartDebugAction pyparsing.pyparsing-module.html#_defaultStartDebugAction pyparsing.pyparsing._charRange pyparsing.pyparsing-module.html#_charRange pyparsing.pyparsing.delimitedList pyparsing.pyparsing-module.html#delimitedList pyparsing.pyparsing.lineEnd pyparsing.pyparsing-module.html#lineEnd pyparsing.pyparsing.dictOf pyparsing.pyparsing-module.html#dictOf pyparsing.pyparsing.makeHTMLTags pyparsing.pyparsing-module.html#makeHTMLTags pyparsing.pyparsing.commaSeparatedList pyparsing.pyparsing-module.html#commaSeparatedList pyparsing.pyparsing.stringStart pyparsing.pyparsing-module.html#stringStart pyparsing.pyparsing._makeTags pyparsing.pyparsing-module.html#_makeTags pyparsing.pyparsing._reBracketExpr pyparsing.pyparsing-module.html#_reBracketExpr pyparsing.pyparsing.oneOf pyparsing.pyparsing-module.html#oneOf pyparsing.pyparsing._flatten pyparsing.pyparsing-module.html#_flatten pyparsing.pyparsing.pythonStyleComment pyparsing.pyparsing-module.html#pythonStyleComment pyparsing.pyparsing.__versionTime__ pyparsing.pyparsing-module.html#__versionTime__ pyparsing.pyparsing.keepOriginalText pyparsing.pyparsing-module.html#keepOriginalText pyparsing.pyparsing._ustr pyparsing.pyparsing-module.html#_ustr pyparsing.pyparsing.matchPreviousExpr pyparsing.pyparsing-module.html#matchPreviousExpr pyparsing.pyparsing.matchOnlyAtCol pyparsing.pyparsing-module.html#matchOnlyAtCol pyparsing.pyparsing.downcaseTokens pyparsing.pyparsing-module.html#downcaseTokens pyparsing.pyparsing._commasepitem pyparsing.pyparsing-module.html#_commasepitem pyparsing.pyparsing._defaultSuccessDebugAction pyparsing.pyparsing-module.html#_defaultSuccessDebugAction pyparsing.pyparsing.lineno pyparsing.pyparsing-module.html#lineno pyparsing.pyparsing.replaceWith pyparsing.pyparsing-module.html#replaceWith pyparsing.pyparsing.alphas8bit pyparsing.pyparsing-module.html#alphas8bit pyparsing.pyparsing._escapeRegexRangeChars pyparsing.pyparsing-module.html#_escapeRegexRangeChars pyparsing.pyparsing._singleChar pyparsing.pyparsing-module.html#_singleChar pyparsing.pyparsing.unicodeString pyparsing.pyparsing-module.html#unicodeString pyparsing.pyparsing.alphas pyparsing.pyparsing-module.html#alphas pyparsing.pyparsing.javaStyleComment pyparsing.pyparsing-module.html#javaStyleComment pyparsing.pyparsing.stringEnd pyparsing.pyparsing-module.html#stringEnd pyparsing.pyparsing.anyCloseTag pyparsing.pyparsing-module.html#anyCloseTag pyparsing.pyparsing.cppStyleComment pyparsing.pyparsing-module.html#cppStyleComment pyparsing.pyparsing.col pyparsing.pyparsing-module.html#col pyparsing.pyparsing.originalTextFor pyparsing.pyparsing-module.html#originalTextFor pyparsing.pyparsing._optionalNotMatched pyparsing.pyparsing-module.html#_optionalNotMatched pyparsing.pyparsing.makeXMLTags pyparsing.pyparsing-module.html#makeXMLTags pyparsing.pyparsing.singleArgBuiltins pyparsing.pyparsing-module.html#singleArgBuiltins pyparsing.pyparsing.traceParseAction pyparsing.pyparsing-module.html#traceParseAction pyparsing.pyparsing.quotedString pyparsing.pyparsing-module.html#quotedString pyparsing.pyparsing.withAttribute pyparsing.pyparsing-module.html#withAttribute pyparsing.pyparsing.lineStart pyparsing.pyparsing-module.html#lineStart pyparsing.pyparsing.matchPreviousLiteral pyparsing.pyparsing-module.html#matchPreviousLiteral pyparsing.pyparsing.empty pyparsing.pyparsing-module.html#empty pyparsing.pyparsing._htmlEntityMap pyparsing.pyparsing-module.html#_htmlEntityMap pyparsing.pyparsing.getTokensEndLoc pyparsing.pyparsing-module.html#getTokensEndLoc pyparsing.pyparsing.ungroup pyparsing.pyparsing-module.html#ungroup pyparsing.pyparsing.anyOpenTag pyparsing.pyparsing-module.html#anyOpenTag pyparsing.pyparsing.line pyparsing.pyparsing-module.html#line pyparsing.pyparsing.operatorPrecedence pyparsing.pyparsing-module.html#operatorPrecedence pyparsing.pyparsing.__doc__ pyparsing.pyparsing-module.html#__doc__ pyparsing.pyparsing.cStyleComment pyparsing.pyparsing-module.html#cStyleComment pyparsing.pyparsing.upcaseTokens pyparsing.pyparsing-module.html#upcaseTokens pyparsing.pyparsing.opAssoc pyparsing.pyparsing-module.html#opAssoc pyparsing.pyparsing.punc8bit pyparsing.pyparsing-module.html#punc8bit pyparsing.pyparsing.locatedExpr pyparsing.pyparsing-module.html#locatedExpr pyparsing.pyparsing.sglQuotedString pyparsing.pyparsing-module.html#sglQuotedString pyparsing.pyparsing.srange pyparsing.pyparsing-module.html#srange pyparsing.pyparsing.dblSlashComment pyparsing.pyparsing-module.html#dblSlashComment pyparsing.pyparsing._defaultExceptionDebugAction pyparsing.pyparsing-module.html#_defaultExceptionDebugAction pyparsing.pyparsing.nullDebugAction pyparsing.pyparsing-module.html#nullDebugAction pyparsing.pyparsing.unichr pyparsing.pyparsing-module.html#unichr pyparsing.pyparsing.dblQuotedString pyparsing.pyparsing-module.html#dblQuotedString pyparsing.pyparsing.commonHTMLEntity pyparsing.pyparsing-module.html#commonHTMLEntity pyparsing.pyparsing.__package__ pyparsing.pyparsing-module.html#__package__ pyparsing.pyparsing.fname pyparsing.pyparsing-module.html#fname pyparsing.pyparsing.nestedExpr pyparsing.pyparsing-module.html#nestedExpr pyparsing.pyparsing.htmlComment pyparsing.pyparsing-module.html#htmlComment pyparsing.pyparsing.nums pyparsing.pyparsing-module.html#nums pyparsing.pyparsing.countedArray pyparsing.pyparsing-module.html#countedArray pyparsing.pyparsing.restOfLine pyparsing.pyparsing-module.html#restOfLine pyparsing.pyparsing._xml_escape pyparsing.pyparsing-module.html#_xml_escape pyparsing.pyparsing._MAX_INT pyparsing.pyparsing-module.html#_MAX_INT pyparsing.pyparsing._escapedHexChar pyparsing.pyparsing-module.html#_escapedHexChar pyparsing.pyparsing.hexnums pyparsing.pyparsing-module.html#hexnums pyparsing.pyparsing.indentedBlock pyparsing.pyparsing-module.html#indentedBlock pyparsing.pyparsing.replaceHTMLEntity pyparsing.pyparsing-module.html#replaceHTMLEntity pyparsing.pyparsing.printables pyparsing.pyparsing-module.html#printables pyparsing.pyparsing.And pyparsing.pyparsing.And-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.And.__str__ pyparsing.pyparsing.And-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParseExpression.append pyparsing.pyparsing.ParseExpression-class.html#append pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.And.__slotnames__ pyparsing.pyparsing.And-class.html#__slotnames__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.And.parseImpl pyparsing.pyparsing.And-class.html#parseImpl pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.And.__init__ pyparsing.pyparsing.And-class.html#__init__ pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseExpression.leaveWhitespace pyparsing.pyparsing.ParseExpression-class.html#leaveWhitespace pyparsing.pyparsing.ParseExpression.__getitem__ pyparsing.pyparsing.ParseExpression-class.html#__getitem__ pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParseExpression.setResultsName pyparsing.pyparsing.ParseExpression-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseExpression.streamline pyparsing.pyparsing.ParseExpression-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseExpression.validate pyparsing.pyparsing.ParseExpression-class.html#validate pyparsing.pyparsing.ParseExpression.copy pyparsing.pyparsing.ParseExpression-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.And.__iadd__ pyparsing.pyparsing.And-class.html#__iadd__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseExpression.ignore pyparsing.pyparsing.ParseExpression-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.And.checkRecursion pyparsing.pyparsing.And-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.CaselessKeyword pyparsing.pyparsing.CaselessKeyword-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.CaselessKeyword.__init__ pyparsing.pyparsing.CaselessKeyword-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.Keyword.setDefaultKeywordChars pyparsing.pyparsing.Keyword-class.html#setDefaultKeywordChars pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.CaselessKeyword.parseImpl pyparsing.pyparsing.CaselessKeyword-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.Keyword.DEFAULT_KEYWORD_CHARS pyparsing.pyparsing.Keyword-class.html#DEFAULT_KEYWORD_CHARS pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.Keyword.copy pyparsing.pyparsing.Keyword-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.CaselessLiteral pyparsing.pyparsing.CaselessLiteral-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.CaselessLiteral.__init__ pyparsing.pyparsing.CaselessLiteral-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.Literal.__slotnames__ pyparsing.pyparsing.Literal-class.html#__slotnames__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.CaselessLiteral.parseImpl pyparsing.pyparsing.CaselessLiteral-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.CharsNotIn pyparsing.pyparsing.CharsNotIn-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.CharsNotIn.__str__ pyparsing.pyparsing.CharsNotIn-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.CharsNotIn.__init__ pyparsing.pyparsing.CharsNotIn-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.CharsNotIn.parseImpl pyparsing.pyparsing.CharsNotIn-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.Combine pyparsing.pyparsing.Combine-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParseElementEnhance.__str__ pyparsing.pyparsing.ParseElementEnhance-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.Combine.__init__ pyparsing.pyparsing.Combine-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.Combine.__slotnames__ pyparsing.pyparsing.Combine-class.html#__slotnames__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.ParseElementEnhance.parseImpl pyparsing.pyparsing.ParseElementEnhance-class.html#parseImpl pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.Combine.postParse pyparsing.pyparsing.Combine-class.html#postParse pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseElementEnhance.leaveWhitespace pyparsing.pyparsing.ParseElementEnhance-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseElementEnhance.streamline pyparsing.pyparsing.ParseElementEnhance-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseElementEnhance.validate pyparsing.pyparsing.ParseElementEnhance-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.Combine.ignore pyparsing.pyparsing.Combine-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance.checkRecursion pyparsing.pyparsing.ParseElementEnhance-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.Dict pyparsing.pyparsing.Dict-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParseElementEnhance.__str__ pyparsing.pyparsing.ParseElementEnhance-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.Dict.__init__ pyparsing.pyparsing.Dict-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.Dict.__slotnames__ pyparsing.pyparsing.Dict-class.html#__slotnames__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.ParseElementEnhance.parseImpl pyparsing.pyparsing.ParseElementEnhance-class.html#parseImpl pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.Dict.postParse pyparsing.pyparsing.Dict-class.html#postParse pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseElementEnhance.leaveWhitespace pyparsing.pyparsing.ParseElementEnhance-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseElementEnhance.streamline pyparsing.pyparsing.ParseElementEnhance-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseElementEnhance.validate pyparsing.pyparsing.ParseElementEnhance-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseElementEnhance.ignore pyparsing.pyparsing.ParseElementEnhance-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance.checkRecursion pyparsing.pyparsing.ParseElementEnhance-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.Each pyparsing.pyparsing.Each-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.Each.__str__ pyparsing.pyparsing.Each-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.ParseExpression.append pyparsing.pyparsing.ParseExpression-class.html#append pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.Each.parseImpl pyparsing.pyparsing.Each-class.html#parseImpl pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.Each.__init__ pyparsing.pyparsing.Each-class.html#__init__ pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseExpression.leaveWhitespace pyparsing.pyparsing.ParseExpression-class.html#leaveWhitespace pyparsing.pyparsing.ParseExpression.__getitem__ pyparsing.pyparsing.ParseExpression-class.html#__getitem__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParseExpression.setResultsName pyparsing.pyparsing.ParseExpression-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseExpression.streamline pyparsing.pyparsing.ParseExpression-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseExpression.validate pyparsing.pyparsing.ParseExpression-class.html#validate pyparsing.pyparsing.ParseExpression.copy pyparsing.pyparsing.ParseExpression-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseExpression.ignore pyparsing.pyparsing.ParseExpression-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.Each.checkRecursion pyparsing.pyparsing.Each-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.Empty pyparsing.pyparsing.Empty-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.Empty.__init__ pyparsing.pyparsing.Empty-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.ParserElement.parseImpl pyparsing.pyparsing.ParserElement-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.FollowedBy pyparsing.pyparsing.FollowedBy-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParseElementEnhance.__str__ pyparsing.pyparsing.ParseElementEnhance-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.FollowedBy.__init__ pyparsing.pyparsing.FollowedBy-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.FollowedBy.parseImpl pyparsing.pyparsing.FollowedBy-class.html#parseImpl pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseElementEnhance.leaveWhitespace pyparsing.pyparsing.ParseElementEnhance-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseElementEnhance.streamline pyparsing.pyparsing.ParseElementEnhance-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseElementEnhance.validate pyparsing.pyparsing.ParseElementEnhance-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseElementEnhance.ignore pyparsing.pyparsing.ParseElementEnhance-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance.checkRecursion pyparsing.pyparsing.ParseElementEnhance-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.Forward pyparsing.pyparsing.Forward-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.Forward.__str__ pyparsing.pyparsing.Forward-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.Forward.__init__ pyparsing.pyparsing.Forward-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.ParseElementEnhance.parseImpl pyparsing.pyparsing.ParseElementEnhance-class.html#parseImpl pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.Forward.leaveWhitespace pyparsing.pyparsing.Forward-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.Forward.streamline pyparsing.pyparsing.Forward-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.Forward.__lshift__ pyparsing.pyparsing.Forward-class.html#__lshift__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.Forward.validate pyparsing.pyparsing.Forward-class.html#validate pyparsing.pyparsing.Forward.copy pyparsing.pyparsing.Forward-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.Forward.__ilshift__ pyparsing.pyparsing.Forward-class.html#__ilshift__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseElementEnhance.ignore pyparsing.pyparsing.ParseElementEnhance-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance.checkRecursion pyparsing.pyparsing.ParseElementEnhance-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.GoToColumn pyparsing.pyparsing.GoToColumn-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.GoToColumn.__init__ pyparsing.pyparsing.GoToColumn-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.GoToColumn.parseImpl pyparsing.pyparsing.GoToColumn-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.GoToColumn.preParse pyparsing.pyparsing.GoToColumn-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.Group pyparsing.pyparsing.Group-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParseElementEnhance.__str__ pyparsing.pyparsing.ParseElementEnhance-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.Group.__init__ pyparsing.pyparsing.Group-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.Group.__slotnames__ pyparsing.pyparsing.Group-class.html#__slotnames__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.ParseElementEnhance.parseImpl pyparsing.pyparsing.ParseElementEnhance-class.html#parseImpl pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.Group.postParse pyparsing.pyparsing.Group-class.html#postParse pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseElementEnhance.leaveWhitespace pyparsing.pyparsing.ParseElementEnhance-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseElementEnhance.streamline pyparsing.pyparsing.ParseElementEnhance-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseElementEnhance.validate pyparsing.pyparsing.ParseElementEnhance-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseElementEnhance.ignore pyparsing.pyparsing.ParseElementEnhance-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance.checkRecursion pyparsing.pyparsing.ParseElementEnhance-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.Keyword pyparsing.pyparsing.Keyword-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.Keyword.__init__ pyparsing.pyparsing.Keyword-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.Keyword.setDefaultKeywordChars pyparsing.pyparsing.Keyword-class.html#setDefaultKeywordChars pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.Keyword.parseImpl pyparsing.pyparsing.Keyword-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.Keyword.DEFAULT_KEYWORD_CHARS pyparsing.pyparsing.Keyword-class.html#DEFAULT_KEYWORD_CHARS pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.Keyword.copy pyparsing.pyparsing.Keyword-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.LineEnd pyparsing.pyparsing.LineEnd-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.LineEnd.__init__ pyparsing.pyparsing.LineEnd-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.LineEnd.__slotnames__ pyparsing.pyparsing.LineEnd-class.html#__slotnames__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.LineEnd.parseImpl pyparsing.pyparsing.LineEnd-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.LineStart pyparsing.pyparsing.LineStart-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.LineStart.__init__ pyparsing.pyparsing.LineStart-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.LineStart.parseImpl pyparsing.pyparsing.LineStart-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.LineStart.preParse pyparsing.pyparsing.LineStart-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.Literal pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.Literal.__init__ pyparsing.pyparsing.Literal-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.Literal.__slotnames__ pyparsing.pyparsing.Literal-class.html#__slotnames__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.Literal.parseImpl pyparsing.pyparsing.Literal-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.MatchFirst pyparsing.pyparsing.MatchFirst-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.MatchFirst.__str__ pyparsing.pyparsing.MatchFirst-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.ParseExpression.append pyparsing.pyparsing.ParseExpression-class.html#append pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.MatchFirst.parseImpl pyparsing.pyparsing.MatchFirst-class.html#parseImpl pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.MatchFirst.__init__ pyparsing.pyparsing.MatchFirst-class.html#__init__ pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseExpression.leaveWhitespace pyparsing.pyparsing.ParseExpression-class.html#leaveWhitespace pyparsing.pyparsing.ParseExpression.__getitem__ pyparsing.pyparsing.ParseExpression-class.html#__getitem__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParseExpression.setResultsName pyparsing.pyparsing.ParseExpression-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseExpression.streamline pyparsing.pyparsing.ParseExpression-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseExpression.validate pyparsing.pyparsing.ParseExpression-class.html#validate pyparsing.pyparsing.ParseExpression.copy pyparsing.pyparsing.ParseExpression-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseExpression.ignore pyparsing.pyparsing.ParseExpression-class.html#ignore pyparsing.pyparsing.MatchFirst.__ior__ pyparsing.pyparsing.MatchFirst-class.html#__ior__ pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.MatchFirst.checkRecursion pyparsing.pyparsing.MatchFirst-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.NoMatch pyparsing.pyparsing.NoMatch-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.NoMatch.__init__ pyparsing.pyparsing.NoMatch-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.NoMatch.parseImpl pyparsing.pyparsing.NoMatch-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.NotAny pyparsing.pyparsing.NotAny-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.NotAny.__str__ pyparsing.pyparsing.NotAny-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.NotAny.__init__ pyparsing.pyparsing.NotAny-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.NotAny.__slotnames__ pyparsing.pyparsing.NotAny-class.html#__slotnames__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.NotAny.parseImpl pyparsing.pyparsing.NotAny-class.html#parseImpl pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseElementEnhance.leaveWhitespace pyparsing.pyparsing.ParseElementEnhance-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseElementEnhance.streamline pyparsing.pyparsing.ParseElementEnhance-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseElementEnhance.validate pyparsing.pyparsing.ParseElementEnhance-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseElementEnhance.ignore pyparsing.pyparsing.ParseElementEnhance-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance.checkRecursion pyparsing.pyparsing.ParseElementEnhance-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.OneOrMore pyparsing.pyparsing.OneOrMore-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.OneOrMore.__str__ pyparsing.pyparsing.OneOrMore-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.ParseElementEnhance.__init__ pyparsing.pyparsing.ParseElementEnhance-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.OneOrMore.__slotnames__ pyparsing.pyparsing.OneOrMore-class.html#__slotnames__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.OneOrMore.parseImpl pyparsing.pyparsing.OneOrMore-class.html#parseImpl pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseElementEnhance.leaveWhitespace pyparsing.pyparsing.ParseElementEnhance-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.OneOrMore.setResultsName pyparsing.pyparsing.OneOrMore-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseElementEnhance.streamline pyparsing.pyparsing.ParseElementEnhance-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseElementEnhance.validate pyparsing.pyparsing.ParseElementEnhance-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseElementEnhance.ignore pyparsing.pyparsing.ParseElementEnhance-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance.checkRecursion pyparsing.pyparsing.ParseElementEnhance-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.OnlyOnce pyparsing.pyparsing.OnlyOnce-class.html pyparsing.pyparsing.OnlyOnce.reset pyparsing.pyparsing.OnlyOnce-class.html#reset pyparsing.pyparsing.OnlyOnce.__call__ pyparsing.pyparsing.OnlyOnce-class.html#__call__ pyparsing.pyparsing.OnlyOnce.__init__ pyparsing.pyparsing.OnlyOnce-class.html#__init__ pyparsing.pyparsing.Optional pyparsing.pyparsing.Optional-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.Optional.__str__ pyparsing.pyparsing.Optional-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.Optional.__init__ pyparsing.pyparsing.Optional-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.Optional.__slotnames__ pyparsing.pyparsing.Optional-class.html#__slotnames__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.Optional.parseImpl pyparsing.pyparsing.Optional-class.html#parseImpl pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseElementEnhance.leaveWhitespace pyparsing.pyparsing.ParseElementEnhance-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseElementEnhance.streamline pyparsing.pyparsing.ParseElementEnhance-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseElementEnhance.validate pyparsing.pyparsing.ParseElementEnhance-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseElementEnhance.ignore pyparsing.pyparsing.ParseElementEnhance-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance.checkRecursion pyparsing.pyparsing.ParseElementEnhance-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.Or pyparsing.pyparsing.Or-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.Or.__str__ pyparsing.pyparsing.Or-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.ParseExpression.append pyparsing.pyparsing.ParseExpression-class.html#append pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.Or.parseImpl pyparsing.pyparsing.Or-class.html#parseImpl pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.Or.__init__ pyparsing.pyparsing.Or-class.html#__init__ pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.Or.__ixor__ pyparsing.pyparsing.Or-class.html#__ixor__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseExpression.leaveWhitespace pyparsing.pyparsing.ParseExpression-class.html#leaveWhitespace pyparsing.pyparsing.ParseExpression.__getitem__ pyparsing.pyparsing.ParseExpression-class.html#__getitem__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParseExpression.setResultsName pyparsing.pyparsing.ParseExpression-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseExpression.streamline pyparsing.pyparsing.ParseExpression-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseExpression.validate pyparsing.pyparsing.ParseExpression-class.html#validate pyparsing.pyparsing.ParseExpression.copy pyparsing.pyparsing.ParseExpression-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseExpression.ignore pyparsing.pyparsing.ParseExpression-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.Or.checkRecursion pyparsing.pyparsing.Or-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.ParseBaseException pyparsing.pyparsing.ParseBaseException-class.html pyparsing.pyparsing.ParseBaseException.__str__ pyparsing.pyparsing.ParseBaseException-class.html#__str__ pyparsing.pyparsing.ParseBaseException.__init__ pyparsing.pyparsing.ParseBaseException-class.html#__init__ pyparsing.pyparsing.ParseBaseException.__getattr__ pyparsing.pyparsing.ParseBaseException-class.html#__getattr__ pyparsing.pyparsing.ParseBaseException.__dir__ pyparsing.pyparsing.ParseBaseException-class.html#__dir__ pyparsing.pyparsing.ParseBaseException.markInputline pyparsing.pyparsing.ParseBaseException-class.html#markInputline pyparsing.pyparsing.ParseBaseException.__repr__ pyparsing.pyparsing.ParseBaseException-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance pyparsing.pyparsing.ParseElementEnhance-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParseElementEnhance.__str__ pyparsing.pyparsing.ParseElementEnhance-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.ParseElementEnhance.__init__ pyparsing.pyparsing.ParseElementEnhance-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.ParseElementEnhance.parseImpl pyparsing.pyparsing.ParseElementEnhance-class.html#parseImpl pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseElementEnhance.leaveWhitespace pyparsing.pyparsing.ParseElementEnhance-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseElementEnhance.streamline pyparsing.pyparsing.ParseElementEnhance-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseElementEnhance.validate pyparsing.pyparsing.ParseElementEnhance-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseElementEnhance.ignore pyparsing.pyparsing.ParseElementEnhance-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance.checkRecursion pyparsing.pyparsing.ParseElementEnhance-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.ParseException pyparsing.pyparsing.ParseException-class.html pyparsing.pyparsing.ParseBaseException.__str__ pyparsing.pyparsing.ParseBaseException-class.html#__str__ pyparsing.pyparsing.ParseBaseException.__init__ pyparsing.pyparsing.ParseBaseException-class.html#__init__ pyparsing.pyparsing.ParseBaseException.__getattr__ pyparsing.pyparsing.ParseBaseException-class.html#__getattr__ pyparsing.pyparsing.ParseBaseException.__dir__ pyparsing.pyparsing.ParseBaseException-class.html#__dir__ pyparsing.pyparsing.ParseBaseException.markInputline pyparsing.pyparsing.ParseBaseException-class.html#markInputline pyparsing.pyparsing.ParseBaseException.__repr__ pyparsing.pyparsing.ParseBaseException-class.html#__repr__ pyparsing.pyparsing.ParseExpression pyparsing.pyparsing.ParseExpression-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParseExpression.__str__ pyparsing.pyparsing.ParseExpression-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.ParseExpression.__init__ pyparsing.pyparsing.ParseExpression-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.ParserElement.parseImpl pyparsing.pyparsing.ParserElement-class.html#parseImpl pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParseExpression.append pyparsing.pyparsing.ParseExpression-class.html#append pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseExpression.leaveWhitespace pyparsing.pyparsing.ParseExpression-class.html#leaveWhitespace pyparsing.pyparsing.ParseExpression.__getitem__ pyparsing.pyparsing.ParseExpression-class.html#__getitem__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParseExpression.setResultsName pyparsing.pyparsing.ParseExpression-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseExpression.streamline pyparsing.pyparsing.ParseExpression-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseExpression.validate pyparsing.pyparsing.ParseExpression-class.html#validate pyparsing.pyparsing.ParseExpression.copy pyparsing.pyparsing.ParseExpression-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseExpression.ignore pyparsing.pyparsing.ParseExpression-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.ParseFatalException pyparsing.pyparsing.ParseFatalException-class.html pyparsing.pyparsing.ParseBaseException.__str__ pyparsing.pyparsing.ParseBaseException-class.html#__str__ pyparsing.pyparsing.ParseBaseException.__init__ pyparsing.pyparsing.ParseBaseException-class.html#__init__ pyparsing.pyparsing.ParseBaseException.__getattr__ pyparsing.pyparsing.ParseBaseException-class.html#__getattr__ pyparsing.pyparsing.ParseBaseException.__dir__ pyparsing.pyparsing.ParseBaseException-class.html#__dir__ pyparsing.pyparsing.ParseBaseException.markInputline pyparsing.pyparsing.ParseBaseException-class.html#markInputline pyparsing.pyparsing.ParseBaseException.__repr__ pyparsing.pyparsing.ParseBaseException-class.html#__repr__ pyparsing.pyparsing.ParseResults pyparsing.pyparsing.ParseResults-class.html pyparsing.pyparsing.ParseResults.haskeys pyparsing.pyparsing.ParseResults-class.html#haskeys pyparsing.pyparsing.ParseResults.asXML pyparsing.pyparsing.ParseResults-class.html#asXML pyparsing.pyparsing.ParseResults.dump pyparsing.pyparsing.ParseResults-class.html#dump pyparsing.pyparsing.ParseResults.__str__ pyparsing.pyparsing.ParseResults-class.html#__str__ pyparsing.pyparsing.ParseResults.pop pyparsing.pyparsing.ParseResults-class.html#pop pyparsing.pyparsing.ParseResults.__radd__ pyparsing.pyparsing.ParseResults-class.html#__radd__ pyparsing.pyparsing.ParseResults.append pyparsing.pyparsing.ParseResults-class.html#append pyparsing.pyparsing.ParseResults.__lookup pyparsing.pyparsing.ParseResults-class.html#__lookup pyparsing.pyparsing.ParseResults.__new__ pyparsing.pyparsing.ParseResults-class.html#__new__ pyparsing.pyparsing.ParseResults.__contains__ pyparsing.pyparsing.ParseResults-class.html#__contains__ pyparsing.pyparsing.ParseResults.getName pyparsing.pyparsing.ParseResults-class.html#getName pyparsing.pyparsing.ParseResults.pprint pyparsing.pyparsing.ParseResults-class.html#pprint pyparsing.pyparsing.ParseResults._asStringList pyparsing.pyparsing.ParseResults-class.html#_asStringList pyparsing.pyparsing.ParseResults.__getattr__ pyparsing.pyparsing.ParseResults-class.html#__getattr__ pyparsing.pyparsing.ParseResults.__init__ pyparsing.pyparsing.ParseResults-class.html#__init__ pyparsing.pyparsing.ParseResults.itervalues pyparsing.pyparsing.ParseResults-class.html#itervalues pyparsing.pyparsing.ParseResults.get pyparsing.pyparsing.ParseResults-class.html#get pyparsing.pyparsing.ParseResults.__getstate__ pyparsing.pyparsing.ParseResults-class.html#__getstate__ pyparsing.pyparsing.ParseResults.__len__ pyparsing.pyparsing.ParseResults-class.html#__len__ pyparsing.pyparsing.ParseResults.__getitem__ pyparsing.pyparsing.ParseResults-class.html#__getitem__ pyparsing.pyparsing.ParseResults.__setstate__ pyparsing.pyparsing.ParseResults-class.html#__setstate__ pyparsing.pyparsing.ParseResults.keys pyparsing.pyparsing.ParseResults-class.html#keys pyparsing.pyparsing.ParseResults.__iter__ pyparsing.pyparsing.ParseResults-class.html#__iter__ pyparsing.pyparsing.ParseResults.__add__ pyparsing.pyparsing.ParseResults-class.html#__add__ pyparsing.pyparsing.ParseResults.iteritems pyparsing.pyparsing.ParseResults-class.html#iteritems pyparsing.pyparsing.ParseResults.__bool__ pyparsing.pyparsing.ParseResults-class.html#__bool__ pyparsing.pyparsing.ParseResults.copy pyparsing.pyparsing.ParseResults-class.html#copy pyparsing.pyparsing.ParseResults.iterkeys pyparsing.pyparsing.ParseResults-class.html#iterkeys pyparsing.pyparsing.ParseResults.asList pyparsing.pyparsing.ParseResults-class.html#asList pyparsing.pyparsing.ParseResults.extend pyparsing.pyparsing.ParseResults-class.html#extend pyparsing.pyparsing.ParseResults.__delitem__ pyparsing.pyparsing.ParseResults-class.html#__delitem__ pyparsing.pyparsing.ParseResults.__reversed__ pyparsing.pyparsing.ParseResults-class.html#__reversed__ pyparsing.pyparsing.ParseResults.__nonzero__ pyparsing.pyparsing.ParseResults-class.html#__nonzero__ pyparsing.pyparsing.ParseResults.items pyparsing.pyparsing.ParseResults-class.html#items pyparsing.pyparsing.ParseResults.clear pyparsing.pyparsing.ParseResults-class.html#clear pyparsing.pyparsing.ParseResults.insert pyparsing.pyparsing.ParseResults-class.html#insert pyparsing.pyparsing.ParseResults.__setitem__ pyparsing.pyparsing.ParseResults-class.html#__setitem__ pyparsing.pyparsing.ParseResults.__iadd__ pyparsing.pyparsing.ParseResults-class.html#__iadd__ pyparsing.pyparsing.ParseResults.values pyparsing.pyparsing.ParseResults-class.html#values pyparsing.pyparsing.ParseResults.__repr__ pyparsing.pyparsing.ParseResults-class.html#__repr__ pyparsing.pyparsing.ParseResults.asDict pyparsing.pyparsing.ParseResults-class.html#asDict pyparsing.pyparsing.ParseResults.__dir__ pyparsing.pyparsing.ParseResults-class.html#__dir__ pyparsing.pyparsing.ParseSyntaxException pyparsing.pyparsing.ParseSyntaxException-class.html pyparsing.pyparsing.ParseBaseException.__str__ pyparsing.pyparsing.ParseBaseException-class.html#__str__ pyparsing.pyparsing.ParseSyntaxException.__init__ pyparsing.pyparsing.ParseSyntaxException-class.html#__init__ pyparsing.pyparsing.ParseBaseException.__getattr__ pyparsing.pyparsing.ParseBaseException-class.html#__getattr__ pyparsing.pyparsing.ParseBaseException.__dir__ pyparsing.pyparsing.ParseBaseException-class.html#__dir__ pyparsing.pyparsing.ParseBaseException.markInputline pyparsing.pyparsing.ParseBaseException-class.html#markInputline pyparsing.pyparsing.ParseBaseException.__repr__ pyparsing.pyparsing.ParseBaseException-class.html#__repr__ pyparsing.pyparsing.ParserElement pyparsing.pyparsing.ParserElement-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.ParserElement.__init__ pyparsing.pyparsing.ParserElement-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.ParserElement.parseImpl pyparsing.pyparsing.ParserElement-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.QuotedString pyparsing.pyparsing.QuotedString-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.QuotedString.__str__ pyparsing.pyparsing.QuotedString-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.QuotedString.__init__ pyparsing.pyparsing.QuotedString-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.QuotedString.parseImpl pyparsing.pyparsing.QuotedString-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.RecursiveGrammarException pyparsing.pyparsing.RecursiveGrammarException-class.html pyparsing.pyparsing.RecursiveGrammarException.__str__ pyparsing.pyparsing.RecursiveGrammarException-class.html#__str__ pyparsing.pyparsing.RecursiveGrammarException.__init__ pyparsing.pyparsing.RecursiveGrammarException-class.html#__init__ pyparsing.pyparsing.Regex pyparsing.pyparsing.Regex-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.Regex.__str__ pyparsing.pyparsing.Regex-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.Regex.__init__ pyparsing.pyparsing.Regex-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.Regex.__slotnames__ pyparsing.pyparsing.Regex-class.html#__slotnames__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.Regex.compiledREtype pyparsing.pyparsing.Regex.compiledREtype-class.html pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.Regex.parseImpl pyparsing.pyparsing.Regex-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.Regex.compiledREtype pyparsing.pyparsing.Regex.compiledREtype-class.html pyparsing.pyparsing.SkipTo pyparsing.pyparsing.SkipTo-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParseElementEnhance.__str__ pyparsing.pyparsing.ParseElementEnhance-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.SkipTo.__init__ pyparsing.pyparsing.SkipTo-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.SkipTo.parseImpl pyparsing.pyparsing.SkipTo-class.html#parseImpl pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseElementEnhance.leaveWhitespace pyparsing.pyparsing.ParseElementEnhance-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseElementEnhance.streamline pyparsing.pyparsing.ParseElementEnhance-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseElementEnhance.validate pyparsing.pyparsing.ParseElementEnhance-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseElementEnhance.ignore pyparsing.pyparsing.ParseElementEnhance-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance.checkRecursion pyparsing.pyparsing.ParseElementEnhance-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.StringEnd pyparsing.pyparsing.StringEnd-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.StringEnd.__init__ pyparsing.pyparsing.StringEnd-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.StringEnd.parseImpl pyparsing.pyparsing.StringEnd-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.StringStart pyparsing.pyparsing.StringStart-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.StringStart.__init__ pyparsing.pyparsing.StringStart-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.StringStart.parseImpl pyparsing.pyparsing.StringStart-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.Suppress pyparsing.pyparsing.Suppress-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParseElementEnhance.__str__ pyparsing.pyparsing.ParseElementEnhance-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.TokenConverter.__init__ pyparsing.pyparsing.TokenConverter-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.Suppress.__slotnames__ pyparsing.pyparsing.Suppress-class.html#__slotnames__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.ParseElementEnhance.parseImpl pyparsing.pyparsing.ParseElementEnhance-class.html#parseImpl pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.Suppress.postParse pyparsing.pyparsing.Suppress-class.html#postParse pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseElementEnhance.leaveWhitespace pyparsing.pyparsing.ParseElementEnhance-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.Suppress.suppress pyparsing.pyparsing.Suppress-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseElementEnhance.streamline pyparsing.pyparsing.ParseElementEnhance-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseElementEnhance.validate pyparsing.pyparsing.ParseElementEnhance-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseElementEnhance.ignore pyparsing.pyparsing.ParseElementEnhance-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance.checkRecursion pyparsing.pyparsing.ParseElementEnhance-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.Token pyparsing.pyparsing.Token-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.Token.__init__ pyparsing.pyparsing.Token-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.ParserElement.parseImpl pyparsing.pyparsing.ParserElement-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.TokenConverter pyparsing.pyparsing.TokenConverter-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParseElementEnhance.__str__ pyparsing.pyparsing.ParseElementEnhance-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.TokenConverter.__init__ pyparsing.pyparsing.TokenConverter-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.ParseElementEnhance.parseImpl pyparsing.pyparsing.ParseElementEnhance-class.html#parseImpl pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseElementEnhance.leaveWhitespace pyparsing.pyparsing.ParseElementEnhance-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseElementEnhance.streamline pyparsing.pyparsing.ParseElementEnhance-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseElementEnhance.validate pyparsing.pyparsing.ParseElementEnhance-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseElementEnhance.ignore pyparsing.pyparsing.ParseElementEnhance-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance.checkRecursion pyparsing.pyparsing.ParseElementEnhance-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.Upcase pyparsing.pyparsing.Upcase-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParseElementEnhance.__str__ pyparsing.pyparsing.ParseElementEnhance-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.Upcase.__init__ pyparsing.pyparsing.Upcase-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.ParseElementEnhance.parseImpl pyparsing.pyparsing.ParseElementEnhance-class.html#parseImpl pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.Upcase.postParse pyparsing.pyparsing.Upcase-class.html#postParse pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseElementEnhance.leaveWhitespace pyparsing.pyparsing.ParseElementEnhance-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseElementEnhance.streamline pyparsing.pyparsing.ParseElementEnhance-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseElementEnhance.validate pyparsing.pyparsing.ParseElementEnhance-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseElementEnhance.ignore pyparsing.pyparsing.ParseElementEnhance-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance.checkRecursion pyparsing.pyparsing.ParseElementEnhance-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.White pyparsing.pyparsing.White-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.White.__init__ pyparsing.pyparsing.White-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.White.parseImpl pyparsing.pyparsing.White-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.White.whiteStrs pyparsing.pyparsing.White-class.html#whiteStrs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.Word pyparsing.pyparsing.Word-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.Word.__str__ pyparsing.pyparsing.Word-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.Word.__init__ pyparsing.pyparsing.Word-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.Word.__slotnames__ pyparsing.pyparsing.Word-class.html#__slotnames__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.Word.parseImpl pyparsing.pyparsing.Word-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.WordEnd pyparsing.pyparsing.WordEnd-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.WordEnd.__init__ pyparsing.pyparsing.WordEnd-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.WordEnd.parseImpl pyparsing.pyparsing.WordEnd-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.WordStart pyparsing.pyparsing.WordStart-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.WordStart.__init__ pyparsing.pyparsing.WordStart-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.WordStart.parseImpl pyparsing.pyparsing.WordStart-class.html#parseImpl pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.Token.setName pyparsing.pyparsing.Token-class.html#setName pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.leaveWhitespace pyparsing.pyparsing.ParserElement-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ParserElement.setResultsName pyparsing.pyparsing.ParserElement-class.html#setResultsName pyparsing.pyparsing.ParserElement.__str__ pyparsing.pyparsing.ParserElement-class.html#__str__ pyparsing.pyparsing.ParserElement.streamline pyparsing.pyparsing.ParserElement-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParserElement.validate pyparsing.pyparsing.ParserElement-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.ignore pyparsing.pyparsing.ParserElement-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParserElement.checkRecursion pyparsing.pyparsing.ParserElement-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing.pyparsing.ZeroOrMore pyparsing.pyparsing.ZeroOrMore-class.html pyparsing.pyparsing.ParserElement._parseCache pyparsing.pyparsing.ParserElement-class.html#_parseCache pyparsing.pyparsing.ParserElement.__ror__ pyparsing.pyparsing.ParserElement-class.html#__ror__ pyparsing.pyparsing.ZeroOrMore.__str__ pyparsing.pyparsing.ZeroOrMore-class.html#__str__ pyparsing.pyparsing.ParserElement.resetCache pyparsing.pyparsing.ParserElement-class.html#resetCache pyparsing.pyparsing.ParserElement.__radd__ pyparsing.pyparsing.ParserElement-class.html#__radd__ pyparsing.pyparsing.ParserElement._parseNoCache pyparsing.pyparsing.ParserElement-class.html#_parseNoCache pyparsing.pyparsing.ParserElement._exprArgCache pyparsing.pyparsing.ParserElement-class.html#_exprArgCache pyparsing.pyparsing.ParserElement.__rsub__ pyparsing.pyparsing.ParserElement-class.html#__rsub__ pyparsing.pyparsing.ParserElement.inlineLiteralsUsing pyparsing.pyparsing.ParserElement-class.html#inlineLiteralsUsing pyparsing.pyparsing.ParserElement.__and__ pyparsing.pyparsing.ParserElement-class.html#__and__ pyparsing.pyparsing.ZeroOrMore.__init__ pyparsing.pyparsing.ZeroOrMore-class.html#__init__ pyparsing.pyparsing.ParserElement.setFailAction pyparsing.pyparsing.ParserElement-class.html#setFailAction pyparsing.pyparsing.ParserElement.transformString pyparsing.pyparsing.ParserElement-class.html#transformString pyparsing.pyparsing.ParserElement.__rand__ pyparsing.pyparsing.ParserElement-class.html#__rand__ pyparsing.pyparsing.ParserElement.enablePackrat pyparsing.pyparsing.ParserElement-class.html#enablePackrat pyparsing.pyparsing.ParserElement.parseString pyparsing.pyparsing.ParserElement-class.html#parseString pyparsing.pyparsing.ParserElement.scanString pyparsing.pyparsing.ParserElement-class.html#scanString pyparsing.pyparsing.ParserElement.__req__ pyparsing.pyparsing.ParserElement-class.html#__req__ pyparsing.pyparsing.ParserElement.__xor__ pyparsing.pyparsing.ParserElement-class.html#__xor__ pyparsing.pyparsing.ParserElement.setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setDefaultWhitespaceChars pyparsing.pyparsing.ParserElement._packratEnabled pyparsing.pyparsing.ParserElement-class.html#_packratEnabled pyparsing.pyparsing.ZeroOrMore.parseImpl pyparsing.pyparsing.ZeroOrMore-class.html#parseImpl pyparsing.pyparsing.ParserElement.postParse pyparsing.pyparsing.ParserElement-class.html#postParse pyparsing.pyparsing.ParserElement.setParseAction pyparsing.pyparsing.ParserElement-class.html#setParseAction pyparsing.pyparsing.ParserElement.__rmul__ pyparsing.pyparsing.ParserElement-class.html#__rmul__ pyparsing.pyparsing.ParserElement.__call__ pyparsing.pyparsing.ParserElement-class.html#__call__ pyparsing.pyparsing.ParserElement.literalStringClass pyparsing.pyparsing.Literal-class.html pyparsing.pyparsing.ParserElement.addParseAction pyparsing.pyparsing.ParserElement-class.html#addParseAction pyparsing.pyparsing.ParserElement.__mul__ pyparsing.pyparsing.ParserElement-class.html#__mul__ pyparsing.pyparsing.ParserElement.__ne__ pyparsing.pyparsing.ParserElement-class.html#__ne__ pyparsing.pyparsing.ParserElement.setName pyparsing.pyparsing.ParserElement-class.html#setName pyparsing.pyparsing.ParseElementEnhance.leaveWhitespace pyparsing.pyparsing.ParseElementEnhance-class.html#leaveWhitespace pyparsing.pyparsing.ParserElement.__invert__ pyparsing.pyparsing.ParserElement-class.html#__invert__ pyparsing.pyparsing.ParserElement.suppress pyparsing.pyparsing.ParserElement-class.html#suppress pyparsing.pyparsing.ParserElement.verbose_stacktrace pyparsing.pyparsing.ParserElement-class.html#verbose_stacktrace pyparsing.pyparsing.ZeroOrMore.setResultsName pyparsing.pyparsing.ZeroOrMore-class.html#setResultsName pyparsing.pyparsing.ParserElement.parseFile pyparsing.pyparsing.ParserElement-class.html#parseFile pyparsing.pyparsing.ParseElementEnhance.streamline pyparsing.pyparsing.ParseElementEnhance-class.html#streamline pyparsing.pyparsing.ParserElement.__or__ pyparsing.pyparsing.ParserElement-class.html#__or__ pyparsing.pyparsing.ParserElement.__add__ pyparsing.pyparsing.ParserElement-class.html#__add__ pyparsing.pyparsing.ParserElement.__sub__ pyparsing.pyparsing.ParserElement-class.html#__sub__ pyparsing.pyparsing.ParserElement.tryParse pyparsing.pyparsing.ParserElement-class.html#tryParse pyparsing.pyparsing.ParseElementEnhance.validate pyparsing.pyparsing.ParseElementEnhance-class.html#validate pyparsing.pyparsing.ParserElement.copy pyparsing.pyparsing.ParserElement-class.html#copy pyparsing.pyparsing.ParserElement.__eq__ pyparsing.pyparsing.ParserElement-class.html#__eq__ pyparsing.pyparsing.ParserElement.__rxor__ pyparsing.pyparsing.ParserElement-class.html#__rxor__ pyparsing.pyparsing.ParserElement.DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement-class.html#DEFAULT_WHITE_CHARS pyparsing.pyparsing.ParserElement.parseWithTabs pyparsing.pyparsing.ParserElement-class.html#parseWithTabs pyparsing.pyparsing.ParserElement.searchString pyparsing.pyparsing.ParserElement-class.html#searchString pyparsing.pyparsing.ParserElement.preParse pyparsing.pyparsing.ParserElement-class.html#preParse pyparsing.pyparsing.ParserElement.__rne__ pyparsing.pyparsing.ParserElement-class.html#__rne__ pyparsing.pyparsing.ParserElement.setBreak pyparsing.pyparsing.ParserElement-class.html#setBreak pyparsing.pyparsing.ParseElementEnhance.ignore pyparsing.pyparsing.ParseElementEnhance-class.html#ignore pyparsing.pyparsing.ParserElement.setDebugActions pyparsing.pyparsing.ParserElement-class.html#setDebugActions pyparsing.pyparsing.ParserElement.__repr__ pyparsing.pyparsing.ParserElement-class.html#__repr__ pyparsing.pyparsing.ParseElementEnhance.checkRecursion pyparsing.pyparsing.ParseElementEnhance-class.html#checkRecursion pyparsing.pyparsing.ParserElement.__hash__ pyparsing.pyparsing.ParserElement-class.html#__hash__ pyparsing.pyparsing.ParserElement.setWhitespaceChars pyparsing.pyparsing.ParserElement-class.html#setWhitespaceChars pyparsing.pyparsing.ParserElement._parse pyparsing.pyparsing.ParserElement-class.html#_parse pyparsing.pyparsing.ParserElement._skipIgnorables pyparsing.pyparsing.ParserElement-class.html#_skipIgnorables pyparsing.pyparsing.ParserElement.setDebug pyparsing.pyparsing.ParserElement-class.html#setDebug pyparsing-2.0.3/htmldoc/frames.html0000664000175000017500000000112112322542216016341 0ustar barrybarry pyparsing pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.ParserElement-class.html0000664000175000017500000022542012322542216024775 0ustar barrybarry pyparsing.pyparsing.ParserElement
Package pyparsing :: Module pyparsing :: Class ParserElement
[frames] | no frames]

Class ParserElement

source code

object --+
         |
        ParserElement
Known Subclasses:

Abstract base level parser element class.

Nested Classes
  literalStringClass
Token to exactly match a specified string.
Instance Methods
 
__init__(self, savelist=False)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
copy(self)
Make a copy of this ParserElement.
source code
 
setName(self, name)
Define name for this expression, for use in debugging.
source code
 
setResultsName(self, name, listAllMatches=False)
Define name for referencing matching tokens as a nested attribute of the returned parse results.
source code
 
setBreak(self, breakFlag=True)
Method to invoke the Python pdb debugger when this element is about to be parsed.
source code
 
setParseAction(self, *fns, **kwargs)
Define action to perform when successfully matching parse element definition.
source code
 
addParseAction(self, *fns, **kwargs)
Add parse action to expression's list of parse actions.
source code
 
setFailAction(self, fn)
Define action to perform if parsing fails at this expression.
source code
 
preParse(self, instring, loc) source code
 
parseImpl(self, instring, loc, doActions=True) source code
 
postParse(self, instring, loc, tokenlist) source code
 
tryParse(self, instring, loc) source code
 
parseString(self, instring, parseAll=False)
Execute the parse expression with the given string.
source code
 
scanString(self, instring, maxMatches=2147483647, overlap=False)
Scan the input string for expression matches.
source code
 
transformString(self, instring)
Extension to scanString, to modify matching text with modified tokens that may be returned from a parse action.
source code
 
searchString(self, instring, maxMatches=2147483647)
Another extension to scanString, simplifying the access to the tokens found to match the given parse expression.
source code
 
__add__(self, other)
Implementation of + operator - returns And
source code
 
__radd__(self, other)
Implementation of + operator when left operand is not a ParserElement
source code
 
__sub__(self, other)
Implementation of - operator, returns And with error stop
source code
 
__rsub__(self, other)
Implementation of - operator when left operand is not a ParserElement
source code
 
__mul__(self, other)
Implementation of * operator, allows use of expr * 3 in place of expr + expr + expr.
source code
 
__rmul__(self, other) source code
 
__or__(self, other)
Implementation of | operator - returns MatchFirst
source code
 
__ror__(self, other)
Implementation of | operator when left operand is not a ParserElement
source code
 
__xor__(self, other)
Implementation of ^ operator - returns Or
source code
 
__rxor__(self, other)
Implementation of ^ operator when left operand is not a ParserElement
source code
 
__and__(self, other)
Implementation of & operator - returns Each
source code
 
__rand__(self, other)
Implementation of & operator when left operand is not a ParserElement
source code
 
__invert__(self)
Implementation of ~ operator - returns NotAny
source code
 
__call__(self, name=None)
Shortcut for setResultsName, with listAllMatches=default:
source code
 
suppress(self)
Suppresses the output of this ParserElement; useful to keep punctuation from cluttering up returned output.
source code
 
leaveWhitespace(self)
Disables the skipping of whitespace before matching the characters in the ParserElement's defined pattern.
source code
 
setWhitespaceChars(self, chars)
Overrides the default whitespace chars
source code
 
parseWithTabs(self)
Overrides default behavior to expand <TAB>s to spaces before parsing the input string.
source code
 
ignore(self, other)
Define expression to be ignored (e.g., comments) while doing pattern matching; may be called repeatedly, to define multiple comment or other ignorable patterns.
source code
 
setDebugActions(self, startAction, successAction, exceptionAction)
Enable display of debugging messages while doing pattern matching.
source code
 
setDebug(self, flag=True)
Enable display of debugging messages while doing pattern matching.
source code
 
__str__(self)
str(x)
source code
 
__repr__(self)
repr(x)
source code
 
streamline(self) source code
 
checkRecursion(self, parseElementList) source code
 
validate(self, validateTrace=[])
Check defined expressions for valid structure, check for infinite recursive definitions.
source code
 
parseFile(self, file_or_filename, parseAll=False)
Execute the parse expression on the given file or filename.
source code
 
__eq__(self, other) source code
 
__ne__(self, other) source code
 
__hash__(self)
hash(x)
source code
 
__req__(self, other) source code
 
__rne__(self, other) source code

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods
 
setDefaultWhitespaceChars(chars)
Overrides the default whitespace chars
source code
 
inlineLiteralsUsing(cls)
Set class to be used for inclusion of string literals into a parser.
source code
 
resetCache() source code
 
enablePackrat()
Enables "packrat" parsing, which adds memoizing to the parsing logic.
source code
Class Variables
  DEFAULT_WHITE_CHARS = ' \n\t\r'
  verbose_stacktrace = False
Properties

Inherited from object: __class__

Method Details

__init__(self, savelist=False)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

copy(self)

source code 

Make a copy of this ParserElement. Useful for defining different parse actions for the same parsing pattern, using copies of the original parse element.

setResultsName(self, name, listAllMatches=False)

source code 

Define name for referencing matching tokens as a nested attribute of the returned parse results. NOTE: this returns a *copy* of the original ParserElement object; this is so that the client can define a basic element, such as an integer, and reference it in multiple places with different names.

You can also set results names using the abbreviated syntax, expr("name") in place of expr.setResultsName("name") - see __call__.

setBreak(self, breakFlag=True)

source code 

Method to invoke the Python pdb debugger when this element is about to be parsed. Set breakFlag to True to enable, False to disable.

setParseAction(self, *fns, **kwargs)

source code 

Define action to perform when successfully matching parse element definition. Parse action fn is a callable method with 0-3 arguments, called as fn(s,loc,toks), fn(loc,toks), fn(toks), or just fn(), where:

  • s = the original string being parsed (see note below)
  • loc = the location of the matching substring
  • toks = a list of the matched tokens, packaged as a ParseResults object

If the functions in fns modify the tokens, they can return them as the return value from fn, and the modified list of tokens will replace the original. Otherwise, fn does not need to return any value.

Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See parseString for more information on parsing strings containing <TAB>s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string.

addParseAction(self, *fns, **kwargs)

source code 

Add parse action to expression's list of parse actions. See setParseAction.

setFailAction(self, fn)

source code 

Define action to perform if parsing fails at this expression. Fail acton fn is a callable function that takes the arguments fn(s,loc,expr,err) where:

  • s = string being parsed
  • loc = location where expression match was attempted and failed
  • expr = the parse expression that failed
  • err = the exception thrown

The function returns no value. It may throw ParseFatalException if it is desired to stop parsing immediately.

enablePackrat()
Static Method

source code 

Enables "packrat" parsing, which adds memoizing to the parsing logic. Repeated parse attempts at the same string location (which happens often in many complex grammars) can immediately return a cached value, instead of re-executing parsing/validating code. Memoizing is done of both valid results and parsing exceptions.

This speedup may break existing programs that use parse actions that have side-effects. For this reason, packrat parsing is disabled when you first import pyparsing. To activate the packrat feature, your program must call the class method ParserElement.enablePackrat(). If your program uses psyco to "compile as you go", you must call enablePackrat before calling psyco.full(). If you do not do this, Python will crash. For best results, call enablePackrat() immediately after importing pyparsing.

parseString(self, instring, parseAll=False)

source code 

Execute the parse expression with the given string. This is the main interface to the client code, once the complete expression has been built.

If you want the grammar to require that the entire input string be successfully parsed, then set parseAll to True (equivalent to ending the grammar with StringEnd()).

Note: parseString implicitly calls expandtabs() on the input string, in order to report proper column numbers in parse actions. If the input string contains tabs and the grammar uses parse actions that use the loc argument to index into the string being parsed, you can ensure you have a consistent view of the input string by:

  • calling parseWithTabs on your grammar before calling parseString (see parseWithTabs)
  • define your parse action using the full (s,loc,toks) signature, and reference the input string using the parse action's s argument
  • explictly expand the tabs in your input string before calling parseString

scanString(self, instring, maxMatches=2147483647, overlap=False)

source code 

Scan the input string for expression matches. Each match will return the matching tokens, start location, and end location. May be called with optional maxMatches argument, to clip scanning after 'n' matches are found. If overlap is specified, then overlapping matches will be reported.

Note that the start and end locations are reported relative to the string being parsed. See parseString for more information on parsing strings with embedded tabs.

transformString(self, instring)

source code 

Extension to scanString, to modify matching text with modified tokens that may be returned from a parse action. To use transformString, define a grammar and attach a parse action to it that modifies the returned token list. Invoking transformString() on a target string will then scan for matches, and replace the matched text patterns according to the logic in the parse action. transformString() returns the resulting transformed string.

searchString(self, instring, maxMatches=2147483647)

source code 

Another extension to scanString, simplifying the access to the tokens found to match the given parse expression. May be called with optional maxMatches argument, to clip searching after 'n' matches are found.

__mul__(self, other)

source code 

Implementation of * operator, allows use of expr * 3 in place of expr + expr + expr. Expressions may also me multiplied by a 2-integer tuple, similar to {min,max} multipliers in regular expressions. Tuples may also include None as in:

  • expr*(n,None) or expr*(n,) is equivalent to expr*n + ZeroOrMore(expr) (read as "at least n instances of expr")
  • expr*(None,n) is equivalent to expr*(0,n) (read as "0 to n instances of expr")
  • expr*(None,None) is equivalent to ZeroOrMore(expr)
  • expr*(1,None) is equivalent to OneOrMore(expr)

Note that expr*(None,n) does not raise an exception if more than n exprs exist in the input stream; that is, expr*(None,n) does not enforce a maximum number of expr occurrences. If this behavior is desired, then write expr*(None,n) + ~expr

__call__(self, name=None)
(Call operator)

source code 

Shortcut for setResultsName, with listAllMatches=default:

 userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno")

could be written as:

 userdata = Word(alphas)("name") + Word(nums+"-")("socsecno")

If name is given with a trailing '*' character, then listAllMatches will be passed as True.

If name is omitted, same as calling copy.

leaveWhitespace(self)

source code 

Disables the skipping of whitespace before matching the characters in the ParserElement's defined pattern. This is normally only used internally by the pyparsing module, but may be needed in some whitespace-sensitive grammars.

parseWithTabs(self)

source code 

Overrides default behavior to expand <TAB>s to spaces before parsing the input string. Must be called before parseString when the input grammar contains elements that match <TAB> characters.

setDebug(self, flag=True)

source code 

Enable display of debugging messages while doing pattern matching. Set flag to True to enable, False to disable.

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

__repr__(self)
(Representation operator)

source code 

repr(x)

Overrides: object.__repr__
(inherited documentation)

parseFile(self, file_or_filename, parseAll=False)

source code 

Execute the parse expression on the given file or filename. If a filename is specified (instead of a file object), the entire file is opened, read, and closed before parsing.

__hash__(self)
(Hashing function)

source code 

hash(x)

Overrides: object.__hash__
(inherited documentation)

pyparsing-2.0.3/htmldoc/epydoc.css0000664000175000017500000003773112322542215016212 0ustar barrybarry /* Epydoc CSS Stylesheet * * This stylesheet can be used to customize the appearance of epydoc's * HTML output. * */ /* Default Colors & Styles * - Set the default foreground & background color with 'body'; and * link colors with 'a:link' and 'a:visited'. * - Use bold for decision list terms. * - The heading styles defined here are used for headings *within* * docstring descriptions. All headings used by epydoc itself use * either class='epydoc' or class='toc' (CSS styles for both * defined below). */ body { background: #ffffff; color: #000000; } p { margin-top: 0.5em; margin-bottom: 0.5em; } a:link { color: #0000ff; } a:visited { color: #204080; } dt { font-weight: bold; } h1 { font-size: +140%; font-style: italic; font-weight: bold; } h2 { font-size: +125%; font-style: italic; font-weight: bold; } h3 { font-size: +110%; font-style: italic; font-weight: normal; } code { font-size: 100%; } /* N.B.: class, not pseudoclass */ a.link { font-family: monospace; } /* Page Header & Footer * - The standard page header consists of a navigation bar (with * pointers to standard pages such as 'home' and 'trees'); a * breadcrumbs list, which can be used to navigate to containing * classes or modules; options links, to show/hide private * variables and to show/hide frames; and a page title (using *

). The page title may be followed by a link to the * corresponding source code (using 'span.codelink'). * - The footer consists of a navigation bar, a timestamp, and a * pointer to epydoc's homepage. */ h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; } h2.epydoc { font-size: +130%; font-weight: bold; } h3.epydoc { font-size: +115%; font-weight: bold; margin-top: 0.2em; } td h3.epydoc { font-size: +115%; font-weight: bold; margin-bottom: 0; } table.navbar { background: #a0c0ff; color: #000000; border: 2px groove #c0d0d0; } table.navbar table { color: #000000; } th.navbar-select { background: #70b0ff; color: #000000; } table.navbar a { text-decoration: none; } table.navbar a:link { color: #0000ff; } table.navbar a:visited { color: #204080; } span.breadcrumbs { font-size: 85%; font-weight: bold; } span.options { font-size: 70%; } span.codelink { font-size: 85%; } td.footer { font-size: 85%; } /* Table Headers * - Each summary table and details section begins with a 'header' * row. This row contains a section title (marked by * 'span.table-header') as well as a show/hide private link * (marked by 'span.options', defined above). * - Summary tables that contain user-defined groups mark those * groups using 'group header' rows. */ td.table-header { background: #70b0ff; color: #000000; border: 1px solid #608090; } td.table-header table { color: #000000; } td.table-header table a:link { color: #0000ff; } td.table-header table a:visited { color: #204080; } span.table-header { font-size: 120%; font-weight: bold; } th.group-header { background: #c0e0f8; color: #000000; text-align: left; font-style: italic; font-size: 115%; border: 1px solid #608090; } /* Summary Tables (functions, variables, etc) * - Each object is described by a single row of the table with * two cells. The left cell gives the object's type, and is * marked with 'code.summary-type'. The right cell gives the * object's name and a summary description. * - CSS styles for the table's header and group headers are * defined above, under 'Table Headers' */ table.summary { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin-bottom: 0.5em; } td.summary { border: 1px solid #608090; } code.summary-type { font-size: 85%; } table.summary a:link { color: #0000ff; } table.summary a:visited { color: #204080; } /* Details Tables (functions, variables, etc) * - Each object is described in its own div. * - A single-row summary table w/ table-header is used as * a header for each details section (CSS style for table-header * is defined above, under 'Table Headers'). */ table.details { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin: .2em 0 0 0; } table.details table { color: #000000; } table.details a:link { color: #0000ff; } table.details a:visited { color: #204080; } /* Fields */ dl.fields { margin-left: 2em; margin-top: 1em; margin-bottom: 1em; } dl.fields dd ul { margin-left: 0em; padding-left: 0em; } dl.fields dd ul li ul { margin-left: 2em; padding-left: 0em; } div.fields { margin-left: 2em; } div.fields p { margin-bottom: 0.5em; } /* Index tables (identifier index, term index, etc) * - link-index is used for indices containing lists of links * (namely, the identifier index & term index). * - index-where is used in link indices for the text indicating * the container/source for each link. * - metadata-index is used for indices containing metadata * extracted from fields (namely, the bug index & todo index). */ table.link-index { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; } td.link-index { border-width: 0px; } table.link-index a:link { color: #0000ff; } table.link-index a:visited { color: #204080; } span.index-where { font-size: 70%; } table.metadata-index { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin: .2em 0 0 0; } td.metadata-index { border-width: 1px; border-style: solid; } table.metadata-index a:link { color: #0000ff; } table.metadata-index a:visited { color: #204080; } /* Function signatures * - sig* is used for the signature in the details section. * - .summary-sig* is used for the signature in the summary * table, and when listing property accessor functions. * */ .sig-name { color: #006080; } .sig-arg { color: #008060; } .sig-default { color: #602000; } .summary-sig { font-family: monospace; } .summary-sig-name { color: #006080; font-weight: bold; } table.summary a.summary-sig-name:link { color: #006080; font-weight: bold; } table.summary a.summary-sig-name:visited { color: #006080; font-weight: bold; } .summary-sig-arg { color: #006040; } .summary-sig-default { color: #501800; } /* Subclass list */ ul.subclass-list { display: inline; } ul.subclass-list li { display: inline; } /* To render variables, classes etc. like functions */ table.summary .summary-name { color: #006080; font-weight: bold; font-family: monospace; } table.summary a.summary-name:link { color: #006080; font-weight: bold; font-family: monospace; } table.summary a.summary-name:visited { color: #006080; font-weight: bold; font-family: monospace; } /* Variable values * - In the 'variable details' sections, each varaible's value is * listed in a 'pre.variable' box. The width of this box is * restricted to 80 chars; if the value's repr is longer than * this it will be wrapped, using a backslash marked with * class 'variable-linewrap'. If the value's repr is longer * than 3 lines, the rest will be ellided; and an ellipsis * marker ('...' marked with 'variable-ellipsis') will be used. * - If the value is a string, its quote marks will be marked * with 'variable-quote'. * - If the variable is a regexp, it is syntax-highlighted using * the re* CSS classes. */ pre.variable { padding: .5em; margin: 0; background: #dce4ec; color: #000000; border: 1px solid #708890; } .variable-linewrap { color: #604000; font-weight: bold; } .variable-ellipsis { color: #604000; font-weight: bold; } .variable-quote { color: #604000; font-weight: bold; } .variable-group { color: #008000; font-weight: bold; } .variable-op { color: #604000; font-weight: bold; } .variable-string { color: #006030; } .variable-unknown { color: #a00000; font-weight: bold; } .re { color: #000000; } .re-char { color: #006030; } .re-op { color: #600000; } .re-group { color: #003060; } .re-ref { color: #404040; } /* Base tree * - Used by class pages to display the base class hierarchy. */ pre.base-tree { font-size: 80%; margin: 0; } /* Frames-based table of contents headers * - Consists of two frames: one for selecting modules; and * the other listing the contents of the selected module. * - h1.toc is used for each frame's heading * - h2.toc is used for subheadings within each frame. */ h1.toc { text-align: center; font-size: 105%; margin: 0; font-weight: bold; padding: 0; } h2.toc { font-size: 100%; font-weight: bold; margin: 0.5em 0 0 -0.3em; } /* Syntax Highlighting for Source Code * - doctest examples are displayed in a 'pre.py-doctest' block. * If the example is in a details table entry, then it will use * the colors specified by the 'table pre.py-doctest' line. * - Source code listings are displayed in a 'pre.py-src' block. * Each line is marked with 'span.py-line' (used to draw a line * down the left margin, separating the code from the line * numbers). Line numbers are displayed with 'span.py-lineno'. * The expand/collapse block toggle button is displayed with * 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not * modify the font size of the text.) * - If a source code page is opened with an anchor, then the * corresponding code block will be highlighted. The code * block's header is highlighted with 'py-highlight-hdr'; and * the code block's body is highlighted with 'py-highlight'. * - The remaining py-* classes are used to perform syntax * highlighting (py-string for string literals, py-name for names, * etc.) */ pre.py-doctest { padding: .5em; margin: 1em; background: #e8f0f8; color: #000000; border: 1px solid #708890; } table pre.py-doctest { background: #dce4ec; color: #000000; } pre.py-src { border: 2px solid #000000; background: #f0f0f0; color: #000000; } .py-line { border-left: 2px solid #000000; margin-left: .2em; padding-left: .4em; } .py-lineno { font-style: italic; font-size: 90%; padding-left: .5em; } a.py-toggle { text-decoration: none; } div.py-highlight-hdr { border-top: 2px solid #000000; border-bottom: 2px solid #000000; background: #d8e8e8; } div.py-highlight { border-bottom: 2px solid #000000; background: #d0e0e0; } .py-prompt { color: #005050; font-weight: bold;} .py-more { color: #005050; font-weight: bold;} .py-string { color: #006030; } .py-comment { color: #003060; } .py-keyword { color: #600000; } .py-output { color: #404040; } .py-name { color: #000050; } .py-name:link { color: #000050 !important; } .py-name:visited { color: #000050 !important; } .py-number { color: #005000; } .py-defname { color: #000060; font-weight: bold; } .py-def-name { color: #000060; font-weight: bold; } .py-base-class { color: #000060; } .py-param { color: #000060; } .py-docstring { color: #006030; } .py-decorator { color: #804020; } /* Use this if you don't want links to names underlined: */ /*a.py-name { text-decoration: none; }*/ /* Graphs & Diagrams * - These CSS styles are used for graphs & diagrams generated using * Graphviz dot. 'img.graph-without-title' is used for bare * diagrams (to remove the border created by making the image * clickable). */ img.graph-without-title { border: none; } img.graph-with-title { border: 1px solid #000000; } span.graph-title { font-weight: bold; } span.graph-caption { } /* General-purpose classes * - 'p.indent-wrapped-lines' defines a paragraph whose first line * is not indented, but whose subsequent lines are. * - The 'nomargin-top' class is used to remove the top margin (e.g. * from lists). The 'nomargin' class is used to remove both the * top and bottom margin (but not the left or right margin -- * for lists, that would cause the bullets to disappear.) */ p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em; margin: 0; } .nomargin-top { margin-top: 0; } .nomargin { margin-top: 0; margin-bottom: 0; } /* HTML Log */ div.log-block { padding: 0; margin: .5em 0 .5em 0; background: #e8f0f8; color: #000000; border: 1px solid #000000; } div.log-error { padding: .1em .3em .1em .3em; margin: 4px; background: #ffb0b0; color: #000000; border: 1px solid #000000; } div.log-warning { padding: .1em .3em .1em .3em; margin: 4px; background: #ffffb0; color: #000000; border: 1px solid #000000; } div.log-info { padding: .1em .3em .1em .3em; margin: 4px; background: #b0ffb0; color: #000000; border: 1px solid #000000; } h2.log-hdr { background: #70b0ff; color: #000000; margin: 0; padding: 0em 0.5em 0em 0.5em; border-bottom: 1px solid #000000; font-size: 110%; } p.log { font-weight: bold; margin: .5em 0 .5em 0; } tr.opt-changed { color: #000000; font-weight: bold; } tr.opt-default { color: #606060; } pre.log { margin: 0; padding: 0; padding-left: 1em; } pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.WordStart-class.html0000664000175000017500000004276712322542216024173 0ustar barrybarry pyparsing.pyparsing.WordStart
Package pyparsing :: Module pyparsing :: Class WordStart
[frames] | no frames]

Class WordStart

source code

   object --+            
            |            
ParserElement --+        
                |        
            Token --+    
                    |    
       _PositionToken --+
                        |
                       WordStart

Matches if the current position is at the beginning of a Word, and is not preceded by any character in a given set of wordChars (default=printables). To emulate the  behavior of regular expressions, use WordStart(alphanums). WordStart will also match at the beginning of the string being parsed, or at the beginning of a line.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, wordChars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY...)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, wordChars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY...)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Suppress-class.html0000664000175000017500000004252512322542216024056 0ustar barrybarry pyparsing.pyparsing.Suppress
Package pyparsing :: Module pyparsing :: Class Suppress
[frames] | no frames]

Class Suppress

source code

     object --+            
              |            
  ParserElement --+        
                  |        
ParseElementEnhance --+    
                      |    
         TokenConverter --+
                          |
                         Suppress

Converter for ignoring the results of a parsed expression.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
postParse(self, instring, loc, tokenlist) source code
 
suppress(self)
Suppresses the output of this ParserElement; useful to keep punctuation from cluttering up returned output.
source code

Inherited from TokenConverter: __init__

Inherited from ParseElementEnhance: __str__, checkRecursion, ignore, leaveWhitespace, parseImpl, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, copy, parseFile, parseString, parseWithTabs, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setResultsName, setWhitespaceChars, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables
  __slotnames__ = []

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

postParse(self, instring, loc, tokenlist)

source code 
Overrides: ParserElement.postParse

suppress(self)

source code 

Suppresses the output of this ParserElement; useful to keep punctuation from cluttering up returned output.

Overrides: ParserElement.suppress
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.LineStart-class.html0000664000175000017500000004417612322542216024143 0ustar barrybarry pyparsing.pyparsing.LineStart
Package pyparsing :: Module pyparsing :: Class LineStart
[frames] | no frames]

Class LineStart

source code

   object --+            
            |            
ParserElement --+        
                |        
            Token --+    
                    |    
       _PositionToken --+
                        |
                       LineStart

Matches if current position is at the beginning of a line within the parse string

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
preParse(self, instring, loc) source code
 
parseImpl(self, instring, loc, doActions=True) source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseString, parseWithTabs, postParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

preParse(self, instring, loc)

source code 
Overrides: ParserElement.preParse

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.And-class.html0000664000175000017500000005162312322542216022733 0ustar barrybarry pyparsing.pyparsing.And
Package pyparsing :: Module pyparsing :: Class And
[frames] | no frames]

Class And

source code

   object --+        
            |        
ParserElement --+    
                |    
  ParseExpression --+
                    |
                   And

Requires all given ParseExpressions to be found in the given order. Expressions may be separated by whitespace. May be constructed using the '+' operator.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self, exprs, savelist=True)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
parseImpl(self, instring, loc, doActions=True) source code
 
__iadd__(self, other) source code
 
checkRecursion(self, parseElementList) source code
 
__str__(self)
str(x)
source code

Inherited from ParseExpression: __getitem__, append, copy, ignore, leaveWhitespace, setResultsName, streamline, validate

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __sub__, __xor__, addParseAction, parseFile, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setName, setParseAction, setWhitespaceChars, suppress, transformString, tryParse

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables
  __slotnames__ = []

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self, exprs, savelist=True)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

parseImpl(self, instring, loc, doActions=True)

source code 
Overrides: ParserElement.parseImpl

checkRecursion(self, parseElementList)

source code 
Overrides: ParserElement.checkRecursion

__str__(self)
(Informal representation operator)

source code 

str(x)

Overrides: object.__str__
(inherited documentation)

pyparsing-2.0.3/htmldoc/pyparsing.pyparsing.Empty-class.html0000664000175000017500000003573012322542216023330 0ustar barrybarry pyparsing.pyparsing.Empty
Package pyparsing :: Module pyparsing :: Class Empty
[frames] | no frames]

Class Empty

source code

   object --+        
            |        
ParserElement --+    
                |    
            Token --+
                    |
                   Empty
Known Subclasses:
  • And._ErrorStop

An empty token, will always match.

Nested Classes

Inherited from ParserElement: literalStringClass

Instance Methods
 
__init__(self)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code

Inherited from Token: setName

Inherited from ParserElement: __add__, __and__, __call__, __eq__, __hash__, __invert__, __mul__, __ne__, __or__, __radd__, __rand__, __repr__, __req__, __rmul__, __rne__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, addParseAction, checkRecursion, copy, ignore, leaveWhitespace, parseFile, parseImpl, parseString, parseWithTabs, postParse, preParse, scanString, searchString, setBreak, setDebug, setDebugActions, setFailAction, setParseAction, setResultsName, setWhitespaceChars, streamline, suppress, transformString, tryParse, validate

Inherited from object: __delattr__, __format__, __getattribute__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __subclasshook__

Static Methods

Inherited from ParserElement: enablePackrat, inlineLiteralsUsing, resetCache, setDefaultWhitespaceChars

Class Variables

Inherited from ParserElement: DEFAULT_WHITE_CHARS, verbose_stacktrace

Properties

Inherited from object: __class__

Method Details

__init__(self)
(Constructor)

source code 

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

pyparsing-2.0.3/htmldoc/index.html0000664000175000017500000000114212322542217016177 0ustar barrybarry pyparsing pyparsing-2.0.3/HowToUsePyparsing.html0000664000175000017500000020762412171434766017100 0ustar barrybarry Using the pyparsing module

Using the pyparsing module

Author: Paul McGuire
Address:
ptmcg@users.sourceforge.net
Revision: 2.0.1
Date: July, 2013
Copyright: Copyright © 2003-2013 Paul McGuire.
abstract:This document provides how-to instructions for the pyparsing library, an easy-to-use Python module for constructing and executing basic text parsers. The pyparsing module is useful for evaluating user-definable expressions, processing custom application language commands, or extracting data from formatted reports.

1   Steps to follow

To parse an incoming data string, the client code must follow these steps:

  1. First define the tokens and patterns to be matched, and assign this to a program variable. Optional results names or parsing actions can also be defined at this time.
  2. Call parseString() or scanString() on this variable, passing in the string to be parsed. During the matching process, whitespace between tokens is skipped by default (although this can be changed). When token matches occur, any defined parse action methods are called.
  3. Process the parsed results, returned as a list of strings. Matching results may also be accessed as named attributes of the returned results, if names are defined in the definition of the token pattern, using setResultsName().

1.1   Hello, World!

The following complete Python program will parse the greeting "Hello, World!", or any other greeting of the form "<salutation>, <addressee>!":

from pyparsing import Word, alphas

greet = Word( alphas ) + "," + Word( alphas ) + "!"
greeting = greet.parseString( "Hello, World!" )
print greeting

The parsed tokens are returned in the following form:

['Hello', ',', 'World', '!']

1.2   Usage notes

  • The pyparsing module can be used to interpret simple command strings or algebraic expressions, or can be used to extract data from text reports with complicated format and structure ("screen or report scraping"). However, it is possible that your defined matching patterns may accept invalid inputs. Use pyparsing to extract data from strings assumed to be well-formatted.

  • To keep up the readability of your code, use operators such as +, |, ^, and ~ to combine expressions. You can also combine string literals with ParseExpressions - they will be automatically converted to Literal objects. For example:

    integer  = Word( nums )            # simple unsigned integer
    variable = Word( alphas, max=1 )   # single letter variable, such as x, z, m, etc.
    arithOp  = Word( "+-*/", max=1 )   # arithmetic operators
    equation = variable + "=" + integer + arithOp + integer    # will match "x=2+2", etc.
    

    In the definition of equation, the string "=" will get added as a Literal("="), but in a more readable way.

  • The pyparsing module's default behavior is to ignore whitespace. This is the case for 99% of all parsers ever written. This allows you to write simple, clean, grammars, such as the above equation, without having to clutter it up with extraneous ws markers. The equation grammar will successfully parse all of the following statements:

    x=2+2
    x = 2+2
    a = 10   *   4
    r= 1234/ 100000
    

    Of course, it is quite simple to extend this example to support more elaborate expressions, with nesting with parentheses, floating point numbers, scientific notation, and named constants (such as e or pi). See fourFn.py, included in the examples directory.

  • To modify pyparsing's default whitespace skipping, you can use one or more of the following methods:

    • use the static method ParserElement.setDefaultWhitespaceChars to override the normal set of whitespace chars (' tn'). For instance when defining a grammar in which newlines are significant, you should call ParserElement.setDefaultWhitespaceChars(' \t') to remove newline from the set of skippable whitespace characters. Calling this method will affect all pyparsing expressions defined afterward.

    • call leaveWhitespace() on individual expressions, to suppress the skipping of whitespace before trying to match the expression

    • use Combine to require that successive expressions must be adjacent in the input string. For instance, this expression:

      real = Word(nums) + '.' + Word(nums)
      

      will match "3.14159", but will also match "3 . 12". It will also return the matched results as ['3', '.', '14159']. By changing this expression to:

      real = Combine( Word(nums) + '.' + Word(nums) )
      

      it will not match numbers with embedded spaces, and it will return a single concatenated string '3.14159' as the parsed token.

  • Repetition of expressions can be indicated using the '*' operator. An expression may be multiplied by an integer value (to indicate an exact repetition count), or by a tuple containing two integers, or None and an integer, representing min and max repetitions (with None representing no min or no max, depending whether it is the first or second tuple element). See the following examples, where n is used to indicate an integer value:

    • expr*3 is equivalent to expr + expr + expr
    • expr*(2,3) is equivalent to expr + expr + Optional(expr)
    • expr*(n,None) or expr*(n,) is equivalent to expr*n + ZeroOrMore(expr) (read as "at least n instances of expr")
    • expr*(None,n) is equivalent to expr*(0,n) (read as "0 to n instances of expr")
    • expr*(None,None) is equivalent to ZeroOrMore(expr)
    • expr*(1,None) is equivalent to OneOrMore(expr)

    Note that expr*(None,n) does not raise an exception if more than n exprs exist in the input stream; that is, expr*(None,n) does not enforce a maximum number of expr occurrences. If this behavior is desired, then write expr*(None,n) + ~expr.

  • MatchFirst expressions are matched left-to-right, and the first match found will skip all later expressions within, so be sure to define less-specific patterns after more-specific patterns. If you are not sure which expressions are most specific, use Or expressions (defined using the ^ operator) - they will always match the longest expression, although they are more compute-intensive.

  • Or expressions will evaluate all of the specified subexpressions to determine which is the "best" match, that is, which matches the longest string in the input data. In case of a tie, the left-most expression in the Or list will win.

  • If parsing the contents of an entire file, pass it to the parseFile method using:

    expr.parseFile( sourceFile )
    
  • ParseExceptions will report the location where an expected token or expression failed to match. For example, if we tried to use our "Hello, World!" parser to parse "Hello World!" (leaving out the separating comma), we would get an exception, with the message:

    pyparsing.ParseException: Expected "," (6), (1,7)
    

    In the case of complex expressions, the reported location may not be exactly where you would expect. See more information under ParseException .

  • Use the Group class to enclose logical groups of tokens within a sublist. This will help organize your results into more hierarchical form (the default behavior is to return matching tokens as a flat list of matching input strings).

  • Punctuation may be significant for matching, but is rarely of much interest in the parsed results. Use the suppress() method to keep these tokens from cluttering up your returned lists of tokens. For example, delimitedList() matches a succession of one or more expressions, separated by delimiters (commas by default), but only returns a list of the actual expressions - the delimiters are used for parsing, but are suppressed from the returned output.

  • Parse actions can be used to convert values from strings to other data types (ints, floats, booleans, etc.).

  • Results names are recommended for retrieving tokens from complex expressions. It is much easier to access a token using its field name than using a positional index, especially if the expression contains optional elements. You can also shortcut the setResultsName call:

    stats = "AVE:" + realNum.setResultsName("average") + \
            "MIN:" + realNum.setResultsName("min") + \
            "MAX:" + realNum.setResultsName("max")
    

    can now be written as this:

    stats = "AVE:" + realNum("average") + \
            "MIN:" + realNum("min") + \
            "MAX:" + realNum("max")
    
  • Be careful when defining parse actions that modify global variables or data structures (as in fourFn.py), especially for low level tokens or expressions that may occur within an And expression; an early element of an And may match, but the overall expression may fail.

  • Performance of pyparsing may be slow for complex grammars and/or large input strings. The psyco package can be used to improve the speed of the pyparsing module with no changes to grammar or program logic - observed improvments have been in the 20-50% range.

2   Classes

2.1   Classes in the pyparsing module

ParserElement - abstract base class for all pyparsing classes; methods for code to use are:

  • parseString( sourceString, parseAll=False ) - only called once, on the overall matching pattern; returns a ParseResults object that makes the matched tokens available as a list, and optionally as a dictionary, or as an object with named attributes; if parseAll is set to True, then parseString will raise a ParseException if the grammar does not process the complete input string.

  • parseFile( sourceFile ) - a convenience function, that accepts an input file object or filename. The file contents are passed as a string to parseString(). parseFile also supports the parseAll argument.

  • scanString( sourceString ) - generator function, used to find and extract matching text in the given source string; for each matched text, returns a tuple of:

    • matched tokens (packaged as a ParseResults object)
    • start location of the matched text in the given source string
    • end location in the given source string

    scanString allows you to scan through the input source string for random matches, instead of exhaustively defining the grammar for the entire source text (as would be required with parseString).

  • transformString( sourceString ) - convenience wrapper function for scanString, to process the input source string, and replace matching text with the tokens returned from parse actions defined in the grammar (see setParseAction).

  • searchString( sourceString ) - another convenience wrapper function for scanString, returns a list of the matching tokens returned from each call to scanString.

  • setName( name ) - associate a short descriptive name for this element, useful in displaying exceptions and trace information

  • setResultsName( string, listAllMatches=False ) - name to be given to tokens matching the element; if multiple tokens within a repetition group (such as ZeroOrMore or delimitedList) the default is to return only the last matching token - if listAllMatches is set to True, then a list of all the matching tokens is returned. (New in 1.5.6 - a results name with a trailing '*' character will be interpreted as setting listAllMatches to True.) Note: setResultsName returns a copy of the element so that a single basic element can be referenced multiple times and given different names within a complex grammar.

  • setParseAction( *fn ) - specify one or more functions to call after successful matching of the element; each function is defined as fn( s, loc, toks ), where:

    • s is the original parse string
    • loc is the location in the string where matching started
    • toks is the list of the matched tokens, packaged as a ParseResults object

    Multiple functions can be attached to a ParserElement by specifying multiple arguments to setParseAction, or by calling setParseAction multiple times.

    Each parse action function can return a modified toks list, to perform conversion, or string modifications. For brevity, fn may also be a lambda - here is an example of using a parse action to convert matched integer tokens from strings to integers:

    intNumber = Word(nums).setParseAction( lambda s,l,t: [ int(t[0]) ] )
    

    If fn does not modify the toks list, it does not need to return anything at all.

  • setBreak( breakFlag=True ) - if breakFlag is True, calls pdb.set_break() as this expression is about to be parsed

  • copy() - returns a copy of a ParserElement; can be used to use the same parse expression in different places in a grammar, with different parse actions attached to each

  • leaveWhitespace() - change default behavior of skipping whitespace before starting matching (mostly used internally to the pyparsing module, rarely used by client code)

  • setWhitespaceChars( chars ) - define the set of chars to be ignored as whitespace before trying to match a specific ParserElement, in place of the default set of whitespace (space, tab, newline, and return)

  • setDefaultWhitespaceChars( chars ) - class-level method to override the default set of whitespace chars for all subsequently created ParserElements (including copies); useful when defining grammars that treat one or more of the default whitespace characters as significant (such as a line-sensitive grammar, to omit newline from the list of ignorable whitespace)

  • suppress() - convenience function to suppress the output of the given element, instead of wrapping it with a Suppress object.

  • ignore( expr ) - function to specify parse expression to be ignored while matching defined patterns; can be called repeatedly to specify multiple expressions; useful to specify patterns of comment syntax, for example

  • setDebug( dbgFlag=True ) - function to enable/disable tracing output when trying to match this element

  • validate() - function to verify that the defined grammar does not contain infinitely recursive constructs

  • parseWithTabs() - function to override default behavior of converting tabs to spaces before parsing the input string; rarely used, except when specifying whitespace-significant grammars using the White class.
  • enablePackrat() - a class-level static method to enable a memoizing performance enhancement, known as "packrat parsing". packrat parsing is disabled by default, since it may conflict with some user programs that use parse actions. To activate the packrat feature, your program must call the class method ParserElement.enablePackrat(). If your program uses psyco to "compile as you go", you must call enablePackrat before calling psyco.full(). If you do not do this, Python will crash. For best results, call enablePackrat() immediately after importing pyparsing.

2.2   Basic ParserElement subclasses

  • Literal - construct with a string to be matched exactly
  • CaselessLiteral - construct with a string to be matched, but without case checking; results are always returned as the defining literal, NOT as they are found in the input string
  • Keyword - similar to Literal, but must be immediately followed by whitespace, punctuation, or other non-keyword characters; prevents accidental matching of a non-keyword that happens to begin with a defined keyword
  • CaselessKeyword - similar to Keyword, but with caseless matching behavior
  • Word - one or more contiguous characters; construct with a string containing the set of allowed initial characters, and an optional second string of allowed body characters; for instance, a common Word construct is to match a code identifier - in C, a valid identifier must start with an alphabetic character or an underscore ('_'), followed by a body that can also include numeric digits. That is, a, i, MAX_LENGTH, _a1, b_109_, and plan9FromOuterSpace are all valid identifiers; 9b7z, $a, .section, and 0debug are not. To define an identifier using a Word, use either of the following:

    - Word( alphas+"_", alphanums+"_" )
    - Word( srange("[a-zA-Z_]"), srange("[a-zA-Z0-9_]") )
    

    If only one string given, it specifies that the same character set defined for the initial character is used for the word body; for instance, to define an identifier that can only be composed of capital letters and underscores, use:

    - Word( "ABCDEFGHIJKLMNOPQRSTUVWXYZ_" )
    - Word( srange("[A-Z_]") )
    

    A Word may also be constructed with any of the following optional parameters:

    • min - indicating a minimum length of matching characters
    • max - indicating a maximum length of matching characters
    • exact - indicating an exact length of matching characters

    If exact is specified, it will override any values for min or max.

    New in 1.5.6 - Sometimes you want to define a word using all characters in a range except for one or two of them; you can do this with the new excludeChars argument. This is helpful if you want to define a word with all printables except for a single delimiter character, such as '.'. Previously, you would have to create a custom string to pass to Word. With this change, you can just create Word(printables, excludeChars='.').

  • CharsNotIn - similar to Word, but matches characters not in the given constructor string (accepts only one string for both initial and body characters); also supports min, max, and exact optional parameters.

  • Regex - a powerful construct, that accepts a regular expression to be matched at the current parse position; accepts an optional flags parameter, corresponding to the flags parameter in the re.compile method; if the expression includes named sub-fields, they will be represented in the returned ParseResults

  • QuotedString - supports the definition of custom quoted string formats, in addition to pyparsing's built-in dblQuotedString and sglQuotedString. QuotedString allows you to specify the following parameters:

    • quoteChar - string of one or more characters defining the quote delimiting string
    • escChar - character to escape quotes, typically backslash (default=None)
    • escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=None)
    • multiline - boolean indicating whether quotes can span multiple lines (default=False)
    • unquoteResults - boolean indicating whether the matched text should be unquoted (default=True)
    • endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=None => same as quoteChar)
  • SkipTo - skips ahead in the input string, accepting any characters up to the specified pattern; may be constructed with the following optional parameters:

    • include - if set to true, also consumes the match expression (default is False)
    • ignore - allows the user to specify patterns to not be matched, to prevent false matches
    • failOn - if a literal string or expression is given for this argument, it defines an expression that should cause the SkipTo expression to fail, and not skip over that expression
  • White - also similar to Word, but matches whitespace characters. Not usually needed, as whitespace is implicitly ignored by pyparsing. However, some grammars are whitespace-sensitive, such as those that use leading tabs or spaces to indicating grouping or hierarchy. (If matching on tab characters, be sure to call parseWithTabs on the top-level parse element.)
  • Empty - a null expression, requiring no characters - will always match; useful for debugging and for specialized grammars
  • NoMatch - opposite of Empty, will never match; useful for debugging and for specialized grammars

2.3   Expression subclasses

  • And - construct with a list of ParserElements, all of which must match for And to match; can also be created using the '+' operator; multiple expressions can be Anded together using the '*' operator as in:

    ipAddress = Word(nums) + ('.'+Word(nums))*3
    

    A tuple can be used as the multiplier, indicating a min/max:

    usPhoneNumber = Word(nums) + ('-'+Word(nums))*(1,2)
    

    A special form of And is created if the '-' operator is used instead of the '+' operator. In the ipAddress example above, if no trailing '.' and Word(nums) are found after matching the initial Word(nums), then pyparsing will back up in the grammar and try other alternatives to ipAddress. However, if ipAddress is defined as:

    strictIpAddress = Word(nums) - ('.'+Word(nums))*3
    

    then no backing up is done. If the first Word(nums) of strictIpAddress is matched, then any mismatch after that will raise a ParseSyntaxException, which will halt the parsing process immediately. By careful use of the '-' operator, grammars can provide meaningful error messages close to the location where the incoming text does not match the specified grammar.

  • Or - construct with a list of ParserElements, any of which must match for Or to match; if more than one expression matches, the expression that makes the longest match will be used; can also be created using the '^' operator

  • MatchFirst - construct with a list of ParserElements, any of which must match for MatchFirst to match; matching is done left-to-right, taking the first expression that matches; can also be created using the '|' operator

  • Each - similar to And, in that all of the provided expressions must match; however, Each permits matching to be done in any order; can also be created using the '&' operator

  • Optional - construct with a ParserElement, but this element is not required to match; can be constructed with an optional default argument, containing a default string or object to be supplied if the given optional parse element is not found in the input string; parse action will only be called if a match is found, or if a default is specified

  • ZeroOrMore - similar to Optional, but can be repeated

  • OneOrMore - similar to ZeroOrMore, but at least one match must be present

  • FollowedBy - a lookahead expression, requires matching of the given expressions, but does not advance the parsing position within the input string

  • NotAny - a negative lookahead expression, prevents matching of named expressions, does not advance the parsing position within the input string; can also be created using the unary '~' operator

2.4   Expression operators

  • ~ - creates NotAny using the expression after the operator
  • + - creates And using the expressions before and after the operator
  • | - creates MatchFirst (first left-to-right match) using the expressions before and after the operator
  • ^ - creates Or (longest match) using the expressions before and after the operator
  • & - creates Each using the expressions before and after the operator
  • * - creates And by multiplying the expression by the integer operand; if expression is multiplied by a 2-tuple, creates an And of (min,max) expressions (similar to "{min,max}" form in regular expressions); if min is None, intepret as (0,max); if max is None, interpret as expr*min + ZeroOrMore(expr)
  • - - like + but with no backup and retry of alternatives
  • * - repetition of expression
  • == - matching expression to string; returns True if the string matches the given expression
  • <<= - inserts the expression following the operator as the body of the Forward expression before the operator (formerly <<, which is now deprecated)

2.5   Positional subclasses

  • StringStart - matches beginning of the text
  • StringEnd - matches the end of the text
  • LineStart - matches beginning of a line (lines delimited by \n characters)
  • LineEnd - matches the end of a line
  • WordStart - matches a leading word boundary
  • WordEnd - matches a trailing word boundary

2.6   Converter subclasses

  • Upcase - converts matched tokens to uppercase (deprecated - use upcaseTokens parse action instead)
  • Combine - joins all matched tokens into a single string, using specified joinString (default joinString=""); expects all matching tokens to be adjacent, with no intervening whitespace (can be overridden by specifying adjacent=False in constructor)
  • Suppress - clears matched tokens; useful to keep returned results from being cluttered with required but uninteresting tokens (such as list delimiters)

2.7   Special subclasses

  • Group - causes the matched tokens to be enclosed in a list; useful in repeated elements like ZeroOrMore and OneOrMore to break up matched tokens into groups for each repeated pattern
  • Dict - like Group, but also constructs a dictionary, using the [0]'th elements of all enclosed token lists as the keys, and each token list as the value
  • SkipTo - catch-all matching expression that accepts all characters up until the given pattern is found to match; useful for specifying incomplete grammars
  • Forward - placeholder token used to define recursive token patterns; when defining the actual expression later in the program, insert it into the Forward object using the <<= operator (see fourFn.py for an example).

2.8   Other classes

  • ParseResults - class used to contain and manage the lists of tokens created from parsing the input using the user-defined parse expression. ParseResults can be accessed in a number of ways:

    • as a list
      • total list of elements can be found using len()
      • individual elements can be found using [0], [1], [-1], etc.
      • elements can be deleted using del
      • the -1th element can be extracted and removed in a single operation using pop(), or any element can be extracted and removed using pop(n)
    • as a dictionary
      • if setResultsName() is used to name elements within the overall parse expression, then these fields can be referenced as dictionary elements or as attributes
      • the Dict class generates dictionary entries using the data of the input text - in addition to ParseResults listed as [ [ a1, b1, c1, ...], [ a2, b2, c2, ...]  ] it also acts as a dictionary with entries defined as { a1 : [ b1, c1, ... ] }, { a2 : [ b2, c2, ... ] }; this is especially useful when processing tabular data where the first column contains a key value for that line of data
      • list elements that are deleted using del will still be accessible by their dictionary keys
      • supports get(), items() and keys() methods, similar to a dictionary
      • a keyed item can be extracted and removed using pop(key). Here key must be non-numeric (such as a string), in order to use dict extraction instead of list extraction.
      • new named elements can be added (in a parse action, for instance), using the same syntax as adding an item to a dict (parseResults["X"]="new item"); named elements can be removed using del parseResults["X"]
    • as a nested list
      • results returned from the Group class are encapsulated within their own list structure, so that the tokens can be handled as a hierarchical tree

    ParseResults can also be converted to an ordinary list of strings by calling asList(). Note that this will strip the results of any field names that have been defined for any embedded parse elements. (The pprint module is especially good at printing out the nested contents given by asList().)

    Finally, ParseResults can be converted to an XML string by calling asXML(). Where possible, results will be tagged using the results names defined for the respective ParseExpressions. asXML() takes two optional arguments:

    • doctagname - for ParseResults that do not have a defined name, this argument will wrap the resulting XML in a set of opening and closing tags <doctagname> and </doctagname>.
    • namedItemsOnly (default=False) - flag to indicate if the generated XML should skip items that do not have defined names. If a nested group item is named, then all embedded items will be included, whether they have names or not.

2.9   Exception classes and Troubleshooting

  • ParseException - exception returned when a grammar parse fails; ParseExceptions have attributes loc, msg, line, lineno, and column; to view the text line and location where the reported ParseException occurs, use:

    except ParseException, err:
        print err.line
        print " "*(err.column-1) + "^"
        print err
    
  • RecursiveGrammarException - exception returned by validate() if the grammar contains a recursive infinite loop, such as:

    badGrammar = Forward()
    goodToken = Literal("A")
    badGrammar <<= Optional(goodToken) + badGrammar
    
  • ParseFatalException - exception that parse actions can raise to stop parsing immediately. Should be used when a semantic error is found in the input text, such as a mismatched XML tag.

  • ParseSyntaxException - subclass of ParseFatalException raised when a syntax error is found, based on the use of the '-' operator when defining a sequence of expressions in an And expression.

You can also get some insights into the parsing logic using diagnostic parse actions, and setDebug(), or test the matching of expression fragments by testing them using scanString().

3   Miscellaneous attributes and methods

3.1   Helper methods

  • delimitedList( expr, delim=',') - convenience function for matching one or more occurrences of expr, separated by delim. By default, the delimiters are suppressed, so the returned results contain only the separate list elements. Can optionally specify combine=True, indicating that the expressions and delimiters should be returned as one combined value (useful for scoped variables, such as "a.b.c", or "a::b::c", or paths such as "a/b/c").

  • countedArray( expr ) - convenience function for a pattern where an list of instances of the given expression are preceded by an integer giving the count of elements in the list. Returns an expression that parses the leading integer, reads exactly that many expressions, and returns the array of expressions in the parse results - the leading integer is suppressed from the results (although it is easily reconstructed by using len on the returned array).

  • oneOf( string, caseless=False ) - convenience function for quickly declaring an alternative set of Literal tokens, by splitting the given string on whitespace boundaries. The tokens are sorted so that longer matches are attempted first; this ensures that a short token does not mask a longer one that starts with the same characters. If caseless=True, will create an alternative set of CaselessLiteral tokens.

  • dictOf( key, value ) - convenience function for quickly declaring a dictionary pattern of Dict( ZeroOrMore( Group( key + value ) ) ).

  • makeHTMLTags( tagName ) and makeXMLTags( tagName ) - convenience functions to create definitions of opening and closing tag expressions. Returns a pair of expressions, for the corresponding <tag> and </tag> strings. Includes support for attributes in the opening tag, such as <tag attr1="abc"> - attributes are returned as keyed tokens in the returned ParseResults. makeHTMLTags is less restrictive than makeXMLTags, especially with respect to case sensitivity.

  • infixNotation(baseOperand, operatorList) - (formerly named operatorPrecedence) convenience function to define a grammar for parsing infix notation expressions with a hierarchical precedence of operators. To use the infixNotation helper:

    1. Define the base "atom" operand term of the grammar. For this simple grammar, the smallest operand is either and integer or a variable. This will be the first argument to the infixNotation method.
    2. Define a list of tuples for each level of operator precendence. Each tuple is of the form (opExpr, numTerms, rightLeftAssoc, parseAction), where:
      • opExpr is the pyparsing expression for the operator; may also be a string, which will be converted to a Literal; if None, indicates an empty operator, such as the implied multiplication operation between 'm' and 'x' in "y = mx + b". If numTerms parameter is 3, this must be a 2-tuple containing the 2 delimiting operators.
      • numTerms is the number of terms for this operator (must be 1,2, or 3)
      • rightLeftAssoc is the indicator whether the operator is right or left associative, using the pyparsing-defined constants opAssoc.RIGHT and opAssoc.LEFT.
      • parseAction is the parse action to be associated with expressions matching this operator expression (the parse action tuple member may be omitted)
    3. Call infixNotation passing the operand expression and the operator precedence list, and save the returned value as the generated pyparsing expression. You can then use this expression to parse input strings, or incorporate it into a larger, more complex grammar.
  • matchPreviousLiteral and matchPreviousExpr - function to define and expression that matches the same content as was parsed in a previous parse expression. For instance:

    first = Word(nums)
    matchExpr = first + ":" + matchPreviousLiteral(first)
    

    will match "1:1", but not "1:2". Since this matches at the literal level, this will also match the leading "1:1" in "1:10".

    In contrast:

    first = Word(nums)
    matchExpr = first + ":" + matchPreviousExpr(first)
    

    will not match the leading "1:1" in "1:10"; the expressions are evaluated first, and then compared, so "1" is compared with "10".

  • nestedExpr(opener, closer, content=None, ignoreExpr=quotedString) - method for defining nested lists enclosed in opening and closing delimiters.

    • opener - opening character for a nested list (default="("); can also be a pyparsing expression
    • closer - closing character for a nested list (default=")"); can also be a pyparsing expression
    • content - expression for items within the nested lists (default=None)
    • ignoreExpr - expression for ignoring opening and closing delimiters (default=quotedString)

    If an expression is not provided for the content argument, the nested expression will capture all whitespace-delimited content between delimiters as a list of separate values.

    Use the ignoreExpr argument to define expressions that may contain opening or closing characters that should not be treated as opening or closing characters for nesting, such as quotedString or a comment expression. Specify multiple expressions using an Or or MatchFirst. The default is quotedString, but if no expressions are to be ignored, then pass None for this argument.

  • indentedBlock( statementExpr, indentationStackVar, indent=True) - function to define an indented block of statements, similar to indentation-based blocking in Python source code:

    • statementExpr - the expression defining a statement that will be found in the indented block; a valid indentedBlock must contain at least 1 matching statementExpr
    • indentationStackVar - a Python list variable; this variable should be common to all indentedBlock expressions defined within the same grammar, and should be reinitialized to [1] each time the grammar is to be used
    • indent - a boolean flag indicating whether the expressions within the block must be indented from the current parse location; if using indentedBlock to define the left-most statements (all starting in column 1), set indent to False
  • originalTextFor( expr ) - helper function to preserve the originally parsed text, regardless of any token processing or conversion done by the contained expression. For instance, the following expression:

    fullName = Word(alphas) + Word(alphas)
    

    will return the parse of "John Smith" as ['John', 'Smith']. In some applications, the actual name as it was given in the input string is what is desired. To do this, use originalTextFor:

    fullName = originalTextFor(Word(alphas) + Word(alphas))
    
  • ungroup( expr ) - function to "ungroup" returned tokens; useful to undo the default behavior of And to always group the returned tokens, even if there is only one in the list. (New in 1.5.6)

  • lineno( loc, string ) - function to give the line number of the location within the string; the first line is line 1, newlines start new rows

  • col( loc, string ) - function to give the column number of the location within the string; the first column is column 1, newlines reset the column number to 1

  • line( loc, string ) - function to retrieve the line of text representing lineno( loc, string ); useful when printing out diagnostic messages for exceptions

  • srange( rangeSpec ) - function to define a string of characters, given a string of the form used by regexp string ranges, such as "[0-9]" for all numeric digits, "[A-Z_]" for uppercase characters plus underscore, and so on (note that rangeSpec does not include support for generic regular expressions, just string range specs)

  • getTokensEndLoc() - function to call from within a parse action to get the ending location for the matched tokens

  • traceParseAction(fn) - decorator function to debug parse actions. Lists each call, called arguments, and return value or exception

3.2   Helper parse actions

  • removeQuotes - removes the first and last characters of a quoted string; useful to remove the delimiting quotes from quoted strings

  • replaceWith(replString) - returns a parse action that simply returns the replString; useful when using transformString, or converting HTML entities, as in:

    nbsp = Literal("&nbsp;").setParseAction( replaceWith("<BLANK>") )
    
  • keepOriginalText- (deprecated, use originalTextFor instead) restores any internal whitespace or suppressed text within the tokens for a matched parse expression. This is especially useful when defining expressions for scanString or transformString applications.

  • withAttribute( *args, **kwargs ) - helper to create a validating parse action to be used with start tags created with makeXMLTags or makeHTMLTags. Use withAttribute to qualify a starting tag with a required attribute value, to avoid false matches on common tags such as <TD> or <DIV>.

    withAttribute can be called with:

    • keyword arguments, as in (class="Customer",align="right"), or
    • a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") )

    An attribute can be specified to have the special value withAttribute.ANY_VALUE, which will match any value - use this to ensure that an attribute is present but any attribute value is acceptable.

  • downcaseTokens - converts all matched tokens to lowercase

  • upcaseTokens - converts all matched tokens to uppercase

  • matchOnlyAtCol( columnNumber ) - a parse action that verifies that an expression was matched at a particular column, raising a ParseException if matching at a different column number; useful when parsing tabular data

3.3   Common string and token constants

  • alphas - same as string.letters

  • nums - same as string.digits

  • alphanums - a string containing alphas + nums

  • alphas8bit - a string containing alphabetic 8-bit characters:

    ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ
    
  • printables - same as string.printable, minus the space (' ') character

  • empty - a global Empty(); will always match

  • sglQuotedString - a string of characters enclosed in 's; may include whitespace, but not newlines

  • dblQuotedString - a string of characters enclosed in "s; may include whitespace, but not newlines

  • quotedString - sglQuotedString | dblQuotedString

  • cStyleComment - a comment block delimited by '/*' and '*/' sequences; can span multiple lines, but does not support nesting of comments

  • htmlComment - a comment block delimited by '<!--' and '-->' sequences; can span multiple lines, but does not support nesting of comments

  • commaSeparatedList - similar to delimitedList, except that the list expressions can be any text value, or a quoted string; quoted strings can safely include commas without incorrectly breaking the string into two tokens

  • restOfLine - all remaining printable characters up to but not including the next newline

pyparsing-2.0.3/docs/0000775000175000017500000000000012417744470013514 5ustar barrybarrypyparsing-2.0.3/docs/pyparsingClassDiagram.PNG0000664000175000017500000042405211170740075020350 0ustar barrybarryPNG  IHDR{ 7 IDATx]lSg/7RF}HCA4g"v.HL!RIDEQgii*pa*(&QIR&$e.M9)PBNHH_ey~T鄵dN7zADDDDDDˉ2)13 """"Z ?+цLh1#"""""ZnĈ[vm,n҆8mTjZ,iqDDDDDiČ 8^>Ըv8':hREcWOt>gq`FDDDD̴3X'9#UR=fAX,{,rJK+:,A!>4@#3%G 3/ު+몽=k3a}nKlӚݑۘ-?LLnPj8}i\$j3Oܾ2Wxw(}D91#t<\}o.6zᰫ.7.-|Չ[ũ.9͆Թ6>iQn5Q4hhdbGf$!:טb6oL_Je,3 =&b 4fov"M[eVOgֆDW4v&LÈVF&f,͉͂nB)D.Fj4jIJJ43{{{D,2Εmqc'ު|gcou]1L<0 #""""ZAZO'ݶ; so+a>d$j%]ϡjz%A05`TzZ3ٙr3h 3OWc~ qgŽj )N`i\nvqы )Uhd&FDDDDAЭl>0/drϡLS4h-oMVDDDDD+NuegJi*Ll`FDDDDz0* l*j&ƿ->HDDDDDܘ-7fbDDDDDDˍrc&FDDDDDܘ-7fbDDDDDDˍrc&FDDDDDܘ-7fbDDDDDDˍrc&FDDDDDt+ђaC W:"0#uk旿tDtz}C "31"""Z?w*+ Qf|Oh1#"""""ZnĈ31"""""Lh1#"""""ZnĈ31"""""LOCS^I_տsEf MDD31""Zsc}旿 iru3,L/jBa)&"-23WZj-kͯ^׿jݯ^\$;yEkM6[k4\ܯFDD47ĈhFWCm0+ūqSMi:gzUR \j5ǜa}%Pr9F˔ԾC_3|nÝ\ץJG/Gf~_IDDkn " خ}oKZsӀ݇t@}CkPquhRAk9EQQWT@E9?nҡ~H@ tn2a&FDDKOɈx/nfg.S>W{}&/k ć;c/kŷO<D(?S0Q ܉>!ID =Xt]̈́p8eߤj o6{9g^ѐD0~(\ik?7=/󷞆?Th7Ra旿tDtz]-+?W+V4l -}}`۹a6kbloiXfsIu&M&5m]_b5<4 ?6""""ZrZk3k׶ {,f kCn=A'X&}Ssւ7͂K\B٥<@i#]?X>YP7&YEio?-͟sY`TRǚTAFC={ מpx/|mF8'3ft#0o?62yt}oC}Gw+qE5~d9q.= s6Åp$dz襴L-(=Ƹ O|ԌMYYsTc_\pz{h!Bk5^9w(]~{mc5|ӫXOߓ[&fj =[̇;KI͇>ºG2&!f7] K|m1eHcFxhttȞX꣱<7!o'O?c`1Ӏ)^xdsP9WFDDDD dlY`|O9UϸM_ݩ=",z xG#Uji()r㛞5<.iM&'̅;"+zb3:G Rb˴p""""ZLVs[BUeOv&>2F&&e,{b@X ڷVy)ذu/i60VnF_%}IQlyӘi9Uu='4PK[:HǔgU_2=s%J0ClNDDDDKO_Xi|o,V穵WwF\%VslDDDD+ckbD>mL)9Y,`[ N$htz}C Z-hD"""""LhL7i@/Nꗘr»#ҊM,2T[5k3, ȳ&""""31տ|yսsWpcJL\b;{#_T DDD^Ksx%liL!+Wb8YN17aSz}Β0rk3"7Gd?)W|ouˤOqmQ7iyu"R7ktc'{)}=uo{Wmoem?4^97%L6<oڡ~j{s[#Tn~t}o*_V^6z~[.޾JmL"""Zc3t/BgߏOu3AtEv+ :xZ|j0q|Q&qwǣS&zpUiz7^(9.12E"?EWtEq$NPkޔA2nTҭS7i]ZXӉa%;2滶 F/B+Fv8P6= ,R|]mTKjУ<{mFk}Ap _آ2R=+a^͇>΢[_xO*L/5::; g/Ph:4IHjӡ _P͓]ƕ]MjG^62MlwGCӡY-5AcPh:d-ćwk=YKwK?N|c;G5BĘa&L7O97i}ZX [k̥Leԣ'r[~=T#ON&4c om4܊*W[/Uֽd,zq]}P΢ۢW&"Zݩa9ODDDPx|v18*[2Kq-v%3nO3ᆳy#]Vs꓏oye7ZjHk{w9 qj&`H:8έ}^SlOfդ a5vhdbW>ى'>{>ĸv;?z:Ɔ-u=ʕ`c-O,#^,ӳ:כFXjyO 4o%/mg*R)smC93 GG_"8t"ڰײ)R tq7n=pV`B!HvWpw[nFQh0n=2lfM#Qi:zuL򝒦'M?0NZۿ4󦶌ȰQ mH`p~7 ?m}yOܞVK7y7=7h:*ck$ur|Κ[6WL¦@Dْm>rޚWW|0Q]ɂޚ㓟H tH^X]kKföM+;^,gaw;79O@c_ T~CopJG /d? v56NZ(78pcy/RZfD7jĝ!pXp8ґۢ3V|E$UF_|uqr s&+}6+N,pFY!]#-9{Sm_v4皿-ԋ~|[V~0Wh,!4C>G᳀#:y:q FD׉:^L]z9U,JVC[Ntnz˰F<hzkWr_jSټW#H5#zklm5.~=̀tt@/堷&2l(S#"ߞ ݽ~ΘhUa&FD?::FO{{Fr\_SᘑgSMOjPt%T;#5`(pb}bӔ_j;kpH3RWR/~W]%)SU >m`${:]w?-jSR@x> kMvikbej`wáYJ k2Ç?wæzk=1"+Oψs|:1ehӉ@%`"0,WIи@ݰT){egT5:> uj)xs'QNAd]70r'?2`+S_5NNa`+Bd`W~ 1uVJ߲Zn`R-Uj V=Ĉ)x-`2vO,ɫ!u\wPXըfb.G^6YautHTd͌ p208g^bL 'g+_h x_?l|ǜq,DDD͚ܖo9g\ γYPxyֆ 2, W&"7)AvN`m|ٹzτM#hi6(`w+B[zl+YU%;\Z u4劣ρK!2?{OtT*ڊīʵ~-(a#rTEiCPd*L)PlЏ@\:؋ī֒S'hQaP\aͲ6kDpW?5߻~(.1[q{`Lg,9uu-h>;b=5s@z+ 4z`k2}|e</HTK.'%^,>jxv Zg';|~f+BO|o-o,?K:LF{&-o- }9pթ1%4O$RI: )=ߓ%n˞w+015@軽MWEaCq_ZkK:D*?Ӱպ4k0=!{߶o{C9~b2xw:ތgEiOpNx\=FАjK['ݏ̘fd7 bDLjsVڰ(t#PO9z}^j@(9w[w36*^jUGts]Ɓ.( :xZ|j)0oRgX{0تIJ ؜SbWB|+˅$o\6o0n9<9sj31+_EO>zA$mVqCB?ztOYb#i?>h>;F\͕ƢWt_nvEQ$""Z5Z.nCQwѷCg}z MѱuT-mu(Ҭ/Hkhy"L?l{м6*aKXf7>ʖ' :gݒcKM؈Mp GP ׾7#ٞaK95/ 9ԭHAH擦b=5$5oloeb35w}ysA/s{G+¯h7{"4{ì4/<M<Ȱք#׉h z[=ٿ( V@°tE"-酲59EbG ~5xJ38y#T(N9ꭓ7BQ9 ґG${b3ImŇnFK4=})GKp/i[֞!/ ӯY{X'?V/h~2֤4!uhS쉈}{h1EkW$R>&tƗz8~*[WT#tֲدy=rKm:^'l^? ;?:G`]#y[a@[AA-3VV5ۭeQ~f0ZqkD"KmE3.UMAN٘t@PنLjuN~"uGٿhWi<(.{DF/i(I":r2eۅJT;Q";.]>p/]8kpHJ[KND!=?,q0Ԗ1n`, IDATQ#-\ɃlVWOi @K:]˶ cMvDDS҈:sE4ĈhC(Oψs|:$*)twB`g'F M|)NE_ ʟㅩU m:(2^UO}}v]کq*L{؈Ԏq–ʼ7-4aDDD-fbDDilǟ'Ei/- ɻQDTV.8vS(}0&m)W%˫!U#q<@EaUcKe~)MK`v ""k=1ߤEx&gl"'}J柖#$o,z L4 rP ';͈rslCgh)myծ"%藺Pޒ{{)T&bN?kp(W Zv|~TOleeX2tubN0j-Ww,$`W9jQNbgL^-8""l(7߻WmOs-xv Zg'tѯ?:IYWu 7?ux0jV>Rg[[Ax&/ל VƢi\ˇ^\WVu>籲G{\|t.~Qs&sn|.rjlD~Mw|})+=#Ma˞WDDkQZ=גڕYS^S,;>J꧳i[ZxJ -_O(0otŀÖpxO86*yw:l+<ƅg<%hjx oQ[v>>`?U^}c<։g?;_6nˬ(Fܹ;4?o۰2Զ"):g_˫nsT$ml+>GwSz;mUލ]3w[+]ݓ \â>u0qy{Ro8tԀS[O `kN @xX+c $O1H:5Ӛ&ݦũ&Ji"p+n[F֞.”jήeeGk֦ڬL?6 =ScўE E;7O!aEWToKUQrpVS4v_\FG3=+P}G/?|R[':_=m/=ym76x4h ŕFm:M ѥU>v=Cւ{*jLBӡ8ztxk=4}q!%ֻ4mݑ?z~AaNe"~@JSʘ|nA5H)DO`I(%8js\IBYVdo C7g0akvԀrn涴LLaW+Z; xO `,ȣ_,Z, m1&VNERe݋' /gܧ,|e=klz^d9q۫՝jM,fJ-(}[IO G$3έ}^SlQ~w^oq@'`8:Ƥq|ߺդ|X_tQN A1q8e `(oP.F'C6em[' >!ԹgOad[ڷ J nQ9:^k. Q W>+u$``|˼6*Ös{r3ԺSߓxuPbEg*r$㛮g3p|/zΜ,Ɔ:L#-b\~sMp%iJӡcWc[; +bj&4p5HZ-e: wF%\̞al&_Lz|3:VbkʚF<{nr.s.f=sƆ7<^̟MOjw㛞𛉗^jX5 u~$É+e=:h8"~mN zk_1'zOYrh,-%IZr7_ii,Gv͏]8 8y˱Xɏ?SԿ>ڔpJ{Z$8{^:y#tfh`[Y숳2ɓZ51=s㛡@O0F:dO>z%2GUt#kJFc[H=D1]S^}tYfq"k{"̴O31Z%6)sqUο䲨rtİ'ӜvO'"Zדzs[[r%6%JW9?2x+Km56SzNGӫE2@neEELζADk3"elK(g5娃/Pm`ĈhCP3r_]'HSt9kpH3REM`\R丄 }F2ѫ0}{Fex^-TNK3)S:V }Lzڙjg)MvۖƚJ|ה v=OK4>].vWM]΅ nj=cGOh5{f_,(udͽ'FD4qnO'NNUS Єqy.CNT'-T?l.3BiS K$*),?P*ԣx,K+2+?2K߲Zn`2*Uje1""9aMHPXըfnMyKDmQ/~T~(ܔ;g`kZ p2R|>9[Dca;f .'rkÚ&FDIiÍ,T?qDM)mvR*UjWMUgJ6ծ"*l{egŠWlcG 2VwGB;.*;?9e9rԐ({<;'7%?;hXg'[?wj_>t'eĎ:e;,27CI,A2U͓ߍ[?-~]3NO*/iAo缔3/BxF_[8>Q:%_vwXbKz8~)Ɋm O_A<Ş(hqfM).[L[ckI,dH 9/t[N[jW4cf k$o:rdi֕vxz9VV<É{XU{njODkV} pZWцtbi׉sz/]pH3[^.sI3{?3R)jgv֠t3 'axMբ3Ew\b.޳PKJޢ 3RMSa#̉&f;'-Rd wHv㤵-5(]ph$nҜF]u־%o=} 5oth^&Zx=mqO'Nw)]J,Uj}ƔW&ɀAc.3PexMg~ūqʏH [>Kz0ehӉ@%5jt|2lqIUel)ysSr<omϫje1""Zgd(|89\`Ӈ4:FKKCLƺW5&5l Ay[lF..$˫!U#q<@E~)3ƙOx>ه̯shw~Nvۉ.fbD6(UDM mUiG׉*L)?qFnM v2] x-YO\ZaOďjx5FǍHKx2=5xvO0Q <sb.oSSv""5g'}viX.+m֌ {v.#[s<3Zfe\.b/} ǏKp+^w 0=_ى+g'ͮ@qdCľέ}^SlO9][oP?\n8}[{j*V*6MP#8 V#㵽;}m1ccӸaC2 0XcS۽36ѪQPk[网#  Nγ!-ГS؄CґPoE"St(؅k_!eL I-VY+CNٚ;!ʼô1#"ZzAoXS#M#-[~"M:r0^lN/Ei|LLVH4쮙Mْќ#%Ɣ-Lu:-VMT q4Ňjͤit;Fig5eR:)O>#{b}+Ѧ>G:zf/ CU_aoGS4"[-Y߫g7v-v&Ms6}f8U"[ލ{NƏ &Cсv\niǷ zkplcy,ίO7󒰥Uu6.pZS޵(/.^$1dw[q+k8O_A<Ş(awmI,΄"_jDxz9,2W[ckI(dEkng ʊg8>^7H[=*aG{GDnM︚ǑhV:"ڊ:e]'Tc:'?Y2ݾ{D)\T}ڙvbTbn&'J FUN`@ Le6hݯ#jxUyc.ʖU<ݰ dEG/;{D~Z|? ~:=#{hc&FDBxzFӉU8g'PZ2D{egT5:> uAIMx25ˏ*^S(uO(Jڥv쬯7ĸUǚE Єq`"0LR՛|0`·tuKE**MU $W>~FҒvqV;\SU06}JP]Wl⌃DMJ ZeuF҆! ySuWÎyzȆKFϾDZ2ىD>i8'+ubLcgPiYg'fVى =pJt]imى+g'fYӵ uw:^':* SSGD߻,(/\NGDL(҆-W< :g[ݢհWD 9]aQT>|nxUrjJ`੃őp5!Q<,sZ3L@a#­D/ 0#"""Zjӡ _VӨe:ֻ?yrkXk8Y woma 4;-l)WIQ1#"""ZP]p ꓏dzRݡn'\?՘y:v(Pnx^QFĈ K1kJm j zҕ GP Y2n=IND L69/ Dns$Ao(;"1"&#;.g3"ҝJ}`hS^wl=0] kq^Alo->{k^]_s8kl=ň O'IȩӍ8o=,y IDAT uCo4#-N7 =zZ?V)skU)mǭґt/ N鈁'ݯc<~{" FZziӮ妌dg}uZ5Km:^2ulӉˑ[5ʹAc.Rƒ[[Xy/;ubRӘh2Pex -~@Ad3hF!Rx5҃Q滳Dd6&vq4"ZDĈh#(iTUg: f55>;pI3z6O(ϴzO?>h81#;~{FRHOԖF<}fKdS'hYwUډ&sDYe^Ύtr@{-LJ.~8l C,vV3V~ MBӡ块hЭtDD`EtteϺfO~ER ?|p.1ZU;"ӡ-[&OnU:5'-M@00&'g};-Ըc~'ڕ,nS~LO (7"""ZNFP~[cFk4_؝UMlH5uquWY_}蘑g$ ś?O.uϔ}Q작gJ|ϔ$|ϔWG 4&R6瓈IYni|o_T8}ŏP+lꭠ9D4%:,1Ĉhcx>j`j Ŭz'U&X>q(%u Xyد,@ub^Gɀ?@<ܒBs>[JPS<bHsyiKPΥ?u"[퉷'~$3"HDىs$;=eKpV\& zkwc N$ZWV=jg'-6xv"Q:#>e92nkym aD"KDÚO њ'6W bMl&FDDDDDK$b&FDDD47|rKm:^eX(K^B-g?h"M%][ИS',D'lIQhΑy[c0"ZĈh#&X AN٘gG.x$+i:u1i>ʼ1KߩԖ ޸31" 3"0쮙|'LQ`.3BiЦKJk=^!P$0guFBi.P.udg}!Mdx-ynS^0Lw)aXzd`W~n 3[[>.7ߝ٤H-xDJ5=t{B|=N$"JٗGZߙM9G%q"O ;|(aDX#FW&b}RZ)6R)UQi);\Z g.Ru6MESGj GR )SmUMȍ# Ole qFZlIԡvwg6ōR?T O2Ƽ:؋īaG,`րDN׉k 1=qDDDX#ijbDְ&F4' Ĉ !zL("L(0"ZĈl5b6#-[VI^r9حi֚f]EYVbaGŖI1 #eL6IBdsUe?'QKʩ#;i6H3s=#uhS1R:E&""`&FDưF(eHJvF S~֦rlT.{84`"uus%xzHku^ן>Y*r++HKD E<ׯ1W&6u٦:>}&""ڐцٻF^^n^ͦ&At' 3ta.VA1!6,$- |q, .Fq.  4qZL3\E"6Ŧ= "^7)QMC//c=RBr@Vƒ˅1%)-iX@@S^ʮJL!_ZkJ|SB ְ5%o]e([!uݷܾBuRK w: 1}>kwޯe05Qmk%3,sGEEtlԘՍ}kJ\ `-ɦ]^Y"u31"lҜĵkJ|C2wc _m=$n8lzg(IҨP(^ 2kCrrGEủ\!/݊l}txKw .c&FDVr~fOMCz uŻĵ~ 뀞n/|lB>^-WΦe0k\UAN*_9fѝq[#1r:P~+ɚ]YLÈ^@DEΩc/yߝzz/L k5yc^i} kd""":31" 2A/̩ Ghg*5* rXR} ߜ\ӥ,+"<]ƽB޽"ѐ VjǩȨ\{;R] Tnȧl/ѕa2zy%tWR'E{l]kfLQjb1)q-d}i(}mRZ~ZO<Ky/N #47iFf*YȺr`:)%F uoWrN=b+d lHF60o]3"vKBtU.Dt 2A) B/Q,;=3C}0OFД) ̺f,@{yGH94ݻIfucP#hF[NrI}nX:&sHǚ.d_"c}DW0"lX#1@kJ|Z\ZwTKJxu̿SB>\;B4S͗ ɦRNY591p)ߵgkjc:*_rcbČ_~|=3iAs/aT،'Kt1 #ˆ51" ϶1 u#W{x,g:0q@{CR@X08Ýdr5xÀ6s#.s[KSܞXQ27iLfL1tLH kڹD8:- Φ;|[ ""DtL&ͫFۻO-z?wY"d[wU[t4NL_(}Y@L&ĈZl&ű^GQayw"\M,`fiQǮ?7X#51"rjb .-;v54.9fbDDDt݈*2 #K]73DD31"1 _4 0*D1R:wpS/JY1#pl:6n?x~YsePpaL29>\=odyeJ< DDDtM J~aNM.?TG;Yc>%k\bO RLh3FC~]5V|f|ߝ߬eW[ńONZVVddwɶ[LnǼ^+n)qm"^[ݒ˅1%)-)iOSJh6_u`tdF15%]%}KqMrͣwl#Tm瘯^tY~{kKFIar5wXSZksl'LD7A&(#$UY> L%.J<ƃd2 ,Wm}f R07 ZxxOF!?otqaynGuLANˮ)Ԇ]> z`O<)ňzxd)F&-uKnI^! uu3=!$K~SB1)f"?{P(&|p7Jpఐ:fןF;=>IeTJ2I{M "" {g:K$o8+gb6iI/ǑCm#.<ҋ]8[j?4N/GG5`+Tk\LP.l#ĢS[hVso4eL$ʞN7BOD׏d޼:阯0^WҊ| 2%V_Ʉ[w*OsBDt;v]B@RB]'t51"jX#51"""""`&FDDDDDmĈ[VLk9%$H~O0m\TDU&(LTJդ m _yRA rt0ZљODDtFĈ&$bk_kJ\S>d69__Z $){5+6tOl?WOlvAy;'W]_i 5/茘Ֆhc]JN jQ 6TxR)y227i GVqʥb'|u#Vd}X0Z)ŗka11֮^FC+jo%Hh;z>NFWys'%"":uCN .TalVSb)<]5ŬL; h(OW@qm9SB?"1%>ҊwP,Ao'fl@gfP֍q٬z#t"f x8,n"zM%>Q0kP v?(wqGh:(>؏Qlj4t$B<'YSB j>cJTFkDDt1#&i '`:}#C3~?H&²g5$Ha~z pn>XD0q`W5) :1N-V3B60WB~i]xD.qPBS&Vn19$ zlSA6FNv=!""O'an(qm_:nߐ9%3ƷwK]:&S#c 7hDn-՛fl$ˁ)՘4[ՌVBmc?v K{sArh'& 9643!볋׏Oyǒ?Y 80#o!H WˮV\i5~Oj~Ω^ٛ{Rl,Uf)ؓAKՇ'Q #tttH.d޼uo^#ڐ`)S"J+ȱ1<̞It­;-vDD=b2x:I3A Rxy2пy_"5E5""51"wMZbM ĈzQ1#"""""6fbDDg*b'Ohئu:;4R:kLPg9b>)5~nfbDt\Ljln_zc]kΑPZ ƺuFyGq+m=Q#fbDDmcz+5Z.|E3h8:uxx/W _r"bAJ}Xlٽ&E 2{r"fvLx2lULDDXyur⠳Oc&FD7BN _SAwRSSŸgJ9%` 녯}z0 q6 }?heC4\.)qMo!L1<]s뽆`=Qk{f FRv|VLgEvSIc>,?ȽH }Cyu%O~""kNuDD`4 H|A2<%8[qoTS~xG0Ct  c W˃u!/pJ{YC ,o-60i9,\))`}I,FDD7kbDDmXJ\[|헰xrBu{kR*[@f3 vnA/Wl~k\jwWs<9%3FMnM8,TrL7;"p| 巌dMhSjFICqE/H[r(>VedX0R9iIC{]7jP* I3^2׀-OmSb53#}F Wָ\?hq.&ÖCyuDDD7d2:"d27zu dΘ2%"?ރԄ[wU[t4"L&N$",lv@5f o^؝O)|m|9.kbDt=]ŚkbDtU&FDDDDDĈQ1#":#UI>/B+61ߙoQLzb$mvhhYu;?2/` r g K83'"<1"I1_asO'ʃfPL G\PJb+8Ǚf( cCٝ%g\s|tο=4"aMtL//Fh GV.Oآ=eJ1+UҊՀfs9k?ʌ-ODt 1#usNM.:ZvDD31"lҜĵkJG~A?~l@O?|[he׺xX3Drl`_1ѯe.Dq"'r pk+kC4+etu.{r>o5@cحKXN6+&[O_Ԕj-wGL:PԸNu|˾4 cq+; Qr:1ڭndKKkBVфK '3x-ODt-Dt86U$ȡ"$-9w{2@2,2,-HsO Мޝ@`PZD6ifB(_)|_ LUB]lj;4(׶M)<(c?R.h8RNծ֗@5`Is[FFHhd+ƥjs2A8SsKTͅEA?X4]K#tttH.d޼uSB1!LP{0WZD:wA7q 6sU=8&=c&FDUĀҊxm3DŻػ / p.L fbDtm]L΅]&w """""6fbDDDDDDLۘ$r ?V6GOhP#bj,jܱI5DE3w)%Jcl-4>i9Օ,5 xz-f~:DDDc&FD7.ln_VZ{.1l&-eng[!^<ֵ%8,n;ۚeRCہ`%}=SBB, rL94OFzbk!A!_ه8+˩vT MTZbAcWͺ0luVˬǗ'U"""jLn#Sˁٹcb\S3}Z׾u=8>؟u4ҋWCRbbz -]?T[ue([!uݷܾBu@|DbԮ@r05%p0 4YL9] ۆd2AigL=&]~­;-vdD""̓s9j,O!łF|ߝ߬ 2lV15.jÉnfbDt#䔐 95$'15_ZkJ|SB ְ5%o]!gzcj hJ\SKu=I.Ɣ0ķϊhXo7P;cXr=ӧ>5>0F ۈk7U[sGEtlXE| T:~kIi.Dt#ؤ9M1_a|_kGg:$Le-t ΆЎl?YϬ!A ^ uݷT{f!?onaCvXo7k<` e:<띖܎:e똂]SnąBu-'bDDDŚQ`%il)ֹsj $c5'coo-bȝ0LlVjVWftgwz\lHT=9_~f|"""kbDt86kYmQVɡ"U)9w{2.l@NF\xdpxD6iI}H̵1ؐgrMDc\5.@&(g(F\˩E38R<flܖsu|"""d2:"d27zřVߥP/mHf vƔ)c]~­;-vDD=b2x:2O7q}43$ H?_sFDDDƚ]OW&FDg]31"""""nc&FDDDDDmĈHU9ńO ?rTjI1ĩ ۬yؠRFZ)%Lq33瘉Mr1).]~y~sO~:Bq*S;J_Z $3L[ܤ ijs 9b.;fbDDmcz+:_B4@#{L sJ');, }03;<\^rJRs[N]-5SL䐯LW|fȡJ1'5Kͽ.dj닇V1;S"tI]BĈF0҉95$'15_ZkJ|SB ְQg[,Nv=(&Дz)S8vX9exmpLbk\s[>NKF[Lϊaـ qm}ׅL F\ڬ1j~]ևf^>Z5wXSZk?F""KJuDD`4 H| I}#C3~?H&²ggMӻ XϬ!A ^z"t°.D#'f^aq[y!+eהK\(-60q ^ 1uG܎:e똂4lyó!,'bDDtE&FDԆŻĵ~ g(^iJ\.cƨ=Ͱ靈'Pe_}8˗ ѝlH⤦Ԗߺ[hf76.bj8,TrL7;ڭڇMDDt&FD7sjyr+&@EQ oɡ[h6#5 {ChK8K81>sUږ2)eGpNmxh`_?RL* ʞ6`KgLP.m#Ģfܖi&""LGGG&ב]$ɤy(.Ҋ| ғpjY[wU[t4"L&N$"!̓ iLLDDty&FDkbD7kbDtU&FDDDDDĈQ1#":#UI>/TD3g,bj _]jL-aM7h1Ōj4DDDW31"I.&Ue6/b/eϗ3 [n~9^;paͳ;敎>~7HDDte1#"j#\zJUh8:>;jh_7Z1+wlTYJaSDUZdظr>,V=|rHbjBULQ3,O!ł*ͺ 3AV]o15:uCN .ϫ2@ e439ȽH }0gKU.GV=\DDDW 31"lҜ&阯0~bw-#D3[O3kH%c[5ǓC~8T&Ƙ8!1ze+/H~AtnѴJOqcf~:DDD 31"I.7~]fsV|y!uE  pkk17y7wE&(5?9<3Zi%\k|ur*+s|bzN;#Q1#"j#ӋHzޢFP`4cq2y{xhePS=W dddm*ݛG7)`큜jfihSwg&-z[d$>o<@!!ZR}XjJ!_DY(4jVf]~ uEceˉs ""zэ`*sjr9P=w,5_ZkJ|SB ְ5%o]!gX2Y}{(dQ:Z'1%)%>9&W-*.O3kxmبmyguy֒ ""э`4%DtXSZw= dz 'HBm"]6Kj0[6ۈ 6g#m؛G7$_GSP9cƨ\h:o\QZ ^( VT8;gffuX8|嘙oFwvEokhԎ_~f|""KFuDD]pvVG Ӌ_P| ؏xm#.,-a"prͭ}Ic6|ͤMZԻx75GW:{i%\k-tOl?W; ] |3Qkj4C$jٷ?FrϺL8cxڬń/A-ThG9%dBhy5ȡCK}VNZ'#smԟ J+rQ?7k qgL;4 x2_toc'""ĈF0ͩ ;Y=M Rv|LgEb\S3}%q6 CRtlBX?gh $ cJ\S{@\S[gEPq:QfZGUu]09;)qM` 4y1ۈk7☯M.z:""k6iNSZHL5%x<mxY/Hz`<`}# vˡ]nTLj|u7N'ƷnH +#T +uyH+-<ۘtDDD31"Nc5mYJ\[|헕RrHM$ ٢ӎev뀞ͤqUg 'ԫ.v:""#9QL&Ĉ4 "5VL, )qM /e[)OaMk%Mـ|#aMkJ|ߺLXoCF\|1ڎ /5&o!ZDEDDD';э`4 H|jvYl.[g֐ KU) IDATzdC.3XO<dxf1t)P\/eה %8GEDDDƚQ;ftgwz\rJ1fցQl&c{٭i&) lźI嫺lPSjmFkbDt86'vSf5%V/HDكVeG@z   3kÃsj+Ujd2:"d27ziV)NAuG\_EwOc!":dD"<TJH?_sĈz51":Ĉ`Mu31"""""n]o7N]_zEzѩt"Q1#"""""6fbDDooz]6Ĉު};&J?/C;yeS|_mMQկ`BM4K7>ӋOwm31"QgGO}_~w[wYQ } ?M|~嗍m ;jo0J(~#_/~b/>EO_{~t;feDDD731"9R?JG_ˡT%ajLPS-&/ޝ̵5f:+ovޑGŻ#R1Q7':N?JuMкYSmѸ}#""jmu[@.ţ4W1x۵5%){V2c4 pa~v>EݩOO@+oRv}x1{r ,7h߈b&FDF:&H~ASBjo@1CH-̓I h8:䔐O RLE&(#Vd}X0Z)ŗka> }w~3]L]e6vI6nZg}ńW52ძ.͞T;qO'эPsPPxLM%_>v+s6 G @@S@iE~RtL2gCiE~Y;in(7; hq6 g3(I{Zd6s֍p5wXLP} 9&`q~r21?%XVU3ݸ葨P%Μtqӎ> *=͂jh6VAW[5^Ӿ\IU6э`4D] tx<ԆQ" v v_c^Ԩߧ7)G\z1+͍oNTZ}7}fm =8ɀ\uw2AHoMk;rr6ݞT:ӉDDmXJ\[|헹~l4cMwtODŽ3~d3vnAe6`Wjc;ߘpXHQ?o+9%v7ju3.+,^;?(-op9MpvVG 6 CSy⃅Gzf@@_ .LVelO&L,#0ņ̹r욪i řWycPo):rJk79ˆsOꛍj?jmU{2k6q--؏XFDDt #gec2xnQ?WnʯkWH5mH暛VxQcw,;K㫻'3HDWdD"K&Ll/Hq̓s8Řkn}cwq̟giѾŚ]Rנ}Z+Dt?DtU&FTp{4_qDDDDDL xy!:>DDDDD31O}i'_@a;­;HT~#ܺBBDDDD31\߀<`?' ͫ~Orꏿy5'୿؍B{j??$/7XbĈ6FO__.^_~YY^U[ԗ[' !pNC """jQEA5tv$K_~%_ݤ?1j.JY跄V3bm>$*_n_ɏznE~+gm??x?~+,7';Z#Q=>O.)> fݩ*jo^?U>)AL&SCɤ`b&vzE*ܺv7;(&:Wd2{bDD+2nxwtaQUT9nsĈ.t7;(fb&FDDDDDmĈήximwG%31"""""nc&FDDDDDmĈΨxwG%Ş./֝^@DDDDV0ˋϙ9-G!u7;1"D" CV] >XR|GUOr-۴~2rd% fbDDDDDזW/敶[vߵ~D[++E/V bvfbDDv*wG%Qo= JU-dS x~ VޫTR6V>ZD'O~IkMns'~kv^O{bDDgou7;(/7?5'?_DW/ ꏿT_FUor/6 +}o @k[n;Zdb~WD1'MӭD_]H[?o: INk*Rl#ZE#2Cls#MZ$ǢTh;Hq!XuBdv" mJ"i[7;1ok^H^kwbZD&o|[bщlQTgG3_J(? }ߦ`b_@8znzn{&96.h,!vP*V|٭FM=\8偔a G'_)} 3҇ #K"÷Vo-Z6sP 34^0^1znYFbATB_|$[xxH?u@5ZsjMh[XwyymGX5BquZS˃LO*Ǜ=fNi&ttC\p(?6 4x# י/%,~)D]KR1'FDDDDDmĈQ1#"""""6FbDDDDDDH(e#1"""""lSDDDDDH KĈr@ud7xD"""""lc$FDDDDDmĈQ1#"""""6FbDDDDDDH(e#1"""""lc$FDDDDT:V?^P{VEτx괧#z&t`$FDDDDV&lޝ >Ļ5u޴>φ98rƦWROQ^8kSj\!i斾- FbDDDDDI:6{KE[/wE۠{\B,sT]JLw&Nπ>1Nҁ̕y]C VI'S"-=u;@6O/B: """"*u!@M~y{u6ӆ8-cʄozwP>';[-? :lur L#t[2as5Ťc. ]y(#,lJXv&<-/^O7oiOvVxT(46N#1""""3%;2a4# 6 wk]r8tIkv b퓼Sѵu`uk8!6@{eY@tE5cZ(>T]oFw6-}XHVEgXN$""""*@+bQjS _-!;-ީ=׈/8Ņה;ПA I=5A,L dYqosrwLlaN(?;T(k4ڧ->sc{4MwGV}SJ~aeT!I:PM˯Sy`2W&ROM`[i^y6p%E4]ޞJuOT*iw;׽(0jNCsNRrAeّ̗JٿꈞӴؑŊ.~+ yFҫvߵT*G'И?OwCtkv8:Ը5Gʞvwaر1'FDDDDDmĈ.QRktB܉DDDD)yRuG3N񀇈xQ1#:.9!&/۱,8:Z>}#:JuΪNDDT#*|?(fDDTKߥmFRoi"ʉlFL.'FDDDDDmĈ+q(uYpt"Jyb"X"*MĈNQѻ:~R %}8"(QSTHDt#""i+9c 0'FtJuH'&b$FtzHDya$FDD"4u_% Ҭ69&3,\<”7}bDQ:4 Dl}t];O%iϡWҐxBжº Zu.sbDGH{O;H" %7-61\tjtΩFn -rZSkOcͦؔ"JJvfCnL6oֲO;Bt!#:Ly#:'?࿣Q;l\Үدt6 2y;/‘;kR64u׆f3\/3[s_SgbLw!@AgjuK%:%ɏꟵn+~姙c zηalVs(QsK#1""x-Zq[*cAգGxy #?wu޾`}n=tPhs]lbxy&+f%'vf n /bB_|i}<.h*cD'0'1D""/> ۦ[F҇VڨEW+uv#0|kyö-nK25 Tyj205ΐxf%7 wCkWr8^8#" `xdь-ď4i|+o߫{_IB_|8KVb~ LQmF崘J?/TE&ou~ Y0/'!E/ZVB$D5l~FT*N$"".Y$pt"ُ|)=(oeXFb(yc{]cDD܉GڣsR4hNH#"'xEZ3$د6 454Nr i]ުg<24QNẻQH~ls@^FAΓ mG' mKww ~˗S8S "Ĉ(>?KyqpsP,u_YnN":TCcFْTXt%_e'+zK)3Xf%m%[:5:ԌM#S8w DtFbDDD8 #w͋vnY=omo"([mSBF-5nV2([iá5y+Ď,pD.a3ˌ8Az_)- )tv׆Q͝5[iw{ÃN:)嫌&fs"#1"""#CkͶn䅼iȫ]iRrD¡5 ؏[ҫT~q5e+i]^5G?*˳ECk0rrr+{Oᐓ:)AxQRktсCo! CahOqKbŇʀq%zXҫV`ŀ}H_خ=6j/gRЩO՛4ábG Wi[+-^H96'uS [;#1"@t:%BN:5]'WRVYFb{-O7ڴ4MΟf*ےV}p,2MVH>AƿDD 1cM^Gbs)c""/?{$Fqux1(_;@DDDDDTre#1"""""lc$FDDDDDmJZ,C%:sPrjG'Ss.'l4' +N&"""BO֎H$hC\w0#*IJF+2v2 _?CS͐S<u ]Fb[kFNu<UЖZ3$f,\Iy+y!|h^ԋ{ IDAT-#]mi_w7nkw[ݖ>|ۜ2qe dbض- 5m9\ur$Qs-ޖtaѧXbQGmie}[!0?LTXh*>cPY\jS폎k %s[}GR"m 0|kE%ᅿWΉe{tRSňΦ3xѮz:ڊ~tgii ]O:ıP<@{ WY>n.f;rh~e<=%qGX2Wv%m;{70- %vǞV$"""*I9_^I L_|Bz}O=cc3FD.$^mw_|Q! ƫIy""""RʑX|:V'>ktM!ScvjM/~e2 r_ICAޞJuO2PT仞B{BDDDDDG'D]t m/m#"""< aDUVʸ#1"""" S,5g҇WN.z;W|!:%N$""""*&7RJZ)AK >}d.n?>EL1#F.Q 0|kاGh#p5cla_l?Ճ :5wznỎQT)C#1""iw[R!NQ>1""ʒqrJOADES+S1#*E0 VwF{د.{Y6ieiOn(Prde9C.imޝHcjԔfpP)"""bǜQRT K=5Xwauہ]DoXPӍA X 7Xt6{v&}5\`{yY9<6ׄZ) w`ADDt^='][ ?Ε!zC49Q86{&zE5隬ḼfEg5}cq\w@moU}kurBO򽍞w~XNK k%o]|>;-yǷ^'_#@ Ǧ%tx-$Ln (BY|)% 7MkWb 0;6Ru4+6bbH D *zuEq䝖a;}^Sm7Nmo|` V]N^ E2ٮVI PVaT+4ZTq1""ʄͻTRd;VUX %R{VaJ~ HNDoPVo/-ϠdٰwrJfrecᾌq 7MPe5%-#$wCͭc`n ȍC,'CB`' [T A5՗g%'G3_oٚF/BplDVA:;g@!P%fX[oǒ\~@mT'5s!ַ  LDW )\^9ԩqy]CϴԓPvp5Ju啪lR7NJ =bˀU=vFYNʑ>FADDt )',1(&/7<4 cPzj;'3hXz*՛ a!cpI?(neB=L9fI_Uާ]8ì! 9a+s?;j89*cDn?>Vj<䒵p7Ͱn+KZʐ*0'1BO7,kT 34u[tpX@}fRCO .Yꗵ7}E*=u, q"7s] 2qg1W\ F'!ʏ͂-bvx1OR?/ wOP@<X섐O0LYf27^Q{P _ F1#""w9s XyyS#O|/>do0ȋ:pI_-@D9q3bKFma>N Wkfc%߽Ú yuF}zNR8z`a@^EQ-RxO #,sI?oʽUiZA-^ K_.>+~Vf[I_)V`|ҟ/G—2f\b8}ig]y_8ʚ|^"YO}1'B+',άOu7ܬ9vY)D"""" pǣ,S\.BĈr#8yގ􇈲Q1#"""+CTd|_˳o໽$\wN!#1~" / HB| *!qgizVgprP,o;l,f+P>ӑBS+{>%z_IC7tj;!Yxv/iO)(ŸQH,Hd?]ʂ߃:Ǫmi(YX7n9;]~!n.f;)Cåti1"3)H.o /(OM]9Obvd*Iyoy2bp71I7z-/!qDpaV^h鯗V̰_GB5X!Cgl&Rd1tӍ/u4TD6-uZ+܉1?,#c_ eh0!K{hDDtL=;%}hZ+y S\?Qĩ@)R#""" **] J0#""" LȸFbD%' ADD#Nގ&%:FbD7%N$"(w,ѹc$FDtf["""FbD%ȡLQ1aGDDQiwS*LfR?H|P1XL<2^0"""Oa||*ABH,{YPgQa$FT<&Q`$FDDDT~emZbB۵l*W7Wv&"""*p'#қ._s2 ,TݓDGl616FbDDDDE 0+FP/hG&ON 5:F P5CvL6Ms.l8TթgB۔ܷ *Ĉ 3s+Yi^f[|ܖv_90Дݖtf&-}xj-".Ǜmi~,]BH(+6xg`2rzwUR7 w1`e9Q1P"=$4Wk\H>[/lhZS_{;@D#1";y#ڊ''39i%lqy;b 򬙵M-9D" 2j-1$֎Ѭد_ӆi0#"ʂՅ{=7"1`jbv&MY !%'2aJ*PVo/d]"+?Փ7{MdftfoM W&X:Ditіa}uf)[+8(={.=Ck2fԚ;n:USk-Nߘ.UjtꟾT[Rm>1q{"y*ˁ~A^ @ף+jͦgAv&Kц?GgÒ E[Z~FA1n/G(cslE{jn~[EmyoYE@m:~8U]uڇ10-*V'))Bu`N+`zܩQ w<:,x~ܓ=\Bou!n;Pšh_o'nߝ߽+?loKۨvM&vr AmL*FDa$FDtd?z>t-?]``,7@YVxT M  Wk3Br(xӢCL:10^"czjBށ~owaڃX3zwUim9 }sk }?k1 ,"bcGsSO|V?Uur 7}Plyp{ʥzs8?tԷcF]N;CT8:/2٬w.5}ec :%c+>;-/G3 4+Ay ZZY ii~kF|+w@moU}1=}aW:n_;Wglʄʫǰs%C m*#(Uƛ*П(EZ2kX13{OǷ^C MKK;Zr),3W|iNK> O~ gr\Bs\O1(N_Bݖ^DYe;>mhtsn}Ocߙ5<.˯} AUm 8/iȐ'beDSGzy:U2!}RVxS?WZJIxQc"3xz֜o6z;b%SZJC !_0g}P1ЁO-s1MRT_~hKaPT"Fb?K(669~/8~6u@+iȔ0^˿[~bՇ(_6v7(AAy0-$qy囔bJָ.ؙ q%ie2,fWXt'r!ջbP6uF`S;'V\de=wdh-6yxz% y[;Ѥ} Dma>?')|$_#>ZHrT]Ce O*,mo7BS-#]~Aؒ:[]~!ӻ#327kn:~!:a2Sĺ|o=X[c`;e0'qy'j%:`nֺ-c AbSqti خ̪PۀN ėgw'fO~L%\wK`U{{{*joo/;+Y*kItjSiwI쿿__g+i(+K?hǶ Sso]8FщHO=Rzv&scB-27koFDT8:rxs`zY=`h{hԦE6nY4c}bDD [CIGNT!\a$Fah{!/4 u +E/1It݈dԥH0}tx\ DDDe#1"""""lD"ׅJsbDDDDDDHglZSktȉ/5Cbj'?JHglUٖvOs˹|t#hןC(#'=\T\whT*y"":8<}V iV_gL=Z>?tG~t]||Ҭtw\ˇ!m8z#]i-g#rt_^]KADcshJoSsv3@˿CCۏ>ٖ=cht+Kle鯗:Xչ- ; ƭxˑ[mW]Vγ0#"܈}A(qIn"*+fqs? `jsW\!*CJzڊҏ Jhr% IDATfLy]UǴ؉>1""""fGaF\#K"F`r-_c "Qx tw%O91"""";k:˽UԽ)WR64ux+_t8xDC[B˱;T{{{m: T*6 ?Dzpͽ \xTpwhgO9y1'FDDD8 QIa$FDDD8 QIDDDDDDH(8:(_dg"̉ 30Dmǎ[pzwRzSYu'ij?zڱ.ʄ-zXNQO_ gڪsF`<v&#䍫 w׸Z>ȹ7~Hc]|ڦxPD(ϐqtb04ښ0~!{V0Cj}ROM;0ߺmtuV&ԃ"tcpؽ|C:VƂ]C.چX|o`Τ&5\`{yZw/q:Q%dV9<+;kR@h~fkkc$!@M~$UhX2u斾XO=Εngl5!.Ctօr;>VrE`uaئgAv&Kц?Gg6괇C^hɒǏZ8i姆=wLK0W}{ 蘸sI(щaJii@>GaPhl[3_7^X"aI``+Y-VElWϤ PVaDRif6~Hf-c6ͨ?qٖ1FbĨ?U 7M\ˈA1U*bV| ˡ=sΏxJ 63Hu'Q1˩ڎe&囑˱er;~ j{} خwSL @ꮗ`ұzLݰwĪ3y m/+JJKeG,A!NNb7V9fΕ$Db/K`$FDDDDd1+26-y%pKϹrԸ_#ggr8(|ކW9"f%b+[]6 =T>1""""3 y_=v#j}RO V&lmn10\k_:pކ{;^8jt6S[5ޘ?)CށXEiWƴ_iZSOp3^S.ԛã+qjFbDD^DD&| Ϗi6ʄ}iuLc N(ƦrhCX;hΤct)P-{\q!uJK{2D(=ٙtNFkYr׈r;!hJݱb.>Il?!_3K'؊v04ښ㿂a8E`|KD`ʄ-t A_6V8* ;L$<@ &AtT_H|R813ˆM`++l1 j0b\IWk'`}08xƤ3PR FbDDDDDgS{zpt`{9YVjkA:(K(A% (q%9L`z3{b-˷x]"r4KNCU8Wvor L Hn;щ9ܟu>SlZ,2=J9J1Nt(?>:?s/<:+.YoMݯz`u3ksսXoӆ?|#[J ;'dBd*3阫pBɻzܦLPfhс'S,5C~ZSkD<թGMXus@oGOi0b^WW6m?N.i6$}=b.ȓ"%ww7% t^Nkxvl<xn ~IZ̑O9cZ@h.@ 断rB)5ޘ?$ljAJbc/RډO"/݀c`׾Rt1Jnyp{ʥzsxT8DDEw&@T?5qXAU"jmRV;hΤct)P-\>,k]|o~[EmMHA+Iչ2 +XYi<|o]Id>֔n/G(?& ySOG{]XuG16-C dJKWϱ`]cDgWK\Ĉ샒8G~-¡HXyd,7@YVxS?WvZRתf[D|۱+0u$~B{a@xBLOZ;i&[-—R$QIa$FDDI>6vgDs[hjA;9;7jY9<}&VjkAKe:Jjȗ(xn[&Ē7{] 9Pj?3ԟNIF|8%DDQf**](f*J,j;OpQ;+~˖c`Zm@r݉$Nvܟ8ʭt`݀`DD%E?%FRI۹E-o?!L@D)"oD*Suwmiht9! ')he}څ>͚c)Fb#ZدSktjND&ujN|ߦ93YR˻JSyV@DTxe٘Ej.nd-v3k CW]c/CUS""":/GT:Quw!1?L>~x](e\u&Cۏ;nӍ#%""""7HPnۖL+f,^ݣJeL#Q`$F! r`[H[?o ׹ul0!:mAh.$kch*ap]C=67BM?$%RmR2NHaFXN;*oX+h) 4Yy׻ޕjG;485JsTS"pFUr/O,<^qJ/ ?42ǎ=Qe*%R3)]u 8 \c{qU/tUq|V/w+jTYV<1s5u""":?#"*/m blp@0f5ͼ+\p}8<&uOtT 5!""*#1"2~ (}jֽ) UR knۧ  ) i5x0!&ܼ`$(5x𯝞TU_Q2txxjBDDTi8:܄̚ʌKHm;ToKkQV+2erܲK]K"o 7尽KLŠa^8JaDDD}bq2Dtu㻝Ϸdl5J]:`Rh̍ ׵ґo?olnL#R*Ꙙ].=FbuQB1ԯf/CAHĉjK/k"lW^֝^b `ȕUl_U!Q-`$FDT~·VS$#1[+f7hCF&x\ c/j1_jH=> (Q~IqS* ^4BB)U Dvi ~l/k)ޱ{9N%e) ADDDDDTjĈ.]%۠Tne`$FDDDDt) ;%{ 7kBH tW;4!e+YJM84C~T vU}]g92G%#1""""Kb>9j'۵KL3^my>vDEg^љ1#""""R'˽ [Au-aC}IfjnB\[]F6"u]3`fM LפTv@4.]Y#UΊG|l}H5'F[ϱro_9-uDҩMoش[~ T1gu/gWHTuWDDDINN<3b$VV' W׾o?v\.wg͕F,[ZcޟDKqaQb |=7{8HS{ 5*FgщUO+-JKҳ ٤-sv/PFd߈Y}-ؘ7 z\Ϛ<ls(-s"69@|ls m0DW6u ;!G!MR[\-|z0v/}Bň}b;D ቦD="~ǴƕIu7ZGb ش[@Bon'F[;4_Y`="}m7>2 ˀ'n6WM?Oj=Zwv{Po[?oPB(w H֊D"ЬEK-z"hvG=2:0"1vzn  -$psg-ytm1,nK$ #Z&SNܴ#v;IѝTakN2h3m zDbu{RdqXg-kQ9%"*;.LLsS]h\. y ae^93 !k~Yj` L h+iZyi-z[&Ն)eQ&&tו/H˖:q+\ `` :Uk]; DNҠX=J-$r7bh-xRw;-|Ѩ9jE5ڌ1) ^C9"}JU~rmDTjJk MtoAG'V=atAHHdl3lq@-H A]њ]_p@ҚatR(|+?i] 5{k{5@+to7y˔g-bQEƒہ&xf=VoR݇j3Eq') Z  Ef,l ;AO䔪ЕSU IDATt ܋cc[s;x/8ET׋/A-+[NPOt/fNӥNpж嶳THDDDTje$ĈZs" _5[9ENOX4jgUZG*5WY (ߘj<FbDD'qZpt+ůmNM GNռsź&p1Y7DDDt](u!hzzy#,J&rx& C6/w{|rV0J˜1Jn9fQPhG,T㉈\1#"*M'ʜ1} og4~-K_VWas tI%^F6\щc w!_c PXۣWMҩ1)jNWͮ7i՚> cXSY|SAW\BIZH%ԉj #1"8U<7-k 짶:|f>gM6l;Mg!O|#~cl-6  ww"N|xXvfl'3)?^}xC\ km>!Sʛy3XZh0EbJ_".ƠjPP%E;]nx~q?>RUXXwScw_>r pd)]7KPJS('FDT;+ů¿h.=tjZەaC} 7A`fMQ.\Z[lu0" Hw:_km Pii:Ju +2ӵt{WV^>}Xh?K9#K')+H|G|lIW~tjWUd W#8yKQ5wɷOc^A{ 'F[; G.6\#""u>M/-!CiWN'JK=cz-lYHؘ3BN먱'2c|&?YSr aSHR\kv'w!_;RuۚYʮV=(r 1 BP^. KCx-atvh+Û'xU.:@ATaɄؘ3ǺO0iv7AuA wH)#MD2Rza:+0ݕWKDmQ'zJ|q(-.@lat HSC짊6uB;-U}GӺFv|j#1"#1 @}]=Wm-ת5𦳭[L6W=Bo"Nm> GF:`g{Ӟe'fMwG2Cʈsirwː(|4-q1#"*LʴCn%$CHm!"hmC'$.ӯw ZX`8i<^7Y$2b,t׵ Ĵam&#:l B[gNF2k,ut׵,L>9O@B~Ɇmw'2: k3;sEcf H"DbL%ե3;-5r5Ty13W\[K|щDDǩ/>DDY([N8a$FDD\!"JHt*bU /LDXpˇѩq"""""RcQEJHV%!'2FbDD(r7cVq""qĈ {CQyFaq/Q ?Dk'yqZ՚jys6Q9щVATi8!fkH@Aѿtj U},xζ;YYWlgۦ{׉Y4ؘ3Ǻ-up"K.rۘ3OPjtڳB+-g-&L(>WKX/$ ¶!|DM=FF `$Вx""rĈyyi&z~_ z\Ϛmse-OAH|ls z f&ou_ G7!pls(-sƜ]b:Ŝ1g}t .pvg]8DD]~CiWN'JK=cZK&3♍9#ƥΥ \ 㶫wG[D/N-ZGf!5Zw›"[3gM9i [_}@@ד!.$ #W#~Ǵ%w%CG]mNlVx'.B?G_HZpܳx63%"=]~ZdfRҳDbQ~Hz@ ӱ}m>zF[wuuS @WFvջ$+O4]~Du=s;kJ 8 0i> |ѝ@`\Dtw?UpI;a-;;-|%숈hĈ6 UkMg[+1,臀bMV鼒_]]!ȃNjVlmÈq# =zs߉Fݑ3/tqx1@%(W,{Ѹ/FbDDT3چO^0:n ~`OH}xdJ?Mke(i*uC5LGt$= B['!3hFH[rɰh*8ѷ3tPʑ"N4gy<.\CyHW֦|_hHz쾃[z4aHA8Cnnmy^KF==ZªbEOf%^Yv_48K^C@viy>VqUݰ>PKwYwz>l]`_r|>_4VI#M;VCb USbY'iJՔ=kjJ>sUDtU` ZߤjPc>U J-؋*G'V3"JE2^:|7i$?ܰڇ}nnNkn?,5PB9a025ZP;|:}ج)Q4nmHLnKS{"Vr"2P gX5!E{G¥v߇0!k Ѭ ~c8ta%ӄ<;;p]yFN<`DDDDD5X;^PU a6i>ɿrځSGn[RfFUzwdnTr#Uok}bDDD I.ճ>L.K,BryYt"*Ud6!@d|@FIԑ9'9A=ro0@y3jۨɟ!l(/9;(}—?Fig9b$vyh. GZRL`Ƈ-KDZZH_zEO$GFjPHL3ksc8 &+Sʛy3H&2ّ a$F%ўQ)2C+_;]h _u@r|ǡaaAk###"""4Yl}B廝hKf&:H SD}bDDqlU}ح_vkXX2f8=YӿtG 2]();yv|oSeGr[Dk( #"""""*siDDDDDDtΑ{Չ* !"""@HDDDDDTjĈJAP T[\򠆕e^=#1"""5($%KdHbWg 6ǂ~_mh+o.,Ugn̙c˖s8"*-vȀ(FbDDE;isζS{֣\.w'wrKߚWls% ӒhɍӈpD"=JKүlJ["~Ŷwou_ Yul-s"9iGDYg0DW6JzRDDDtR#"d *tUT؇gMg;B?$W1>#_uBm~ .>ۣx4_^ Gg h+77іoFDDD6-JGߢ~cx8#ߞ8Ej w ""JQa7~ߺ;⬗i-hƐp%q|?9Xok>1ښﳍޙ%!P7a[^iƇRSuB׿ěE6攓"c+|:OEST;侈|pUj30Dm@|tvmC'zF't׵q6h|lp$ A~J(-z Zló&ݝEm%$M "JH*4[}\+1gZ@79cZJ67ZGb UK?$-Bje@דp+C'ə%Ħ@r.G3OV $Ld{$濬+mrV0 fSIAsߙFe2aIFS7&wwID^21yct!1گ_p/riT1.N6:U xi Emz{2ڍKlw;r%L \9C(Mr:e$m9j)W0酭~x|Ul3.˥np\R0E&'L!1$!DD@ŭu˓qu;kQJj;,/-hMib?oR4& ˻cc.Z G;벛$o9j,z+Q9忈'zY ̷)NE4|jN ;'1kbZg""*l}JjHfU/Zxqȇ.~ɦU:AWo<I6WJyL CͱL-ݷc0u-g4|ZHM쑬39̍S։M->1Ѩz+`}K"zYC佬mGVj39)a L}O5n.>ep)WC \*/,[:wlKӯ.XDU~6x)U DAȍ;Ǽ3ώ 8bX 񕪉`}Jyr$wusRۧ ؋Ĕsc80頦p) [;zdtMtvpqAlugl.[3 <KsjL}BqF1 U9]0\Zݠ{a0g[}R<7[9e{O:Q'GvحS\/_j@ADDDDD%]_ zujV@خj0ֶ>1""""5-۫A Z}"8 ?:"1Fs} H0%"˦}"q01cDaj/1U!:wĈ d "CH-QED)0#""lSʛ=!lW«=g H]d>DDё*33 &c(ez՞D/TRƇ/ok;Zڑ &,'FDT3Ups0Xku ]XR\k ;۱2] ` ܼ-'v}nnDĈ*a^`/q0!C@5{i ju-zlH45|RՠlȨ\1]F1"H0&@xek9]c-CGK'~>K}h:hdOqt"Q< ξU@~8|?0B uw ^= |k&}6cHN_nU^iQ b"*%B2眵."qwz)U MOt"%x$qŰ\vnԲ_" G'#1"""""R<1" E@@,|p@]Z_8' ^$DP`$FDD|T 8O9N^""/*yFb*7qD@HDP&FDTi8:09v7߻C;;gp{u_/]6 IDAT7hkB&qR`s,8ێ.UҜ1g[kY*N@}~|^HخbdC\ó&3;:W1>#_zV. #ߏMk\ rFHәBfE@IM zZ㷼W';GmVo[?oOM`$FDDDDKkLX9s1d7d[|P@$mQ'Ov=w>8q`|@^?mLw];򉼓~XjӍQ nAQQl+^ u:8OvUR.'N@Y狞hgܝOخjgl8u@/SXrKQ5YVWw\Q#F^ccN]UkbG0/$٫ُw.;tו V|;Ɏ'* c"Q'FDT2a֖ub@ 2פ Lק34nDt2}>=c}t02i O#+֋+VuچO4)RGw2wHW,& jam&#:l B[']c}ј'2ߧT5(s\9΅zqIEO2ڕPe]4v߇QՠTkXڮx*[N'I ]d .A'R<բ mt+Fb˥_rHځl':a} :b;tɺk̬^)\Fhh{[D:CIV2+sROl/q'N i-@.;ʀSHoR/fe$iHk&`|=Fs}x-=x|`Ty`Eb@څoߤf Cy;"q*LW5C6햗׽v[|ݹ{TUMN:+XIvc.T:#i6zY8Xօ%yE8g!o4>nG4ɻdUpq"QqbG)8.I^5}֧7QxK+vddhP\,9K9eh+ӿ_9=RH=Ĝh?'3Ǻyc~yTNJɎadRN~Y_MHfV jo*>1""N4"1 za:NFfDÛ"u7ӢNNjW""'FDTnZ^Zޔna1+pw彨^}GqXudU+tjWB%"#"q yɔD"U: kQqQ8:2 6i+ԮB%"Ĉ \&.$26j-2Bgm9U_.ht qt"Q%Hve.T">1""P8J""#"""""*5ѥ7<)jJ_TjC/zC3ѿ9v>fK2g;Tkoش[s?l̙,LDTy>77oy8K}rtySƙs;]6e:^>[vS[}X/$ ¶!|N3ڄyK$Вx""EĥH;@s{`.?2!uIYa{L<+Y I>:NmnQv\'NdB}TĶ>TMٳMDTѓlR jܒW&wmeN{H5ɷ+Mze)Z(leqט>?}-.p|ls3:2CteWZ1s|]K@ƠL.YSr aSHRptֻ/\?͉ (??|! !o[͓DDՄ+v9]3|Ѩɺk6Cp]4767 5x0!#߭wv߇01G+DTkɄؘ3ǺOĢ6t[ ӱ}a+\Fwqy}&):|q(-.@5JiJ\Y5[hNE[szgݙTHGO[]׃cN`I=U}Gz-5SDDinS<0ܜZf#8K'Vaj/qP#K;Wf̚1"sUkn1,J1O &Ei4uQexF.eB?W/{VيٹwLzwzOxǜ XvU-y^~ ss2y^;ہ`L֊M0ZmП q|=7]cpvi}Q5në9="fmCů96 +-x ؀Ig6m'Y9F{k*5LGɆmwn͑1t/ W#7P8o@G!o :q)g{dI%ܝGCW Ndt]VCBqxxX Bl!tqt >YYdRWOB'X>R;cv%q!ucR/A-+NPpt"QW\[K|3"ˋ1+q-#Io3vg 6TIbNg5*y&"'FDd6 6y_e./8bjs% V<sźܝg-^;:/GwO[wOKBIcJ6~ߒVe mu %sLi<1*z\p{[~ "He_5@: -z; :`!vt1Sm\mƇ?}yg~~Z; GKDI8ʌJD" H웕 U˙rffJݛǶ`]3]v#pľr Qt#'/F/7?qhQMa$FDt[&grXM_ Bo"NW?֊t\Ļu(g Q߹D|zCHv[G',P8~da@[l uxxȡqeWIJ3+ET6'JV+'BjHeMI™%W.y^fv.5& )Y+EzKX^'U>|bSoD }bDDnp\m ,Ң5!R5bAT;Ɇ8V}RU4OQ5*DDDDDD>1""8Ћ*ĈJQqt"QE`˚a(#1"""M *FbDtir"*Juwc$Vft׵lC|sh멪= ӿ_pJ#WuN-6߻k3;mrǔckv;1gu/_4}+AXVW sf~ѥ7pw!_H]qَ~5:AW>vu$;:O1ں{CKQHD/ Kݩ.~_i[DOR;62'nINX2'W5elUat9|ܽ@#KW]!r`j G'YhzOC ?E]L]'}GkANcA.k|@^hWZ1/Emz9B2GĢRXяa7 2[L|&rw/V)"""*VĪP-|L\Mnq# 'X}粿UM$cP0o Vq7mİآd.~K}g45`s% c421@*z mC'Y|;ECox2+-Ϗ9`g-Z0P%Keĸ<ó ®@5Vw81e7$w}bCnd)B$"""jC_Ɏ8<~n .1Ruֳ>_JUCjqbOeQ7Tu.79e/A-+NPpt"qݿ/62kW>]ZSt7pECFDG_qTQEa$F窾i9ujLi -JMD)GY&OخW{ssRۧ">77dleVUረĈ&b'0[dFD;.s֧)DRՠTMQ۠YCcA߭ReH>8xawe>5x8x=-T&4ܜ Ϥ5x QD"""Ecư! dTy_(0:1RhDZmE72bQ]3R^`/1?3k"hN}bDTFyU;jDg<#i7$Ĭ F''˘q8Hͩ2eщDDTqBbH+wCDa^50jO.B%ZchH<ȉDU uiK'#A-y Bb$FDDDDT4{  8x=k) l Ša^(Hʤ~6ǀ)[d^Dt)h&o.XQ꿺6>i;l 77(QЊ_xX^_1KΧ1$կE`e r|@ģnMG21@*KHX(AqxxP(e$HSS'P(iO)o"?(U qN;}R/A-+NPODFC&k-hADDQ  6^ԞGY'i^ѿtj7̱eKQJleu( Z+ھL>W݉xV;:H漂l0bں{Z-#Q(n |A9DDDT6kzuI]H[ywZnLPNibN`P2i*J)S#ZRVb!I%bK)ՌRh΃UIB o!$j~ыxc>n#'.D_=s]<]pdbK }^}~z㦉IWaCs 7t1؜9нG&K+Ӭ%ܪD_]Sc%`{Jihe3aܺ[IeY->;m.;rխ W]cq&NpgtcZa(!lst"9<6< yzN$uq*cqYw ;3^?D:OƦGRi?gr;T&3pBפ4qZʚja$FDDGÎ'{ԬKQlt+,TqFѡ0:NVAi IDATũ0;6(%Tkj {&=FD&۠~5z=Mx*>uT4fWtyڹMKEە #1""|r&{9ݲK@ rfwlT^Τ :껦 3w-Gl{z0P+<P!gSiV6+Gm_{Wkq/#1zn67b}u(ܰS[zRkˈHȢڸJP(8ѿ QVTׅN<:{3gzod3 ty}u<f'FC&Kl6|qaD?gt$貆JOzlCMmD_<_ ϕPoDN3:Q!c@BVaPJ^]uN^]Fmy핺2'?vCtvΰبeuzKq]P(#"Cn&{\0.{vGAR gt.P[=1!0e#1""y'{qAh]A=ri?ਯC2AtTxMaTnݜ ;!Kmr#''E@TDDG牕О{Y]% ~[,=206jy2jTk[ǚ=\뜈b$FAh^狓ZЬ~`U}=>tftiǻGR泄]W΋C'wq෭Өε>CS3d,N]ިMn,^oqPss""C3*&hN*O/pV\O՝=ݾhkzDF[· eovHRljDwHEe @O>e3nVVh06\ ǹ9!UKK&ߞzG]'|A]y ~k;RDgЮ1 Œx߱ 뀭bOW-(+*\JOw/?I 7e>a:AMoHMܪP019ߌD*꓍aˋAZ}b-o[~fpG&|7+sD%/=Iet`;GeENDDcX:=щth9qnwDG'R^o(D"""""#QqNFDDĈJQ1#"""""*5FbDDDDDD;J; 8a$FDDDD&#1""""":*bQO0#!""TFBDDQX&QщDDDDDDH8:6#!""}bDDDDDDH ݶ( 5 -`kr'XQ7*4zbeOSNDDDDDXm'n|?k<4I^t 0rQgP`nTQoi LLDDDDt$1;HtN]>vm R(*Yiz,t-=unRJ#uE>>0".=6ŦFTXkLjZ2Gr]eSchfw`$V6AM)C`.gL: "0kR"jjTY\'Df7ADDDDDʮ1@4*$'/ۡy`.'g6jW i6'`0 (""""FP(ݒOP$r"Kl2U*x]AzJ `\tw\&GYQ%K^1JOPO숫P`>1=-j a>ٗ}btxO`Q0#"""""*5FbDDDDDDH#1"""""RSDDB(w(?AD #1"lhRVT DD s뉈-#"""""*5FbDDDDDDH8O8ۘHwS@^XVAщDDDDDDH8:Ըʡ_%}bDDDDDDH$TQLk}ܕb*6T>qP~ADD+Q5>zNÉ3֍.㋧}0wYDDD)Ĉh_[}\vAA> .&_$)jޮ6X[d00}}4DDDE`$FDDe4}F l>P:ԝ729 "C}ޅucWs%> 7Kҙ[79%)jcѻNh3ĈRÉɫZ@p]2i޾9}JyJ:O㋇/zX!o R\.""ĈhjhY%ۓ0<3꓍ {F?Uà&\"'* Jhݘ-@DDTFbDDVmE6ajWh;&|7c+;g 7%. Mi?̐=O,(5BV$\.R(xܭ lʊ*_QXֶB`Q)݀BP \DDDD#x'kʊr7 HPDADDDqQ1#"""""*5FbDDDDDDybDDٸ 5FbDDٸ)>G$Dtpt"Q1#"""""*5FbDDDDDDHў++" 8֮Ηbtu}saGC[BteӏBO'G,VyAnUZ|1t^_kV۔UڠRr<Ѯb$F{o=slF&V)+UA?m2EOG[Rܵ%V)[iU hkJbyyXd"[ʘ˿Ce">dJ3k / 4l87p<ԋ޴^?߾k$*'K~_Ёho ^q7~a~|C;sW;|}ha׏~Gfn@:Zqtt5Hmf_/>=5+eN;.ܮDZ?wߟ <7u߻4 a#m]`y4ry˃W~Am7pN~3sX}~>hc9uLNTTƿ*{[z,2|GUߜ6yMK/OkCO'1Hyſ}z>'.hQ|ՍbV;ӷ<֐s텕;{|~ޡ"ϼ޽Ͼ3ØORqWqTw^wǟ.|Azj>O/vBA: r|P>zdzn.FV k<>t3ݿ @s=~UU{8?YhTƾ./Ӷ\OCu}g^Ogt:]-9_o&չY6.q̚}9Z{_cW;Ht;0{Ӏe]DC#Td#^v055UΆ1-:&;y߶$ ڬ.&|zR࿿~{}rOcwLտOݯKg|ޠ_~\t^@_&ln,% hPgum6sZ{ ԟ:/;qBxAn_Njڠ˽msm Ů{۽]8Qq8OJA}׀G~mDŽpszrYԥiꦯ/{uǣ*?J|uDyhqn''?uJNa w0(4X 8iQ[mDZ{x?ť\ON6ߪt+(~vhroiAޫ/‰b홆D1W!KDN*n=)wV|g߿goڔΆR>>*᫭pqUjtuɡϹ򵡶*.GQJàcثbmmMP%Bڼc}s}ƔUDu矋{Dj扽<%;IEP(2"*O _""b$FDD!$"""p"""""c$FDDDDDTjĈJ5oWxV)+O7bS*jb+RLl Ivd*wV\y0QG&:5rQ7viTm|VJO0+A{>m&\R6]Edn泄]@jH>9Eە=V+vޮ4lyv !O#v奟 sdtiNj痦Mtj>2V=щDDDDp4̭ٛ tx8'5^s_wĻgnX{_R0+Lt ZRߺ_,`NfؔˆبŬJwE yy=)uZzRddL~zMI H)XoM3+EGvg%lG޺r^ډjK| utvS~/YX=;gS).9._}u&xx|xآ]@S9rf[vљpU"52!9?hxS`4F{2t3u=CZF-^FMz+GqJPbqt2N2~Jo<ѷ>e4xB׫ C o\L_K+ Mop ;֭?^;Oٗ*jH9 >sCwMopZa6+zKN6WP GWƹMDy,q-XzRkYhW( Z[r)ҌzlhxSuBEJLN(+F}c!Y矫d$6jqu/">u$IEP(;l@vQݽ@D'[qI ^=ezDDD_0#"U*Xrg%|ADxy">X[*Ǟ~qN/p"""n>1)w#Eg0/Pڶ #1"""X{UZ~҅N$,I!SoEս*|ukNOd \~o}9_+?nR IDAT}È!zAQ)RF7N"AUjxSk^nQ"M͸@'&)e1-}[[1}yjL""$94{*  =}C7p$l_qArڟ}|n|D#ڝo\a@yXg"03ybF-I<Ofs6,dlP+Vlc59<GW67%QۭK6 ӏHODбxEϧWp{zFbH>˂%'Y]C*mCh%Azˆs*)&) K SZD&w"} XWC7+豙,60""6j1+]={ce+U kI}~M]cF3_a^fZWQˆUWMu|7-/Ҝ}lvI%ߩGEF[ODG30/7ӏ!?z},4p~IHt0+Ǧ!q@zݦDx3{<h7eͤuˉk9SCt;:Nn>-=aS]kkYQQ,/7 #r}pJlukU-m O y|t .J*")f^E&Ìz#BtIuukc;y')i%>+A0+-ԃ|1Vс0XPoDsWSIS.A\yؐn}WQu%nѬMmw2(\ž<]N0\w(˧ c`N]*CM)85 '|=苍ZF.=UVD`A ھ=D.W_,.u;OVC+guR#o+VYPcр:= +\Tfm|e9MʲNJQQh,۪e'ߖ'$;wJ/>|ܝ|s: 6jy0 wf?v`J1[ iv,'W7Мh/>ZF]zM=hm'XDGp=+/L/d 7$L&4'jj{t*4rû~>Ce'a-45rS3¨ΪI=蕻N$F٤ĵz3oyklj ͸,^oPk[R7՟kÛTЪ5d355Sɖԟ?A.6ty;1EF)[p[f55r Cd۲;@%M/ zt2>L*R^eR0xv5S3~A9miAтP|VC+rba '""cXYoc'V19b6+7۸XzRk0Tk iCst:j,P @oZ_QZˮ1 Mskr f>^zfFC۠`XQaY",bxG}ß۠|"""*1ښBX[[+wK9B݊rzMN<\QTU /B% o.z;.s'UDuP]kzM=OfYn?;Bz\ҩB[(s<9?#8]'-:AzȑD z!tPj)QZqFIEPH_Ufc}})굾>(l^>Q!RyyJޠ_NngkDZKZS=Uʜ*c}bo;?9u_O~ꎠחCD`$V"Bs\Yj>*co'sxrf+:#]FSPIDON6~v(#pt"f`V f; #ҏօVaD\Lt;]KOjD>>ʦo06-ݍuL~B'VQǦ6]q;~'=pA i8y Ew0Q˃h]?hxS`4I>1#ohI tPsr; (41[Bs.O/&7I9:cgIP(xe}XKbels@=aaycܭ!""]HhSB%lC3":R 41.sOGNol>o)Zξ6˿QhX?ʔUnxy">Xz:)~|ɫǀ*}gv I5ɫǶSO~{B}h9_BDt|kWQu}_ܫ[R˥x?ꯘzDZvWpo 0:zN\Xh zlJ76<1D&lFm4 DךX*ʓ,`FĢ0bʩt91?Ťc49)WQ]Fr|\/9":9\AE%yhF ; ٹ)1L '6*#6\^#0+Y%[2nBU?lB;_X/^qDG#1"'JJw:Jl]0t;`tkXQ}14zg4m}~}ZzR=6ŦFTPkLR{بEjmnT[kU^W#ބ#yVٔ 5Kpϯj,7,c_>{Uщٕ "%Z*[ ЖChC)>^0\wn|{ O<C;UFc@%eݝPf  pͼ1Xm߀e5WlukUfyt=CZF-^FM΂+?n}DH_ns^2oe?5>zN{7ÉGٓTNo} .'/XkWVT)ܒ\}sL̕3vQᆛ+_t1$/ϩy`JO%Wn6@6ݍ^''ux;TVavDt菇_|~w qϿ/{o5{|p,Yr'x#*Z}wԹzjCeY\JÉx8f̼ISDdzSFՕGD0ްT.WYa<36Nu ۔we$:Ji,AJGu wzM=NxM߫n#!-SCSݸ#H\o4]T^r!*17ifxlD_]zSCQب^gn|,7h8|6ߜTB>1"hgӉL7;5" 2b$FS2DDeq9>|~ޡ2}u~o,]ǟ.|A1/_T~o3N Ůط{/Ӷ\OCu}gbn-DGG'D&aDLt Qzkİ0bĶN۪5yD菇_|~7y`sg}P-WQBcT- ̸9=\@i۫a$FDT4[ %_qvب3rQD}KܔX\du.gOtthylUi62~NlÅv]l2н@o1N]TAtgD_vrևIB#c]ĬX1Eg?q?ז]Fmn1`t%2jSFC"m_nղff4>iociez\&G`{.{6'W[xq*f[| u=fyљpI[$pAƙTJZ}ho_QZˆ钋z` bѺN`qg܁Ux 2jlzS8"МJ^-~@}]uuW]fkEx hLjgr53鴺!-b/ƦٗIDC:lKOr֦@sݞ2QfPBFL-c0jhNJYw0VfgMǐ-XFTƇRpjɹZާƒUT˺;=nHAfA*-TTc%ea[Oݯ.,Fb38u՚o|~s,,:=Mx*>-.|Al!2MG #^mP$E}a2|Bq"w!@+ (RxtdvH:bV Z-TH%\᱔/~\#!.s8bRmV feϓ_VuDDDT8ښBX[[+wKhXPp?LYQ%K^7ږݱԣ5-H\,ڃQTK~er>mv!9 vVm ם24s@m-{S>L""izMɱUڴg^eMlsf}uўNx3>qr[*o\&сH†6,}s ȳh mےWw홻-zhb$FL.^M [JwF2W;>a !wRnkI;[Zc3YlJ9m}^}^T%$Ģ^& tQTmBڢwl1*&]V6}mMAσl3n{1#}&'-wzMY{ 﫻{lKDDDDhig~0~:w^ǒ;ێ'vKeԦ,(Dre9.i|3ԢEl"u-ЩC*_GN]0ntYZlhNQ2/qk^5W@tV.{̨PVT D 2N{[ό}~23+$ YH3.폤.mhzڠ:׶:%n}KRed!=dCM9EĊ(d¡}w ``x<趽; [7350:k]lc/C&b݃ז];*EmyǁY2kHYmݓ>yalLa$FR=sp^ڄVJˆ)RYY p=5 ['tMt|i.5_qrNRYƦGdv8 X-r{r '"" ѱo~IKpw] <Y6K F&۠i|SgdS6y<.l87U0P+<ɜKusU?N_8X[[S(kkkn =+ X?ʔUDuo>xKF-S53V!{P QߧMqge㛓P(=~S9)pQfM+I9U-DDDG#1"Get:H}Wӕg3=":DٚsJ_zMoꉕc{]Hg~cJI璞0t=qd3#Osc."3c$ _YpHc&L cY\ӑ`C˚FΔvk&3Ui:,qvLʃ>!~piORys]:W[-=ɨ__ҽg[ `% H_[٣JhGQXrX*٣J:ND^٪JARZŚW5b%$4c9g_6W|2X37ֶߗm[ =Um{|M)rxs$W\"ZX)*=<EM2vvcB.Sˍyۍm3$ޟƼrez:o3۾$"3GH]|{r?1JV;v[iX -~dn7m7&DI/v[GΓJ']Iq/*='L `Ņ79! _/X\HotCNn{g#ԽLQľ7{2J˞ݘ?[Rvܒ),O[+A%{Tɶx!6d";G/ї<1)>TGsN=zɞZVQ%{QqϏ+RP{ 7L K[B$8"{-{nxυf9<̇Z"Ip!bwR>O˵ `~cf=zknLx{/6&6Cf3L"VܳݘK~\q7?@,db+NHυ>!yBBy>ȯNMqH EH)+^9(BQ֓PwF_|eYt\UGf,~xe*Q\ ~k-{K%To}Llofp_h¯o?cVK"d+A zTk2=T^"""PJoyz椱@wOhpChADn+ "ZqH~!bܳ}!  m7ډ(zJ7Ҷ㠂}0TvD -oh%g~QN21xS D41=>is,kU47u~cYʎFй%꿮?zB8|1 ySyySM{%|(|ɨ3Vt1grHFeQY˼hy椱V]#l%6[}V{C˞<,J);niO(1!HmLNR{΅صVܳUЌML@@CI)U$ ryu"ś,c‚?Ki7Ȭ6Ivd7JVv<2qP[+Y"J頱5=L nf8R4.&-/D8|x49x\^zxkIIjM~9eD^9쪠e$ʮ/FGl{ljW%;uJ"ŷte۷';B`^b)/3 鵝}};9KPa$tsWzӘKM)qqIX2; b ˠP(pDU~bB|ޒ=W{\??[j+Mf8؆ y{3ꄲV!9aPdbL ݐV6 [mZW LV'ɕPn+ "1:>ZInWvT88$/ԛOVZ) @&ℛh:[;SY˼_gpi9h&;*)9HsіTK2J䍘c'P" UO& )_ y1鉬KB؀$"Cyʎ[Qyz椱k;5c 7kn}\NtKۍvoe/S䰞}0St|+ygf?1ѴO>NByTA{"9CJ+Nf+@"Z<ԣMsS( ?l* x~pO_=ATvE4*=I%N\ 2tS(j\H3{u?=zk=[ث,?'Yڵ}"*n`Ie|)sShv-JƋosiܗ֣J*|F{3ʚNm!"k!i<1P4.N&Q4P(:XXXP(;zWqVهtz󝜎/J6([Oij P(p?1l-CYz|Vx^}8:`uZrXe=p|lL21tC&i"{U$Ō 0hkۅ%6cokUŚ"a{; H5dbIH*5zs-Jv :ph#^ثۏ*M@!H %rX*٣J:NҊٌ:N[[pkK-" kj\bMLat6:=X98@6 \ l)""r(Rq=v0Q൝۶Z>N 9܃Wo|3􋟘']bĂ8 n.Jkli9i\ d jb7P(ZS85׹vw)m""(՚V=7o1ev#4h/U^z⟥/_e*wQɧ[GцGsd'_4j衉(F T<]߽Bm O8|7XLg 29eOFo{Vzr@;mg{#?KO[6$]b_S5*uܹ_z$0G*Vɔ/A|:τl.ܭ;O I"CìQPa= W'+V"jXHɧ[;䄚p25}-:X]6q{\^zlaŷuH  YCW r5.Lnv9s =p;H_&h\B=&_VhwS$M;. StMtNm40Y3DwZՇXvQ?soVmbUpj{8sY!WY"5{NN% _Aa#S(A\R<͟C̑/N(w. ~>F]({NRp%)3DDTzltC_6ͣwOpo3uSϊu'6?z96{5-!"W6l:8I~+`Wk;wjMÈh-CYz|VtO ĥ-9P6z2 nJiuìɽ}`2zLlY7{ŧpI|>SvSTwgO#_6}cuN6qV,E2\"lږWL8C,xx+щy۹Ƶݲ!`m; >ȽTSÿKʬ .U1_791JDD& I[?\S&"рD ݝb\ąKO\qϷɌRR^_z?띧7Rj:ak=ƛ!Wn)UwSiq<'nk<5%VdNXN+(ld 51X?}5Ʊ2ÒL 1'뇶>W,jX^{m_&=pq1T-Jv :ph#^ `I0""W5۽{.G3*PƏ =ím/!"ڲz,bMLat67j>.8O l)""r(Rqˢח/3X}3j^o|} %쉼_3yqJ7w[;3KoݭqU v-h(U[gN)L -{n%z| {|}94tQEsVZ(J®-ʫeg?]QqKqd/>c%PeL `<>xJOh'6y&vzKZOOiSvddWqVA3*Gvm!"dm K + X(՚LOhv-vU-c\9eDP8!je%*i.#"Ҳ羴U7*GK D[_Hom9Q?+Uŷ4 ni,n{"Vtz󝜎/J6 [62Bk'![>o;dz6l8: ?op DsBB)GˆS6 dbkKH7&db2pe6H)\; ݐ21tC&6ثأJ=Ze]VVc6۽OQu|YC'a={}F5f7dhi{r ` [ֻuߘݘY>Nd9G7im_n|r|(nO/J ;7 [{'O~i7wE*PƗ_:F  vwX3*z3_oexkk;[|V^sJ>0ím/jxmu\Qث 5C'd u-{g<\>üWáJe-?2>Ȏi3cZmDכ/_)qsWo|3^˼m ?bP嵝T){1Ԭ۽?}qU}@n/sc*=N /zR|@Z0[>sq6|Gvb|WӡO~!9$[gN 6w$ /vNKכ/?->&}JDݭqڕ1 [ojL,ôy*dr0"f3OKl<3]Y%k!"+D%꿮?zKnUGY3M풎w(N><4}A4tw'2t[qq>}5໔KQ@hkŗe)"3Oc wmhK6ƤʲdV6/S7Tk2=Dpt\,\ʂf[,_?6I̱+ۉhk=ۍ?SnHSm$DO'wі;~?lv%DCӃ \] ~Vf3n I!-mcrMCBgE^cۘ!=`=s2=kV'gTצrˈ~!ߏ'"j>{dWY*:RY^Zܗ*֣c-#)w5;xϯ-V-m!-Ƣ%]_^e-gTX\FDD&8ii^|Lŋ=y_1&baaAP@Q({:*+nz󝜎/cUicNJ\\D ql)z.%;zWvR(8:VvVY>ԲRim%{ neOkQGE8f[JVjKXo:):.%;zWvBM 21tC&n ;@:'զT9` H7db4JFiRkZ]fRQ5J[|Bqݪ#dbyZO֏|l)T?n6_:\?t7xx&ҷ| ewHJ\F)qqIqF粶sf[Շ鮯)_ζ^݀ jb^¡ IDATƹڔǨ\L ָB|I, 21 Ekk8 dbTP5tmeRkwt^|c~i9b䛴.>6K&詯)Oh^).5s7_yVKOfZтj?KRV.&^Z(21Elo o>l jdz9?NS矣7[?㳚_DD{sʏ=_IFN(2xW<;5j]GYk9/毦eooL4#] o_RQ<}_Loc|8vbFp61RFsb:a…ͣ{JF~BWQvN_Ǩqo ?sry$FTNY:&RqX2db+u_]jZ[_v w =&"rX  ^ q7j㭼b!Lf2ìɽ}`".נM<\-#h9:&"h4_ O=ؿm+KDDKm֣Pk.!"Y`RqxShNFDDJqOZөnO>'p/5j;a BQk:h2po7\{d}x6;ܱ&wEr)Sscw%q8Nܯn&'q/zS921)dbKdNil}$dbD6t-BPfzBּuBs ^x=۝I@B| s8\0SXTY*VR WU}2o`5B221X]2涫&epfw*싺Z}9@z!ku%c>'$W xL56,M;u}xLjM?Q酺#b:ww}n#bG4>|QѬmz57  }?׉ݸ'l$J&S vO^LjӘ7l 84ye|*&W%D ?2o Sn^s~"}Š^vIIMm7CyA=EM:Z=[3D'p܁*2"M67.̑y5DDTQCs~5%"~+~{{}漘 Wvdߞ]~{7%C<8O ֆub^ܥ)譯n iLwM& ^ $x+i,8KK ˂>L\SlM%hN#H%6翼ּ+WD'׷':oF{ V'1vdwMFφ_ Ep.Ya,4Akge)ܲӅ=؎K,ڧTk;% Z#% zS(L?Zqm>|=db$SUVe0TYQi{з;ӓ8ptC&n XZp=lə\['2+kq%O<.K\)zYk ϯe,YnmRv 7ov/)֤Yөtko W[?p}KXL3B&dIcR Ρi貨s$@ZTL!6۳ u_y*^D~YlP(X19.VY6KR%TLUI;Ϩ8D$mMr&9ϔ_mНqr,{Ue\TkI*ĆL#\KY&Sd12\tޞ+^M+ kXtFջ\m}Mg Bfhwi슌)&͇=cv8i$x뾚~CMm2T 5?2l$XqKCE ։n\088z՞\07տx 炞A|g1&5bTsa*7e-y -q]@ra o@NDD08lrE_ *|UDD#-ATy]|Y%ZiDnsĪ#F*Kra.S$‚p=Q]xd#[FH}5jMW=jMR1nM7Ï}25|,KoLw^r2'詯)Ȏ=jMgum1(D#H4=sSt5~<_z6|M+HX9#T,8rbꔟ19DD??!b&" k{W,f},2z:U>T,& S*K+3uAQ OtPr1z]dEU9 /$昭PO3\P7pjӎchAwpO ԠT_U](fV $:l4`Y u1 VBbd_ǘRe,y+|lyFt{8ȡe6ɜPhNFDDJqOZөnO>'9]Sq=pvNy#tW8zp3蘣{ '& Il[2ɃD+XXXP( :P(sLd%)1i\S\&v!n)RBR?YIjjjv"&J\\Rej?X/ «y:B҄9f5ԩDD:]gi$"l}X!``[ِmr$RhY?o݃ݙZ @!H7dbiT579S1:%_T=.3R:MK_L.+b)Hj=eo>+G1<∸`B&jNS>{Td,}CeQE2A,iJ_S >'{@]:k}~Foc}0&چL,\CVOF= K/A6DB`aqJuIDYV w&io2OLgx6=ؿk&u_MS6i|= gfbMIbƽ4:L,9ervF[ҪcmsAOB`p"+ ~=s\pM.zYK/y,GE t-OtMs-W.WE2g.K쬸^`'8 /-iDnm8\%E,c_*jr OL Dpo a5rݯ{:՚*cRU]l >25nVk |!p q~Gs&ΩyN@l(Wn sc6|B]>6VOæ"yOS_S?H_1xdӛBk2brvLLE `_;Mc6WyUJkY=>km/#sZM*D;PQapJ2~9h.ۗc9ӱ2u-BM#jTT)9f㫔RD$j0u2/\VMM_ևM_Mm}/p}5_:'τJ#Tk:{~+},|O;՚XpBmcBDcoo{8٩Tk:]AuXV0%)Igrim2TF y3i#y'o>P m#G.ڝҾ2љ:\089.˙!a'.Mvi\09;bdDqzx/ldXmpĝ8xLp,뾚.TJ-b>i+q>dB%Ebq/1Gj‹Q)3=uJUxjx|L"YY]Vl˲C2ѾSD^"ml},r"`!QJ%l=u/.D 4PKogT嗄8 9iAwC?1N@tTCY広G̬نgľ7l4`Y qѾ|1K5B-oCh 1įёqN!9[ 51EԸ#kzԧ ȬTQͦBe]pSڹHDoBsth l}XSHTد G]_w՚W6P&!=cȵLOДfSpҬ]:n"S?p"l0B陬 "8,64*e;9MYCo~N5d+!,UJk)/u3?YRUJ\\R:ȯɿ+fFd^ N9f5O*XUpt"?L?u+-cV%Z @!H7dbL,Ÿ6KJ. 2؞8rmz3gT*9MYWvyy\=Je<.3q_扗W˚\D4?Jʰ^7DTk;ao@Znm2^ n_Od3gXdbWzjЗx}b_;5;n'q8E]})We<;xyW*g>"?ΚG_,%sw=nﱧ8 2zb  3b]댓g/68eM*ǐ)XBцeك*t&WD䐨!&C\{eI8 $7~I*t̊9(4eLX451ecfLu6&ǠQfz.ۓxaMfxMDw^ o݃4qt=id@- 2i_f7Wkn&WQ(ӌ\m}vdL#8@_9X:a$"{wg u-O3KGE_ *|UD\3 =Ճn]J% ~T.z$%8w]\A˅#D q5""2X aTsa*7e-y@ɳD5A\H;3)LE1wkE^54"D6sb1tb"!G6rՃ$9W=()U߹( ?;#ܶ^k瞸받^;]{swfWnX:7{e|=k ܤtB*opD|Mѝ\xD#xm6,O,-O Ϻs';:k*'"}]^U7_ڙc6RNOB1q8}yQQC@i5PVL~5hhE,SGF.TV Ŝ#r +]9´(/N)"GvTCյ4F"]نcRQe%qL)njTIbaC#9A67?Idy_Rg5DD_M5}kjL$za|o{ c.MuO8$ߚr3Dny{Oh\J@q7GZ|&"鷤`MR5l8҃z;N|ed 1D\AcDsw!"I׉}-K6WG\qrF Quq#?9#&bi;oj;4HgF¢P%ϜMqTĐscNHGDEϊwΏ.MviLL\dK1r[ؑx }DN>A}:]kl""W[n*P')"-(Tn~1ӯ*$1+lmQInNT?ޏB=Mw-feK%392=X abǠa.Ն@;rǾSD^"hAw.5 $&͚NaIp?1L±21Ua>S( 2z,S 3*SK;{{—s&.ۛEuqaiZ:sE`\#r#cM/dr^'9}5( 2+Y۾sdIc^v.*:/sU++K!J]=5|M_'!@Ob#+ܤ:4eXX,Q*KR8yhNH؜CϺa8=Ȳ|=i˪"[J ;ql7e\zY 29%;kI,Q̬BYƄL#\Y1fYgcr :>=OII&I V #S4 ~%ZwwT6vpqbPQk,n"4qt8bFٻw3j 5PM7 1mvaJnaDA&̱|Kvi88 䢢Ovy*""Bc:1 ֹ`pEqTT5aw IQ16xzxdt=DD(R2+yyzɨQ{;>5 tG[!.z՞\07k!F䖈نcURTº:?T4)<UNrz^F#w2TkkT?l .G| 25|,K>Pz{[[yſNˍj&Iܶ^kӿq=jy]rs` [(sSt5)# ? ܐ`鐉G{T.ASbTTqjbJ8#T,8rb19DD|bx6$gqGeC՟sf5ϢRt bP EY|dĨk/:H<#VETToܡReGE˱Y|d0T]K|xӈm8&U9ֹ`pųCR Qt$*'‚0u2]V¦nfæ6{.=+^| m~'9DkӶb܌z$c|ة~΁H_!cpTV9O""n""~+?rH},J8@q@&.燩]<8~QODDB#8o蒿IЙ @beRed*qYod#q(<:\089.˙!a'.Mvi\L"!"*:? 4{GA]a%zV^!sM79h}۸"vTϼ%A6m{O 䭼b>Qfy$lx/_ ҧSTWBiX?ڠ;h2u>[U "1Z҄oLzPǟATE]$\|xg鬘cBF<*@sA=$ڴa_a{~@ ,*kB1bžFO#p['3Ir|1KRY|Jlmt6[Vdz>kjb+,}51 51Xjb% bjbTk2=$db[qj nRak\ >A/6+eb{wsg/Lv)q,Re)ڔ2X7X&xixn_<}B) Xvy[xrNCE ;v <]φRˏEjk0eJ/ԉwvn *fY  ‘μCâZFz؃,/wqcg\Pyheك*Bu-=bYq=fSѳ +F&&,b,)tZ"**K7XP)K2=9&1A քIX2Dn.T N'dx|=fY,mqfo2C&z щBV`_lpD\/yD|NNEP)851|dĨDqdbJDdSB 0CR4ڗc9ӱaF`!5pL*Nѝ1dO&b%E$8rT5ݭl}f/c|֩~fgFޗ=)o,` uLm_hÈ͹S5(, 2 zY#YJH)iut[,_L9e*:TB#8w0ga|MHghwJDglsDWcg|$/gz'o87AE!"fr1(\Ɩfrv.ˈ8,NH֐h궋?prmVPBr22(𐉥^щ*c>6P$1z%bՃB*!n]ѡi|!1l-uuh.8LҾv4K?1C(7W|s&.6zp['SlL塊0ǞJGce_ǘRe,yċ,N׍ZizdaM{w՚NƝPkMK?J'qtGQ&=(<" Ep.YzC4e UW.;Q]PeR[KP|?Y4?EH#Z?..)\BPfzTF"}VL@뾚#}?QFhP[az@ &ko( 21tC&nR73=ME]mWMfh2 21CZ~q;}E921y`o,ދy,v~> 5.ڤgvnƴu./f8֐"4MvvOM,A!\ȍѮAiEc9%/*rNΈA( qQ<7p2 #g^XX!`Cg=y\(uߘgOzt@'5 N!"|lK_w~KĈX4]o9Q@d3#rh}jkL CO 6#f t4*_Rח5Ѱ~܊a yyǟ<ת&kPfe ~rQ 6%'Ǧͣ ?ƙU/#Qq1$'+K–L(V]s_Ŷ=x ~:!Gb3:Ecf[e.MKGǡ'ǦMuL׍8m5]8t] >M$.c m. ׍0+$]F?"""KXZZaiiԑ%A.uDoOA ,mj?'vo'oHL~]_%551""/&r紾muĈp90[!ѦLlwDDDDDbODDDDDTlĈ6@he ~nJ\+]qeDKDDDkL0>eDgVسwl1ӻn`XUDD[hQ%km,^i TXӴJ@$4(/8$Z?Ĉ6=X2/ۉGm~a%/r߸&aqWZv4M9Ă ]8Jz?a-#cD^}EñekpI{A866n-(/jDX4]@WD|;R~=Sa8hrȕ}/b%쌆O0oeUKB@swOT&6X\/~:%z4uYh SgĉWZ[,4=09v/ap,jӅ|7'WcF&hM&XtRjN'*Ǵ|A\Exיp,:bAKs*#:[uحt\)f>{<˥V_h1EBˑ']5bt"29Y fbDDOҟ=Fʪ>|tWݾ,Elъ)UhbID%mSI&WvN$5%jԙJ{^`W/WL7 Y꒲)][LB)pG[LB3"!Lk{1bGt{:su9rOC+OoQaloLv^/3W'{OszrlԪ@̀b-ˍZ?*P[.#YTԊx,UUyR6%AhԷYsvWf3f5)7htL2 ʎb2jox[=ܸsګϴpvTdԦ 7sטRCs Z˱h}vQX^G2t>dƟ1#"JL-? MrldTq[Ad-4UO58u6?fbDDDDDCꊵ:lhcTcQ1#"""""*6fbDDа+~syX5Z>a4hvAMf*,uPy7""7L0o܈MOڹ9'vK<裶}gOoeLh]FTv)UVj֜{:$$yQYŃ["[49q޷x4yO#98zdjCXϴ f c]BDDT$w"QS>G;ʝӅUiF]e7ZkW?< bkL 1O^?Dz `Sz|a:3fcQx;]eAwCut2*M㸸 n:5F?ɱt0Bîu\Pq#@RCΊV \V>&#+KQAQ2>kUۣ.Ŷ=xmVux}wCvd3*;OsddbNmT UwS|$>X\|c_ŧis+ݟڐ6VS[Cլ97ZBJB΍ٳeial\h(=~׆aPRCMF[N˧ݾUηh_͉(W=Oڕ;lҢ(XV_<ೄU/Ĉ Sg3ս媺]8t] ><'\eZ]!^=sOsZwJx&romq?ms;6=f.O\7hVg3܍.s\~1xp,ㅲVA ~yץS\DXZZaiiԑm l-qtZ_۹oBE&WzZP" jb(wNK PDDD눙[IQ;^ Ka JDDnx"""""bc&FDDDDDTlĈ["08r% VL0>k0R Vv+F;mVĈ6@he4J\0/gl~ŀt?$v!Wz|Ƥ>C:1⒚l'Mv^M.!5`NnQq1#"cq+G^rȕWƚF'{#y|g4l߆Ѱaw l#F?\fO5^ڜ^ K fqش96Gjւ 31"]nk9 qћb&FD|vGtȕe49@vM.qxNhsY-]@'*VQ2Gr96* Tj.Fh W5!W:4CSb+OTizW+ǽ+EY8_?^%.f繕 ""\m|ݾxRA8X}ç.hQ2*j6E!eVgmu6S*y>.WʝӦ:,vdu#N~ۄA(C~΍")kuilJ\vxx]t\œѰy?6WK7?3'""" Lha\+6?]аhrmR8hr$Ψ?(OtG4/x!+`;h=i.v-_4&HIJosv-^#""7L();:C,2h pժh4lN! 4<~d4lO֙ϯ˕'횕쮿xҮ4l>A TG垯հOMas0.2{"""ʃQe.s4lo+wNaSʝ_Mmr$oRKm q96' 63MO*r75ʁ~:JfUIDDD1#"/o-}R0gJ >))GR'}*m \pfS4l~pqylƳjJQg3խyrK9mP ;ݹJL6CtvRXpnĜdu#N+`3!W__Sh`&FDT51n64<~d4ltYf=o:ODD0#"FCt%а_K6l'Mv^S^Jubɱ!HQ;U-8hrM=]FK.uܧB{rDDDxD"<MŇ9QAcQBîu&[#ݍsT `Sz|a}dAfq䯙6G\FfST+boFvMu ~rQ ߯x/IYejUl;; {X{DDDTܝHDT:жe.Mh-Tup躼sLpWl1Ov^7hr=ַ iNΙ;6iSRcٽxў'chsY%""5AXZZ*u$DD hxz Lϸj3 iݦVsbvvɕV-i,DDA`MTCsZ_x)[ߚkbD ;v31"""""bc&FDDDDDTlĈJ)0x&XQ)>! lJt7J}z$5#""Qa|v`d;?%xYzyn)?fjՙj<іLh-\FX .|v[ۉGm~rNOt>F^B.% 'FDDDL(ACt{~!WX{ksԶm䯙+]'kas4|P쮿xҮY{J|yYՇ#f_j: ӟ`yhsLDGY 쮹/LkT^?zyIzz2rgDɿW'9mjQ᫹;_{@m^g4g" :#KV-wvoͦh3Bî[;!OUXڠ_oUu-D&W:w31"Lu[)kuilJ\vxx]t\?&;qrYoT: H.ύT_ALyN[HMҒ ,M%&dr{x\2P2Ax"""""bc&FDDDDDTlĈQ1#"""""*6fbDDcCJ,H`px1o~MQ_#"" L0>k0ޝ=A U$Bg '4<~dThbzكF3"""Ĉ6ϞT}7J%/OBovV%}W2{B._<(jlҙ `;ht׉&ǞKC+jG]M.!5аhrɥN\c_#""!;C,2as4|PY>96møU3jﳻ1" 8>Ifq䯙j5y|X[<GT5_) [/|mN5O0L\27hp40ߺj]?%+k3 ֶ>b&FDGY ʝhԪ{I'{r܋OfԞ>̻r3ݟj?mK)1Etȕۧ^EGT5kG݉aN5*٣.Ŷ=(fADFd4cduM3oG]_fo9cp3{ލ ګ% Ǣg*ׇ]Ĉ6 \-\g51~x/iA/ŤKʪ>|t7_n_rF+◩UFogw$̚` &)~K@=g|v\LVL\^{0|6eB8?8]/ھtH%hfALnj K1{ .KX%+l15 kbYj[1z0#"*LjH]Ě=W4*GGRu]輞|ÌbˍMv^7եyz(exOo㯙N5+2 ~Nh9qnAS%P6} 1߈\::[uحtw]%>)L3c}З6@{K4hU#K'w Ǣ#٠%mR@DvXը{fGhѰ>pm>.,K)1Z]ִA=4W/5Q hit>hS STOz}lc7Ub.1P5s~LD[`kݽ[S n1|PChKASuxt* ^Or[խ_[O_ *җ{7sRڎPؓu1t 9> *9Ĉ6ZR5+[o, us=jU5ڤcvJʋč|B͋Pʞd:{geݙ cۙIia戨;lA_}|_pތ!6eXzD﹑=6?%2)jD^h@ߙ&7!s)~R KKK ,--:"Bi,\+ku"_]v){5P2A;ظ;h5lhc51"""""bc&FDDDDDTlĈQ1#"""""*6;h}R@D[31",L[OWrĈSD[$M#"""""*6fbDDDDDDLؘADDD vL:{<{vFm0``px[ks8ڗ|~xX_@b:%y]_<9jj7g*ĈyսFª=VCw#4>k0R/ KDgu6s4lF4,Nkp#W:J/ ؔ3&>x,IC{|FCL}842\6ۉGs s8M= GnHZB.!۰UQɳ+ɚb\tMC̈́6Lkl)L 3H G;ʝ+ /۟ka=)=^=Lj9"!=_G5ZCAfUz|.wfH-/ȭx6?f4Vh:u!rh}j~NIY"$d4/yq/U ƥ>4;\l6KEcF31"ZcrOmjT4*;5O^^:hOtz?l_<4>PX Qb.d^5*PeL'Ǿ,ku*cխ"H^Sklͬvɕ/䁫VZdVR'f۸]s#jOM*VL(|7F`"g m-g=W{Pz;M*P /Ћ}qGF3kR SFZ$ 祐勄-bks۷SiB,Ԥ4 ao}8-wv{+RV޷ke: }avIkتN?( -[K8XPh拃뷚ҋ~0#"n===?isAwW8sW5UvY `v}*ՎgS2U sd+L$hXHh-lܶ|qXթM+FA|o)ݗ`x6C.{<;1LTҤRl&;MtA]cxmh8}"u~1x{&I!)jGõȞdVRL[ܚU􄥥%AJ f!B,~>' 4ݘ@s}OWnz/+W`J*8ߝsbɑtzzw~>_C¬59"!Bdr{xiWl>Wj2P2A%[?JHYZ- Xv-*͋ʘ ܝHD g[O5ުսS6.e$DV4Ĉҕ&FDeKĈ5Ov&"""""*6fbDDDDDDLx":"Z_ץ(?fbDD+կ~Uh:"pw"Q1#"""""*6fbDDkjG=c#"""bADfCa||yrÇUCHqG%=$!"""b&FDTGTN{O:?`_O1WcӳKw'gT_Ö?>7/n4-LOZ04T;n; \/_~}ǘto^!)Ma=NUo+n!|n8bMQ^Ds4)7ijn{ҹ:m9Hoқ]Wڔ.L۵ wx݉uaKG ~[yTriIo/2_zܝHDDVAXZZ*u$DD h_W?~ÿemh @&Wz':mN 3BA]쉈V}z?;֩+"""z+0#"IDDDD;ؘ31"qv ǿ4o8^"K|YGR`)Z3fov76f""`&FDT)?{gjuxƾ\x8z"G {(ZW5nck5{\k@]gJDD.DDy c`1t[ܶh˯bNYٮT@Ŏ*$U0z11!&}pza.b*4_k/z+69{@!VI+.*ʏύy;TGC9<ЫW'Gyygg m-g=dIns 4nҡ IDATIjWkHDD0#"+Lh>ݧ9sAWcv}RgU &'A^az:bRu\џ* gc `arm?nPY g*z{{~63K}Ƚ0K*WlADDT<Ĉ s-Q6&Cp GG4ٍj I\X '3 ]8NsDޟV6 TBm00zW =˼p%~B Ow@ԀSrg7+ {n[ 3ͽ6Yg4JkG$dќւhR@D[$R#!",AEå=="\=+qLm$+{c.%6̔w<%3B"Ax"wZ%kH|pŝ[3c7ϛm{jbDo#Ĉ ǚX ωEKDD"""""bc&FDDDDDTlĈ659WVC7`mnOA=Zscu/`hh%;Yn -֙!B*[7 iq-<)ɠDDT2Ĉ v罻z7@ֱ}. DJy=sC{R1Pwh[*Y!&sԘQQᘉmTMz?ukAbLcE=x=nT;gue c%R}xc]Ytw5Zd~oRo+5˷j3ZiA2{-]IEJmIqW)E6[sV;hM}3=8K`;36 fbDDy]2CwZRHe,|Ss:psB䂪G*1F9b9;p2:b*?ugv9 վ{ >snTVOi*0﹀{(:7*&!UƘz:S.۴,9$zjo~y ~rR\^dȽ&cf륥}fuȶiPj~gK;hS]쉈P Lc鶸s/Ћ} ̅^LLtȮI N/ Ƽ3DZ@B[tmt2 S'@oqz;K̙ƛe6ȹ YTUbG08R\^d?0kD:Bd!Es +I?,+_dhsb&FDT;zw&3Tv4>CutJmƞ)Q+T?Ep {tw}1w0`7h3[㌐{]97 fm_y" PӜRCkrIͽ~L`s!"b&FDTn|{ Ef4Hg nVFތ3nH vl.TcVCBdTmbf7=R;|"ԒT%ʽYV-gjqY?YxՆ-"$y֚9Q;Ԥ?m36`dFDD$R#!",AEå$,c;zm˒,XmfO֯7wk'+{c<1c&FDĀyG݅}0`8 zfV9w31"̘eNgbDo fbD 31"""""bc&FDDDDDTlĈ650`jfmÅK ~-7:[dy`cu/`ѽgyO!ѕ@1Q10#"*L!Jwa|Δt`5t<{(u^ʚfL&翬\1T@1o:47Į@DDDELh#ī[ r=*Uπٍj,f~t ]p/x=?ެX;3Z-ZoB/Rrc ""ba&FDN\Z ݗoj{bXnN6jJpCs>Eà ]{I)ޓ^ONwd*?"""L(|=5 yx\腔VUiH}=6TJ(T?ERr`$mZVv?"""*fbDDJWYIԏN™~]&W_S}j?Gz]ɼœpr+"""*Y ""} +p~"3Yjb+ڮj nCO^}g";Kwx_/@`$dќJzmj?AqG&k;Oy)w +lq$""u$,-- TH6 Abpȴ0`{J|@D9J^XӖ4"t pw"VQe{3c7MRGCDDDo51"t&FDmf31"""""bc&FDDDDDTlĈJlY~XyOs6LВe=Fwgey`h{םJf~""""dHb t{[|Nݾ1ojعVga'rPMǓa ""z;1#"3nU5- XZdY*u+QIŮKlՂ)hCwּx|gouv /Ӭ37>@ĸYkj}v9\L,WlA6)fbDDy]2CwZ,m_n"GC1w_FP=4Y7{.#{΍"BX {( F==yƭUꦚ[}VcL7s}?GPǍݫW'}k<оDO>`!""dhS Lc鶡NSs2JUq{:̅^LLtȮ%:Y@CG,x-wVsc^"8l\>8GF_4Z { OQ肬,\:BdYHDDTZĈ* gc `arY*z{{~Ŀ?G&Pg }S? z5{iN 2݉DD9pj]u:d*QmԆǧ3?H|jƾӫW $LHȢIy91)'XqH}h|ehZ.z^!""ڄ%AJ f!B,.uX%mfOR^_=[>XU$*L~:mIc!"J'w'QNjcZ {_Cau/c7MіŚQ:Ĉf&?'FDDDDDTlĈQ1#"*1s]{-{ -v32C<0iL}L.ot/yսqs3naӬ]SDDDD[31";|@JzGNݾ1ojؙbݤ{(J~`Wz"G 8ta9Q|Um8MqCG;buksGe<3i:旋i`ǛUpb\ICΞg74gXLg]""31"<.Ev;qC'0k#/c(ߛ=s=WFW!cWwUO=sTm47?yZOY]nVaݗojš?x}C1s*iu|ܸݽzu)f$zIs̝';6HSRI*M:hpe +.* 4t Tֶ7nC}JGƼxEHq؀{UFs4i}>\hk94>Es_Ybet݅[%s̝ĚQQ]_T54сyTv4B1mC0`A)ww>e`am'Y[MU?Er @{(9~B92QHs>]~orvmDDDo-Ĉ s"V6Tpo-2ճ7=NM[-t,SxH3Ft˶K03/ g[3:Kx-bC=TFBͩfFޏp#'W tO is_۝EaiiIRGBDYKEUۆ `jH6HX=[>XUn$Z3\+kuڒBDNĈ514NսS6.~|DDDoĈҽ51 kbD ;v31"""""bc&FDDDDDTlĈJN~JXܼ9~"K|Y]Y߻5XgV݃ս*N5^-2;0x;S8kv~?+jBlՎz =#z̿aj߯M05仡4e""Z?mF*+,)3^p:{zݨvR'?XRFKs<`hj&i-oU3+(-2leHxc]J fr6nOv5=Ƥw!8 IYYkaU-;e""Z7Ĉ򐲣މk2CK ik#/c(ߛ=s=WFk<о󞯦4P=&pDl =1zv:!zJsP`srw]PU43> x߿ߒ'3R Cɚky}C13]$zzt'MyO10ޓ͌?cA")`^ۗNƀJһ~ZOdwf2N$"Cm83zwb&xSs2JUq5#6ޞ4R;B-}OZhP`.bbBz43 0|l9w.,SNY>\hk94]}//Jg<`$O_~-xar d.,{qYE}R N Lp6,S^{_?4fe5T J\Nt;Zv 1{g>*z{{~ fpaKssW&>#YIJ  ӻ*tYrn$K{92[dLDD넙Qa}`Qj& vXJٍj +ڮj q{hU""M(ɽ>> ZiB6BcȡF4 #ܕfD0 7¥7J&:9:~RmVVdQBw1#Y-)%~BGC~fčZ,Mߙ U'ȃ*9+sNWFQ65r!1G64=2vǑ|QDPˊ v%V} Js^n4JezZadci r2vB^tlt#Sv# |ә Y6]]WC1x}?~n\* ;vq3[כi_]q~|EDD"Ĉ*'Ft'FD'{bDDDDDDJX+1"HLdh.Q3ȵf&/\ T$ wZa%_ ?&_jx3e""j'FDԜ뛘g:%zfԾIP$_CvIIȼ+ { nU,mZĞ1/ё.eMmЯKr\@R wH5LjpHEFR@U*Y3fK:*ՌPW<$g+b\eb|qDPTrwj^vDDĈH]fZg\iq]HQ3Hy<,?f7?%y~)ws/e&Llvi!( KM=Ҳѝ*/r)9լ͸l~HܜK>~9mGkF|xx2-z |ӂd氫BI58[$Đ UlRzkʳ(!Kϖs <u_W ][?$,6!fBU ɳe""j +1"tNjDxᙿ],IRK]D`³$]ڍFbYHWljɔtJvE8΢foO9špsPb}Rq쒒 y%7 !x $zhw:V :G[$ӟ +1"c )1lFqoy_4Mk`x0*!$.>t]P]ߘt(m]X$&۶5f;0tPk쥐DٓMKUBC(9-q֖̌#X!w:"Bܟu:wsص%y;7ӛ3kHo4W,u.VbDt#",TbD=VbDt +1"""""vc%FDDDDDnĈN3IE63I lM$HJ6_ X)|eF>TS2[جA#BĈLΩ\׌$7雖쒒]b}"NߌÝ#ZaޒaZ,XwUUkQD&"":X mAȐ4Z@ة5OͪYmN A&-jg+"$qhsJh{g.TCr$-jRE=2Sd,Dm_i1I5h*[iN "":aX5`ZtoH5ݞ (qW9Uy؏$MHSֲ~j Ne꘸-z SÓ]Yq/_ݙu|)U,:ha~V雩aGaXI ƻȬS D&6];ݱ҈b$*՗bNN;S ":tNjtJvE8΢ pX`v`KF~ӂ13[m[,8aRMx*T- z6{˕U vS ?ozۂ&It?,{XZ&2X x:z;%"":#":zv-T2i1ӥsغ=JٯW{⅂Ş۝(Xkj8`ZmD@b~:ZwF);>v1K L=_uYҋ/X+NN8Ĉ[s6UǟsUKw c9qͨʒ3MvY{9ߵ1ˎ{dle&Gd' 3.PnFxlv`@g'H^fha;ݩ"yA|3!":)A[)$v/b&D@z:d2}vM "6W'"~;L.MlM$)["{X<9U:=1"j{bDt'FDDDDDĈڍQ#":45ZȐ3ȍƷ\pFo/ J" $Ңv$j^ݘ_z)J9rb}QGw q&NKJzPb1%\6ghQP\Վ:-"":dg"cQ|$1tW&2İ-7 y⸺l!k`VjwƖ4^WS⋦cܩ8da%FDA]ʹϸs_N5ʭ@<<DwLtp֦TD 7 D_B}D%y~)ws/e&#Κ^.POjp|ĦkG6j'i3^Oz~ŭBfd"C0rI2.%ynj&A+F g"{(lP >|iA2M^9@(GWHxYx4W-*n^2!gSAl`%FDԀ]I@|q(=ܸ$)5]l: +<wRѨߴ`Lgxlo $Y8/|Zk47Rk eR.Olf.aہ] &*{׷ ^w}xƕ;^Ͱ5Pkrt kRla%FDtV[(qbZk @tYR 8,-jEp9լDN7V2V|ghe/vJGAVjqV: g]SDgp=!wmIRIͷRAĈ[kg<αϤ7=<HOHq;s1 Of]beX;*1T܌{,\'naT 7wDS'HWJFajWb{(|Tɖ N/P~cyZ:Xd^\H&zQ$"A΄!oGϺ쒼i48a?~n\* Qo'om0 .PU:{bDt'FDDDDDĈڍQ#"jD@ZZI @V)M$d"C%sH# يY&9l6j쥥ciqf6~LDD5nC7Q}α:$A;'71Y|.Tf`ȋ pqtpP=K!8G[դFwLDDJX9I58mCnL%6Q>>}R2!%(^95؀FhΒJ+ko Mk0(}X6PڻwXթaoCӴ]7u5sj87 F_JzVIu~ŭpNhu}5S2Y#pRqγ6=xx88ހ[1q/_9U ;M~? cu=fDRsjx+[[ᔄ5_W{BzP T?#cS-={k+(Y֖#"j.M֮NLSkL-tXR.=ZߠnEnvXmA6J`/M _=Y8[*G7I>NZ 'P}M]$u-Wg\S[ԿTƦ|5`9tpWթ=2VbDDGnbg-ƐuopzպJ('0S@vIo,KJl$ZQ"^twHvsIZkȐ ܒj T{|x#q?5-QG#"jslxTqFg*ÉdU%f&Gd!ʞ.w`W vi\!Vʚ< Y#cJ]V^+$ $âӋ“Q{-_UjOO{bDt'FDDDDDĈڍQ.DDuNZGu:"X>t DԂ7ot:"D"""""vc%FDDDDDnĈN+N'CDDDo)3ťʍ˝ͅADV?˪)S+3yKKOTn\VWڽ4Xcآ>I OX٫ܸ\=#`m6 5Q~y䏘zDwo/Unk^n~sBv҈NVbDDx݋/^\˿E_e{~": y}F^]ϋՈk\>g\U/pe@ojo_={Y֫4>,s[9w7 c{%#"":X5H/G-___n-ç(Vs7^o~W>dxj Ԉ ?P:]Oˍ˗PHHZQ[#"j9Ǐfݽ-X^,!|2__>UWOo*/ G/t2.Gܛwa_ 31,D:\^W%Z:7/LN Ar?jzۗ5[[DAo޼裏>TItNDDTEŞxu"a޼ySJDDDt(VbDDu89^HDDDDDnĈڍiH>gQkeF͌DjD6~YCUwGDDTQsZ|[$sj8wSZ( .)Ahnߌ:&6tC7g酉Ud|wDDDXzJ+4^E.V ]}&gL`m.d"Cr$Y#ӭɛc]4@&2( R\ m/+4g+bŹ%;-t2!98$Mi1PQK0VyZ˻^ǻ;""JĈHA3MkI5:ȩc58kSq хΩ~LΩ G _>xJ eX^TEKSֲnֽau)|qtg/YV>dWi.eow*-溯s3H+n=UD9k5T/I{k+VZ̈́&&VbDD ٥EϸSk]7Yk$LIS˨7DyU>Ր_ :kD[muWEmV7xAuXk$&{oVﴌbsÈ_HoٕOoI$z+1"cu*n }-Z@xj}X3j?~ߎ@ٙ9α5g˓9I2*3.+ sN@n!6\;oF$~%7ueieO^ ;]]^fmM$farDp 93Y~}a<-fLr'E:%JV&p#""jL NgBDtRNgqrd90'0&D@z:Vbw!jNӇj?ikDUMDF^#"*JR&xreՒ]_mg\ivG)8>u;;dĈj`%Ft#LޱX+1"""""vc%FDqLm.d"CRk9, \2D&P+ m? NZzVPU; VbDDi_m}H>zl+O}3d`CC #Z +1"TCr$-j63I>3 Sr0T;r$Y5ڊ%ϒKmN m/J!lqU_KvQe"Crp4KbؠTwzynJ0SryxwGDD6X5`BZto|MvƢ/rC ڔΩ@ A5SP%D&2 N T LlvX䫌feH,>Cz=[ 8/L@z|~i.b95<ٕ-B,ۙ~I:Sh3S6,F%Y,G fʟ5Qvi:sA3p.KI,n<"@t;I$I 46<7Hşn؍Ћ_6WHSV3k$&E^a/G=MKK'J9lzѫ39-I58I'veEa0ע氥f3 *{ =ު.0[mF)h܃у`Lwר^+{QscMvJ٥;)N Ǒ|&7kSf%]0Z^:>`wzP.l8 1_r\]V^[˽_z{MmprdSO)QϴgxV$@2]7V: ! ; I!Bߎ+z|q(=E.ɫݡs[<TD$rfZMxYx-0}vBDTISs "2[jV|.M~xƕ 5uro7 ffcvGDDt4#"t=1"j Ĉ$#"""""j7VbDDDDDDJXM" -jM$d"Cs3H/yQ38fHEjV3nː=J9GPHAOo6Na׃ك'c6uKJzX\Վq""ӄё.zG+K5l9%ctÞ'5<87:9uw[/jpHE<3BKn\p)SVWj$/jrnI2%Yh10\ŒPܩcj6ĈHA3MkI5+[>R|f8/L@j8*1/_z7҉QnXt!=sjxJ+ ӓjp֦pN ~ Ƹtd"E.46Ys,9=Kq+n=UD@>dWߵu5&Ov&"j.M$ 8^k={kD҆/]+u3Pމ2w; |!ӋI^c<©]l:vQ<$RVckexuwa޷M~X^jץ<[ϸ&?/""{bDDredD:2p XpN o8盾/2*=-e^& hH3WYvm+m`x2wT4zb+Vxp(6%!""z#"jsɆٙ?)Q>N@D+1"|NZ͛N@D^HDDDDDnĈڍѻz=16_}T""":XLl=t DDDtlx"Z_io=^^z*1oͬW^itM?z“]z^+1"&1f)%IDATǕTno_v/z?WڽG/xsyvo+%Ͽ=;ūܾכBv/$m?v -o^x^~êTa%FDԌڽmsp1 \88/Ž%>p^2z߿,~_nԛo{a{DDDtdX5H/Gɓr%0_ |2ZE9JW>qWaY~9tq""":X5kG_z7~ 迩ܸro߅7\W.U: *8ՙ{ܾqgN< rW'"B>!w:"Bܟ?>NCD-xG}O[tw2'"* .DDDDDDƫ͛N@DDDg+1"kN$"""""j7VbDDDDDDJXhj$!2!g*9sQy!Daaj!5n/X52#y^Q95S;;9˽֍SLoF]R҃US$""z?DDGOSBYvl'6ݶmc]dW6%kGxj]_Êm!xX. zӰ]?b:y""3=1"tNC5t^XmAO=l/,][ Ƴ*4JU),!^w}xƕ;hZL-TecY8X59ϟ{dl]7e8i naL1^gjD3P.9hgߥ(%^.2꺤 )F9kՇ]V^fЈB>!w:"Bܟu:S$$văDgS'M݇%"j7Ax""zG~뺚E|u=,v:""S=1"JIƞQ#"""""j7VbDDDDDDJ<1"L~,c%FDTI즶DՉDDDDDDJdg"""""ⓝ:Q#"""""j7VbDDDDDDJX+1"""""vc%FDDDDDnĈڍQ#"""""j7VbDDDDDDJX+1"""""vc%FDDDDDnĈڍQ#"""""j7VbDDDDDDm;<.qjIENDB`pyparsing-2.0.3/docs/pyparsingClassDiagram.JPG0000664000175000017500000071556211170740057020355 0ustar barrybarryJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222{" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Aloou;ޱwKQ@T(T :U|-@$چ"W.' 8viaeVm|sPhM n OS[U>NBa<8Qn?Zoqvuro G"UgcAa$YSN4K}'ɎjV860WLkVw!_k=ֹ=Y8ռbz=v`y[CNXt+ =~[t^G[!}|j.ya?Ǿ,x眚Mֹ=G!_k=6)7閡ƬLHcjw@#RT>-A5?]y-] ui+ni %`z~'un?ZoW}\gXytf`2c jxv^$;I~Q6ҩ66U2 -mu@z!_k=Տ? YX ;qn-!E3<D%cc#u(t.uȎ 7;1 wn2\64rR!LFI2A Dn?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAEsQn?ZotP?n?ZoWAE|K>#N=r'ˋRwۺc9'O&%{]'w>$O[ +Jj'2lD 9#Jg?oEWA@@%{]'>6^I㢀>o+lW?WR٫((((((((((((((((((((((((KMxWW-6k@JD,+*E5CZ <kC<[TV<ӕ_?5oJ?UE9QZ <kC<[TQÕ_?5oJ?UE9QZ <kC<[TQÕ_?5oJ?UE9QZ <kC<[TQÕ_?5oJ?UE9QZ <kC{ v.)bO ΋Z\P̕!Cs@@/G4?Ty~0ևy**1|kC@%{]'>6^I㢀>o+lW?WR٫((j(ItѾ>A'woVnCŵFv*Pڮ/7=VI}oo5{UO>Ě*MiѴ,({ O5Ο0$BLC"4_$$1_ đ$a"9Ö{WD[IJ4 HiPw_9|Ҹvg8YX%HWC ׃ &l%p~pa:~QDVVv{2p=k*I $9$,@KZ^e;$'NUpڒMoIi5K$E\ i9' úcBc+Xm㶅a[rYZL'n8jSnVHa-=̖acTK둃].$߽^_f] #6ڶ>} 9QQ}Qu1H.cbR1Gl_\j$s,ڪL+XKpElQQRG Hδ4 =E) S2v9ٜOj:UΗu#ٽe*VC?'7> }N3I|J#n fwN4_^By6tmEn-+`_Roe+PVkqHPXUOc[_[/yL[ιtNݼcORѵ+Bk=Nt{FL)|08s[g8Ry&tXfbi5Lwq0A.\! uK$Ce= V.VYjKjf[‘m ?&rpH țzՄ֚UbNqj'tFǒ- e8IIqJV`uB7˭iѯ` `A^i:e<]jKyG-+"A<G>NUF$bYč*ףnS+jr8gc$l{"77a^>ةk߿F3Eq M $R(dt`UGQOm~yHv1­V.aER(((((((((OzL]owjL4G{ƨV&g#TaϮ;5Eޢ0?[ 3}u, >iQ`2JY^}d(FLw2s~- ޡ`:Zl>t;bPG0tiQ >;t sN:PI-FBgc|1r6VmÍZDӬ`w1 0|l|T)OL]owjL4G{ƩޢI-WPssuj Ρqqlb,JʻULVuGNi-DE"2:qoL4G{ƨL]owj #c-Ž!2·gYUB\ oy1֟nm2YiA{L&a 򍨋bH溏L4G{ƨL]owjX}nq_9B'n'iRXe o䳂I$ֿ|>Y]m&+4 |Ĕ36w`1laϮ;5G&g#Ts;²oQX?iQ >MoQX?iQ >zL]owjL4G{ƨV&g#TaϮ;5Eޢ0?[ 3}u, >iQ`7L4G{ƨL]owjE`aϮ;5G&g#TX J? Ewuƚ+:,çqҽ [Š( (/]]hnyol3"sl@p˝z[x@0SNh/=[-o=zZzܢ?=[-o=zZzܢ0oea9krտr͗#ߛ/G(V[6_GC~l( ?=[-o=zZzܢ0oea9krտr͗#ߛ/G(V[6_GC~l( ?=[-o=zZzܢ0oea9krտr͗#ߛ/G(_Wa4vS\FAfT!`-Gohz^X_pq&K6@%{]'>6^I㢀>o+lW?WR٫((o]ꩬs$i$M4Z%Z0 7c=9WSPj H1P}%Gե)O¢=ZoC֗G-h˾#6's""ּc{"z#?47Sϔf qѾjQ/c\EI6 #pǮiBҬE럳VOAWBA4 zWЛ;Y3okEeq qnJːwیTsx Ih-}V*ŽOs[9]M#߉/ngDd!ыƀީNxcX-U4Mf3u\5Z1`k_ izrZsZ[3xڴN`&؝/1/G9qӣOz(FWQo|Os I,bm>)N2l [qG{h$f)q08ꆑ Iu!Z}Sb 0;f,P\7D͞>oƅ:]cuNֹ$٤M5: D|a۪sӁ]=St9#K>b #X!T`q>r(/%- ((((((((((((((Oa;B͞*<86qt&%A*N:t..GuEq_5MJ8O iFƍcɝG9qbAl-c rcRn}уckEq뷧WMAmnƙm+HPd)kzxHѦTݢs5 UwHwiQA:GsEq#?,,TwoCRb5ˌ1>ˎ4ډp&&wA8ƕ\:Z+MJPPFѤ t< J1sn_j<\Rs0HZEce A܏AMŧa)~'WEq:!85-6TvpǻRp2i%8'&g"O6Hny a#hS]էH#6Iqۼй22mCu[+[mIZpm<ϒ`>NHRuirM3VIt!a,Qۈ;1l/zV\zic=Ν V'Da; TX%5΢Ov$6\q7/C#9a&QEHŠ(((((((((CA/A]pA u(b ( i ?)l5=OaM;KauI5t*[Ky M4B.*I9'wF_ZIot-fLӼLYxFQ~lb=WβE.[{ A78sIE j b'2GbOy8"F,;xYkXs@(!u?< %,;Cd AГ8gLYn-˅d~Vg.RHJdU It=l.mG_M>}D%ꌶI`X3t'tUј&E4 "trwwR旫 aЎq"$BȊd^O?[9I6^fh0@qK_kvN6y%Xah[͑C?zEtWv[_=m-*O$~|Uc=#@wAc*$KXK{ZX"(W{,lKm.\l # >P 4[ky}"!-w32*F.J<`0[: }_AmLLo(@>^v#9:׉-4=-Nx]Ānչ89: 6^I㢏Wwx ; _[5t7@w?Կj(((]~ ,c$X#SIֵoTmٿF~mvsqҗ7:WԴ]~YL$s2szwbumKJ?&>|w3D_<a|_e%,~ȱHHC$OGS<7qM-YY AМ\kWIFYnfǧxCZinxA(Xf_0y>}M"}FS0 |KCWn;ZO=.;f/Wۻofs9Y;mR.- 'P@RHn=3 j~ptGm͌fF>.>kŕ-~cY#'!'y'+Nӵ{|ɥI"ŔEpJ'jfF%bkvj槖=:x^ &WiL"9Ä߂]3U`ڒMOe Flmǘ逤qtՙeMi-aYF#HG_j>0Ƌ^$q낳*(%<m=jg++moīkzEw*z<{췑N<ͻ)`NGo○SVNxkj"yAȶ+zfUGIEfkV1B&7&N0'j95f7rܕ)'lضi*sz6ETQEQEQEQEQEQEQEQEQEQEQEQEQEW?'%Uj+*E5iI"CI#"c֝Y֏OAC3ǃx%AFbIMskrZ+?ZQ5BYX1"9@`J1@zW3ǙBbl')O^<Zi'&W;ju}mdg’vz!k:uuuebt#s8g%C&nG~4yn-&ivX?^KgPFGJ̽4M*6sLN@,QH_JH,t%XZF<Ty=: 籣uد˩'ĩܰrw`\d^N7[($k"0d` 9.)}7M+e+FVye6M}ܚO]$dAcw=ٶbʂ$ JsEryܐI95˘t7ftMd̀==HtpyPU6+*(9zaV NTbS\λ)jt |[R:xb"vģQAڥ5)~|Nڏn#Yvg}9<> #1ىcc#$#;msJ{]G$#V ?pN? O\T^ Qw3GZM71F?-CxmOX"[n(̠)uYiKQof8Wjg<Ēy&((((((((((((x PWw\&%_"lf (( i[ t5x@0SNh>^,QZϹ-4DZ,78<꾽D$ѭ:4P2(%ƫVIO24Sza!z8)Z0."ICwK1d"E ֎mYeDhc8sۜl3$Wֲ$k#K*\FV-wLdehP~$wvqjoUn-:}Cz Mu,O,5#1ˉV.p>xɩc|Cq j3N]9Fx8.1Z2@ %`F"س3<2\ZоN6E*p1׭GiM"Pk op|>\nۙH5upq"myB3%h0Eei+g/crتέH%t|\uw'մP4B%,[z6 A˭鱩@<)`:*?35}cJ+[QKxdxc(geRRNJ[k޷qwoikm<piraF8UBHqI *C) zѳl k[A F*gҬ\Eik5Ͷ(Pd+8^83 NĎ{$ mH F-(tx\Zěuerr*&qǭv:fy +4r6V8`AU{Č-!u39tn맮oN.FII-(EPEPEPEPEPEPkG+E0\(GUI[c 1 Z`d۷~vnv܌--1BGDog'`sbT FPT#T DIx[qn pqkivB >Aq=6 bힼSEh^qYz^k$I݅Vp,e9IUW𕃇['F5Ӫqkz^Wax'Mڅ{tLv@8rrt&VԯQxcY1 I8/sE?k>05֣w7ni0KC*+}sV:Eiz,涷#2Dk45}Š(QEQEQEQEQEQEQEQEQEQEQEQEQEIu w$Ŀ M@ֵ]=yp^Lrvs\.xĊ2mG)FFȊXdW9(kb0ܫA!GԐ+-g}B,IjmzyqǠ`?O?lx&7̄I&!zkNTkbh;Bv}W?bǠ1@dU._L(V1e@##T>#P<gQ*#Xfˠ)K3Jʓ1Ce[J+[֐!E -7.䏼1io#; 'K˜ґ568дLӆZ9!ÂF8I.vXK)hh5vuےr 0y9&i$в$~[ 2b0y#H=ANz=C7m,x X%ٶBܷb~r0*_j3-Eg\Mpp~r:rZw+<1Y?q4jk%-pY͞E#Z+XbmqJ:l$*0\hڏxn//c)ǘfR yq;ӧdUk-HbH!Iyc1׍J( ];J`w]%szw kv6JB ( ( ( ( ( ( (>@%{]'>6^I㢀>o+lW?WR٫((((((((((((((((((((((((sӉ33VA.%! X#HEIN,gw$P p7mBxM.9mR93 `͜. pp;qi-Kn'UP=W<~8ﰚW}KSd 4N*2U2 lw:ZvW1Gk*$*!fEqN:0h[_;;V!wȻ"*)_sb3\hmc ~9R2ݬ@#]ֶȱ]jLcYO<*6vpp'ۥG7dYduVKeeYsk`>lO8۾H.|Is ~so4ΤlV!C E'Ԯq;${uϔS\8=JTVB4em)/&iJ`p0ݧ=Ĭx|u,pp0H>X]glbX! r9!մ 1jnyn&_1\4A$\YiniEQEQEQEQEQEQEQEQErA x PWw[ESQEW=OaM;KacC#ii1~y!YA# AV A#:cC*UrpS@>NDoo㾺짼mKmѤQβOk{<wlŦ iN6"nP7 dG{bi$0]+ŪE~,/ !T0Gq=sM uik}:0Ҵ 2rHCxbѴ !Ml'"A{wɒF;aϠZZzݽ&>UL wP|< Y.B$'ˍ/?h`s`8#`QwaԴ[ mNnFCp͸cto}z[ >V1 }v\·Gi}=M~C>F/1zsj> .O ۴"#Cm?'dݴt>(,63MAe~%t{"FyjI_ޛio;xDPc%C̀>\1.ybxZEP #ʯY7m#XwO}Ev 鏩i6h6}]78l?E-6?%eQCC#8<`z?+hn$k# ;!߸nB9@OqcURd.Z[dGonbH 6Nԥ]sMGPPJKفYnV3c'>/hsD:>j3zT}5ͥƬ#y#W*aHָ)4ˡG;p 8B~V7y<ۥm/{"?g)}}.#NMuF[++i$!A>OӢYڤ 0D@Bp)c\#>+m ;xoZ2 4`29@r1f,>Ǥ0KsnX1A(gzuߵb\[߸O\U7YDZtuHQBZ7z %Ym.g(2HVx$t&,5[i%W QYE DU @r>QOgo':MG=*sɷDˎp:[آI ,7`=wrH\N@] Jͼ"-D#:C 2Tr9tbO[Mqm|.s7D_ FHANُ҅þX&cѴ +f֎:$9KW(\)Ӏp}?>tJ;-ZAH,w6G\Rx&w7&k";',L@ `u7;*(w kv6J(?mt ( ( ( ( ( ( (>@%{]'>6^I㢀>o+lW?WR٫(((((((((((((((((((((((( >[.Q5+%[ "UT1}0kP֡C$o'n8d@%RuԂk{Vɽ#H.@ &v{'Mr$j-8XP#Oآzޝ,hCF7'ctN#G|T6!nu'K`X=G+͒8N:I<#lc/V56cr\-ē*У:Mnh$tbF,!R' ׽ Ucu$Rj(f,dfU@3+qzpiL̻A'\[>) 36dOR91Yx6ndV/݄bά@A] n? ē*>%[lO'4?K:iLZgۻhnۜkV5E∦[]+r.c+<'$ "F$FeP 2 E ((((((((ӿk_ ѷuW7@ֿan뤤HQEQEQEQEQEQEQE+]jr*T;(beB9J% -Kk0$J̞V2Pq=˷'}ѿo݆r!a#hr73{f Es*r޸e*Os?$9gJ{ҢX+lYںúĂdGÎ[AY:}w0Ikm,s6n#hՄs{M!kmhm&8gܕi㎆Rx!Ido-ȁF߻ 1S5gkuPm39N˿`Ro[_tZnjikkco"bL`v,u(o![L6&d#[ sntd{E>m܍>ǒ8Mucm鳬ڥ7,s"1WEo'vv871ʸu6Qciye@r ҕ9I=;J}鐉m"-yv:מ$ƎU+0Odd/Uy'F3pcM)p1S[h/#xgQO|}Kg4[Bc*J ( ( ( ( ( ( ( ( (9 J? Ewuh?P] #wGOUw6xs#UҤʯ0P)q"ɒ[Hn9sYTc,0JF:QEx@0SNk{Ɵšw@QE2(((((((((((( ];J`w]%szw kv6JDQ@Q@Q@Q@Q@Q@Q@ |mۿEk@O7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\xW_)OPn*Dlu ؊H]lixF żRVwmnb8hӃxSԮ-fOKh#d|-Թ }ђHp'ev$HbydpfcM.eإkor"%B3.i0~P37c5];hVKpL2H'5;X3/e%?ʿWUU* $FiC HnHݠqZ)ܓs̰$uHXk:.׷R:rʠ{?[k{]9 PHZKȮ$rO}deq嫗>c)xF6Ws,,ƈIS&7bV(5]3iepʛg#[\EspxA\r~a(_ZuMj[;GUHP=vb`uw]{6߼n{m..u{ mJ}_xT s rY|fpɥHen*63CsOG\ͭi.USex$ 4'ڴUֱ.aN,#ha"nQ\9-SmlfXd8 ^c>U;^Qnl2Cqn,G@rïR=ҳrIբ) (((((((4(  @H[Š( (((((((((((((((((((((((Wwxow:(º]s u/- ((((((((((((((((((((((((+*E5tIu4&ц #Nz RK4 'Hu}:ۢQR}Gk/l0LӪao?Sl3,4AT/̫a=E3ij[%$F#anT>sP2>b$v&rj-|7Z2qN 2K.ݧ*8ӥ/#Yf EEk hMTg'理K8ƣ^_:Mʒ Hb1+_{AmNѺl9(zM7fJqt>x; XnFqp8hZr +B%+ 6B->czds0h%9,LdVq{zE(e41!$1h3ҡݍO',rn.%XdrVڵݮlͨLkt[=أ79<'#Oʶa𱈝xȀQk{k[7t &q`C;x3}+ˉ;XF^LB'$+Ix1%jgLIx )xֽ4Y14"<(dYxz=W!a1 mh@ˆkmqŷ{}PuOާ\M(l@|ÿ~r;`s/}im{e!y)T;Pgk|2MJ-= )5Բ$X]0N P]vC F G5V  u}+kd#NZKq n!v] [ -Kf`R~cFwMy^d{ILar~\tEaʻ1-n rKLd XH9ϽIi]Os$W;sc8ErERQEQEQEQEQEQEQEh?P)WZoݧ8m ~Pӗ.sٱִF2P: Tl<7lz۝]+)X ٌA.Ӛσj6mpjDX0޻ c5CUuxl^w\!@l+H6O9s*ishĜ}tëe FӌR}HGwMI"TYuI"z`W9GZ'RG鯮Eu)YQ `=rzvlǩZWkήdC6FsB'F/;hI5:%ZW ebv3Nj̾f1沤6G$d3Z tH=LOk eRh2="3xЫE6FאOѪ7?TDڭPn￞cT!Piu)#iF䜡MGv+ǯIu /́yxn;;Dϱ&E4ɨ٤ iT*3U{]o2[N6M%IBd+еkkY`kipPz(WZ_ i_$P[Gyx+%rzdwYnһ4gE`L# 6[y~etUGÞNE[ԼyqkOG.aE"xR ĶbBʤS-?1N:Y Z/[km՟s;ʁB#r0TxAähmḗVH'ϕ#\Y0pvYxb;xF(-v )eCFGL;Olqu ̥yUpNz^WX}$3"(ʉ&ThЖ6xS*[J2yL\f<ٰ||-xMFE!oBxQ$rrjlGooppqpe?k 6%:m7VDhn0j&I${إ7A{Cꦷm<9ao{5Ɂ|ǖ{ΝM݋V0A{m!cʡvzơ}wH5[f@ElJʹk1N![x m ˜OڥAYL7L0o>ʅ$``:9qY[t{CH%L)l\de Ѿ{o6n}.? <[p ]_O@ݶp/ko&Ƅ~bs Dc^)cHC#`zGQY>#-IYHYیmGh^7%T`b;:cq,xPA6uYH'{O4ە6#zukhM8ϵE&mg_.đx|V$ZE'EZIn>o[@6ʹ>`>qVt ZCΣgk=6ƞd(Mĕlqvݪܛcqm#PıUG{8o{Tk'N0rwM;FB8=^*W6Qi32+yM)IY6"($ ϵT̈o -PJ(I`(c\ճj7Mq..@1Oz'g,-4Z'dvo/l("0}lZz]4{-Epm6oz5$Ɩ ţQ)œ<=|:'}|~_";sQim ¶KuT`3V[I"e!TL0PI۔N[uۼ>|4 ¸IF!4*t6qۏjJ[{\}kcT KƘ zQ۟OX1ʹ\I.P LpGV^yal-H5 e'1q'vZA"g`ێ6#W_ (O|ܠxo'>!彨2jx-7IK,ct=) ѨH$ -ți\¯m\U["]%V|+"8Y1ؚtxN_'%lc?Uk_ ǣr,Z#':'Ir>l:Lۢh±}e*Xc8oJߕI 34WWSħu8xgR΃n<+tv@AS ZTqEmᴎ$]M{=օV'[h,\[bC, #ݎI<8\Q7mdiH ه85)_BdwmۜvN+"zm~odi|)K( |йny{i5,v2@vKX֒̄%ߘZ%fO+l (8bOCgms) #WP1ʊH xEbpUۆ/*0Rp9ϰ8iZQ15_=@d1-E*7J4HbY)98zu^L K]de7ny{7j>*Ů`{d*7[j *'+a^ͼw0ۼӶ-lsN0:W=wg s[2G6Wo!#fNB3玁~,P,HF8?l>m}?,I%/x cWC+[WVZy ]AfwJ ޸Q bW#9}{MJAd#U,Oe9K}ȃ|c>\Q8:D>I0}c( <;`\mm0yѲȇ(pWZtTx}g>nluznZw̟ؒ_`U&gpBVp"xri+C(hD1J4w9^'@.\˹ER([VJ'i At ( ( ( ( ( ( ( ( ( (9 J? Ewuh?Pz`?O~3_XYDNEh&@V wqU}$` Haweq;ԙ"=:Nxk @?}zH*Y6%9}\N*ދ̯x gc >`09z^=tqlۖ "W$H'pc(~ߠ^:/SItIg &GUq ǜhZE8Qvs\_rZGpd`iDqzEBd uTmҏ6լ1'uۆRBpw>6\]G(HfV]%9ڣ\o[fk1E2L(=ANKy与@"J8 @+~R:rxzY-ۿwN]:'r4YI8un* QEQEQEQEQEQEQEQEQEQEh?PQHzӤ^Ěvw3 ke.Gl;Fyvɝ!e32PFۻG"I>ڳN"v0|EcAB-:ⴕٌINwL~s]K4Wx~jo(pK>].uY^Ӛى$򋎪$۰Gj ?Hlm+%ϔnǟvyc'WGmgZX'FBIl-T-#;)|;d$I95?oHLY(JB63Y/0Icv~tգӝe #Bd 8,9=sk's6ևS4I* 0O>ƒxmfjY-Vr][ZE d1,T{vo4̇E*As\$]0ۼ Ǯ6WZخgus##JH,t%XZF<Ty=: 籥}u8KG 's"g`1 9kI;!ڹ$n`d/ʅ'nzx{8$. c?W)g{a(-t2w]1ʮ>P|S~c:Olu Uκ.v[N˹*R}(,(((((((((4(  @H[Š( (((((((((((((((((((((((Wwxow:(º]s u/- ((((((((((((((((((((((((+*E5tIukh{K ,0>犹o:][d chVS&ц #NsMnPlxm^E pk&6)yqgu#4 n aAs5yg[1V$d e :?cVP#=,OcM[dm8V By_iUC/7o3f}kmm_RGfbO^ID%E;ytM"ݼvi98!9s7 rvAHdWpdJrĞ8I9'='Š8#7V$mmx/1G2O`k0ŵϙ]E,Is&"D̻r@9kƑ 59ؓjٲ*i]!ȺYP9d9p2~POC^YH⌢줒?3N2`RyW=[[uiMŢ.*ni@띹;\85 =]9'-ɏ|;W^3~leG?ߥ8 Q궊ii'?\7 n ԒpqU%m泗UtndhdD,Tdc>WlqyQOn8nEF%S!q!R"opqq;HlAw,  0pOyTs, kuGgPGLwPiVrN{ܙcL[a$7=9gWjɫ,.z|`f#kyQIF Vث5jҋo"TIEGG?ߥIdT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yPT~p~yߥrA x PWw[ESQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE+Bvl"Ύ?'N?$Q >Bvl"::+Q;\_G$ .s}GsE?'k( 3IeOН/H,Ύ?'N?$Q >Bvl"::+5KSӖV)^F`왈ݺ5eu # -Q@Q@Q@Q@s;y_]覮H~y#P#&3p0Q(ONݣ׮FBygh\L dda8W]7Yp ~[5Rpyl.Ƌ\"Asa;т`,pU[^ V.)켞b#bpqǧ\NM "6 ȃhU2pBQNG O,34xc&yYcrc)Re70,BGqyziH~+B/n$o5]OcS$#E,M6}KK 9|,fR1k[oҝiGEI7T/+=6X7m$YRI2HN#!mYnKg+%/>qR#PQIuipVTXفUV|(:)b 4I* S5X6,r$@3ŭb ˟-eQ9$GoҀ#GoҀ#GoҀ#GoҀ#GoҀ#GoҀ#GoҀ#o~/?ߥH#7@%_"4( c7QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|JnO|mۿE}?WR٫WA@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@s5ӿk բ+((OǺ4Z冗g&+p WVw <9g]ͶOv5r=Q 8nFcclrq5g`NER Q[$BI.+urO+XlD,QEdQ@Q@Q@s;y_]覮KͬWW5kxBBt* '>+kZNC /%$i?Jghc 8#!GZJG%$i?>X?tO@F]8=T)_ִ5I&m5BxrI<9nz? G?OGJCRcV_Ӈöf4q 6A!Iʞ=XJmGQ"$G3 b c;<` G?OGJM)!8Cy˹.5bv yg Fڸ``1Vl|!0kaS"FDFv}ixW z?('4I{ְ!{CPM#Fɍ 2'XIsmxgHlnIiIV[8Ab[yl t4QEQ!EPEPEPEPEP\޶%EoQ_l{eȤ$ezJuz֥RH|טC-vU Z`HWnц e-}@n( ZjІ$01'9B]^O[ޯ5+{sm}%v].|I0)(((((.+}2d(.E'#* 74i2m൫(hHv-bNs1fuz֥RH|טC-vU Z`HWnц k2x|9[[k.f+7$Jjn YY%78T /,)ee9nQ#ԼsizHKH,g杞iaPAp)W+921ƺB8v/֥_IW ɑEkG+p}9*7~,Ai8VvmK{hc8*p+;7vp,dI:L))#p%@ zY+[\;}Vm$p6nx ڟ6[ͨG2Dfhe #%)=|%[8Ăyr@E%P)IVF8a fCa3U|qUYw&_&/X^{M:8Ryg 䴃$N3ZqzTjVx̒9wƸ,#TggQ"%UURr@s׽f뛋۩n5%eL%l 9 )@BF^%΍5&[vSNT;f  9 Ty@Zʲg$`rx =XZ4 S`6#!Cݎ*+O^i3Ar_&-!(%DN34x,zޕ`A}B &Bn~KbmM6f zcg5ol2)`Ĝ9'4e%ii͍Jg<Us 4wv&W%{XGD%K;q}5>e5cdPCP@ r2zGgndI}B/#3[\:6^I㢏Wwx ; _[5t7@w?Կj(((((((((((((oH\K{4w"ȤnV_5Ep>-Uv?fɪ߻3]vp>-Uv?fɪ߻3]Y`MW񚩪YxH/u;k$V%8O\ j~!پcm#h=B/#0?d0+#M3"dgZ~jvYc5D!") ;޺ɪ߻3Ro|E5XK, #iq&EWmIYwG 5_cho 5N.ſ2j5_ck L;tnok sop96+/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \1隈It4*zbVPEPEPU:O.'gNPKN=*s;y_]覠I}oWjMtE{ƫV˜S+]'}^?5[Z(S+]'}^?5[Z(S+]'}^gu?vzܗWZ}0%1`dֺ(S+]'}^?5[Z(S+]'}^?5[Z(S+]'}^?5[Z(S+]'}^?5[Z(S+]'}^?5[Z(R;Z7K5#͜ HH%+Jak%QLG?'%Uj+/ĺlυu}.ݣYl$(gBqj%;y4GNacv@@(r(<RA\FѬt}Fh,㷍,U(' gPYEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%PAEsct?MT}M7%P'%UjԮ?Ɩ*_5HrdHQ| nHqk+2(((((((/֥_I]mr^K,#+R>6^I㢏Wwx ; _[5t7@w?Կj(((((.6]_TX{+)#Y*YdzԢ >& >& >& >& >& >& nГ<j[ /PyO vg1Oɩ)mF{QDrL۱`0TץJg;}OVmWK)̵R%vg|xWEE7pJERJak_*ׅop)*9[{ PȡԌA8IEs7O*m2[߃6q4Ygc$Ï29 m (F? dӧٟcՏ1Ѕmc0eR@`!6]i?o1|k3@,GzonS:ӓz \ʷe.m "nۺ#vSw$z._D?{{hKNsv'4Ơgdۏ9y{c-mDc8yIxO(Gvqr]ӿ\-;5ځyh vs8Eg( Bp k,/D?{{k&[^0RHl.̱^j(YdHna]q(D}w -(LŠ((( k>vg6 p Obox$1S^LdM'ӱQOi_6ğҿm'#}E.D('4IQOi_6뾢D('4IQOi_6뾢D('4IQOi_6뾢D('4IQOi_6뾢D('4IQOi_6뾢D('4IQOi_6뾢D('4IROkj^t\wE?yrC&&X5?ZEz׺z"H`VcMB8bbdxW z6\ '[H\;Hb8+xn⸷9$l]H #ԕI%l(b>@%{]'>6^I㢀>o+lW?WR٫((ֵFX4:kyoE\ $Ga?^-i(oKſ?s/"h9is :Jw$Ŀ MQixZ'eZGujzO>ۭ%mЮ}g2(AfvW7h9hoOȴs :J+oOȴixZ'eZ9Y%ixZ'eZMi n&dRH Cd,>dgWE67YcYXu1殞!IҴ"%x?<(u/ D̿J(oKſ?s/"h9is :Je ;o [ Gh9k?Y-c"wmsZVϓ2Kfvc=zQ̂(oKſ?s/"h9hAftW7h9hoOȴs :J+oOȵ'-}7\Ӭli9RSAOCN酙QEs u/-  ; _[5tQ\T:TzψH=pĐj0"'m#W;"Zwk=.iΦӿ\-;5\9Y\"Zwk=%;G:Vu5Iu%;Q"[{ I+ .#Q΃m%;G"Zwk=sgSEri?o9Y\"Zwk=%;G:Vu4WoMC\yõ6*pe7_ڴW&_)((((+*E5tIu*ַ;G!gk<㵽Es?LovCy{kz.!gk<ַ;[Qp0?[3~^ޢ~?Z/\ Cy{h?Lov`ַ;G!gk<㵽E3~^??[(?~?Z/oQE4[tv.Mܷ :p38u5%Bo5VQE1Q@Q@Q@"?ng$_ Zvr|RpX8pXo^i?'lGVlG~14̤AEG[qo,sA*H2AG9sD)[U5 whi79C ܜ,'bmW3O∵$zvrRA,,Z[y/T)cJ屹{ڛ*y<{R^>DĿG[@M5b˹4~O /섳|v=󎵛?m oѮ&c(AR @aA$j[@M5ko4OKެ gX6]_DUJJLrcKk1ʿiW|;I(@@aVh8_ _Fb"ZU5jkTGy :g:s~hcH=30Ky2ykc[ko4OK}ſ?q/#Qw{Ag:YxXsKVbAhKu'&_:u[\_Aut%s t$]PĂrz:_ko4OK}ſ?q/#Rolt7WW[&Y%e&S+)v`~EQNiumcs,G+2<<q8kW~-&'%j5.\$913b5+;KБך/,X/o/#ў7p76 |'9h8_ _FVEXAG@8Le29KzWQX?ko4OK}ſ?q/#PoWOZ_ _FsVWZO4/췏>[g;LvOLr㸥QElfQEQEQEQEQEQEQEQEQEQEQEcu<-äb {g\=W6ғI; ȯ4ii+Cg?ن `lmo/q:( (Wwxow:(º]s u/- ((/(/mlV>%E]{G`*FWxMYw5֝m=Hn!`26ȩϬAwX>֨FكAbG$c=Z\=R[HQ I `/ݸ+:Յ~׍f-\[&(< IwR¸>FZe\o?r?{-h-(WA\sa]KKf9C+Em[uHn`*FGV Ѵ{p4bH`uAԎ2>zGIhEr4H^`R+;quhMkVO6\1pϽ26I,#ԌZ-bB'Bsұu^݆aud^͑q66֑˳yji֚mPLJ.%lXMȢ}p8dcgA L H4f%A֭_j,fX (u9R>t*o%^[z+S\34̒fݛbHgh%} Z(aEP?w_)K+7OI`եI]O6"FQVHQEQEQEQEW?'%Uj+*E5jQEjQEQEQEQEQEQEQEQEqP,?uw%Bo5VQE1Q@Q@Q@Q@s'WaHںz4O‘L*;tQEbXQEQEQEQEQEQEQEWOZ쫍GZ'eT7;(3 (8χWWC\y_36H3U/O7%T~襭Ǚr?Ty~0ևy**1|kCg伎A溉JG;^B]L N<%CN?8 :' "z@`q/tOEW?_zmkNu&v$`e!I8䀹 Q;uIXIX*\4ozccV^_ڮ-8Fq DŽi?aRG%WU[Gc Ӣ/*N<%CNޢf'D_UxKUE`q/tOEQ DŽi?a[P'D_UxKUE`q/tOEW9kF-'+T3 .m'z q(D}}EVg?WR٫WA@-^'Rvse`c*ch8_ _F,k2dA+ʄ@H#_ _F~-&4aԺYA#4_ _F~-& 7x:mevU$)vϨ+7OI`եI]O6"FQVHQEQEQEQEV !ILHK3I'VǷDb`pAѯ2CMyƫGF1,NƛϿ>QȊg= Q WCϿ>G&>9yj&TȾ zd/r(fBSH 2UA"G&>>D<5_^?<5_^4hӿo39O4?MWןjO4?MWןjM;}?4hA{U5U5N}ƏM;}9s3a Miض-!-%.X"8=kz=R,H`w~5z+QE0 ( ( ( ( 4O‘th_#+jTw6袊İ(((((((79hіWOZn)lwQElfQEr襭>oMF1np = L4G{ƫM+ 3}u?0?[`7L4G{ƨL]owjE`aϮ;5G&g#TXxKQ{ç]Ѣ3*8in]?Ku5Ԯcy =´lT9߼L]owjL4G{ƪOĴMo 㿼]X\Zhy7 h.};Z+ akhV$r+LpAPXIFp_ >iQv$8'SJbt;y٦_R>nw ,o P;N9L]owjL4G{ƨm7L4G{ƨL]owj7L4G{ƨL]owjE`aϮ;5G&g#TX |Q#`kZiW9kڷE|VyV3[2[twtq+QKch(ow:(%{]'WA\sa]KKf ( (9KJ`iCjk4Frm6ono 7mw95/(/mlVRJ+ծugֶo#ӆfpKzꪅjs B=Hzd)َIdgI+xiJ,{ #ߒ.3\j%ENɎfcuA!#~b s9 ;x#n]ӍTg΁DES?s^j]oa}i$EoJHvYCG< 6I,w4ݹ*}~[:5ۢDiUV26K`׿0t Y Hڥ,G&]*K 7vzUEDT@T`T[RNחkGZ'evUG-2֜7;(39º]s u/- `[]h TQGQmRMޛ=jvSwOZ%% -Kk0$J̞V2Pq=me*Os?$9gJ{һj*y\5il$5 ij36S8O覭/ :O?'SV'u?V؉QEY!EcLng'ukM klTp@T?5oeHi\cV[6_G&C~l=bj9kտr͗#΃=bj9kտr͗#΃=bj9kտr͗#΃=bj9kտr͗#΃=bj9kտr͗#΃QixK5]V&%K|@r|?]NII&qX⾈$Q `@ؚZz~7lu3 ]~"Bg=$#hNG:jt'R-lu Fe5K,BaFC#<5uy>%$;d*cr'-dl2Wey[Iiu'R߼ vX\s9.O_[zueI4/8<:Պ[@-2-^-dgIEs^-/ D̿G2 3/ D̿G_EQ\_EKſ?s/"̂(oKſ?s/"h9hAftW7h9hoOȴs :J+oOȴixZ'eZ9Y%ixZ'eZ?[@-2-,Β[@-2-^-dgIEs^-/ D̿G2 3cD)[S[@-2-`.xVMk@["fXמnTr:¬GG'se¬GG* /Jtt{0:+Y_.U^auW'  ҿ]<7@+Ø(Og:?VxozW ه1WOZg:eIf3X[Z˰hWʚs* (9_?Rr{h a S\ *jK)^[lV֏-U1tPTr݇'*>ViL[(c9Vc72Z0C$3Ac!y<1 IE]uK{S-Q̸'q1 dMNF^OuzxHбU2 Or:#;+ cP_&?,Ds3.XFIw#u9mUyv1u=z=xPot*IflBev #|3ȌBrpKm78'͔u$-yPJK*09GQ\& WRV?,,H C$s=NΘǣtKd.5 VdA7øQ_ V^ 4ѭXDD^H\vy{+Zk"I"w kwb ;Km*mv)M7duW.o@%{]'>6^I㢀>o+lW?WR٫((oR.FVU׼9xbԴ;>S۬<=+Y_.)X(Og:?VxozW uW'  ҿ]<7@+Ø(Og:?VxozW ه1Q\* /Jtt¬GGcS7aFKOU^k_%\Yv #.FpHf'#urO*G^EQgv c8*9 ѷuXonu6tZXb dC#)lA̍Ў++ſ2jrnY}`MW?|[C&~.FCſ2j5_cha̎?|[C&~>-Uv?fFCſ2j5_cha̎>FZ|[C&~1<+{,0 BBrvsN0i(9º]s u/- m|G'UiS6w7I AAև'D_Uo__.a=#vCJFo'D_UxKUݟG#v.@38 :' "_40/F ?C(c7 Ӣ/*N<%CNVqh\nEIHdDA󟳺`[VU t2n1T )|ixYKi~۰#Nn2dҍ+[ EVӇnn|.1S_^x6VP\OiVkwf>`ɶp9%ĥ{y_j(Š(( J? Euh?Pщag.-"*nGW?`=_YH6 wLv$c^-:f]>r{}j&vUKcU#zwEYXm(b ( ( ( ( ( (9_?R`IkG5W *"FԔPEPQp.]>IEQEQEQEQEGVј]YNKIܚ((79hіWOZn)lwQElfQE|JnO|mۿE}?WR٫WA@Q@Q@Q@Q@Q@Q@WWڗKC\ 5,p%䞔ҹW-?oi򳩢oD?{{hKNsvth[-;5?ӿ\+:+KNsvD?{{hAΦӿ\-;59roD?{{hKNsvth[-;5?ӿ\+:+KNsvD?{{hAΦӿ\-;59rσsa]KKf(|[!H&bBS[PY%XOrI?ӿ\+:+KNsvD?{{hAΦӿ\-;59r o xMK"2y\\ek#GwI\MX>7L6t,,R8erd6:LHU5/;YtgQ:1Ƀ(&F2 1Y hhvY,"RUV/B;Euo4MIkj1\Tq)(p5(Q@Q@Q@Q@xW_)$ 䊵'%UjԬ\LH5?eAП/H+2H5?eAП/H( OoYEj'+zS?[_G$ ޢ0 O$Q B~" H5?eAП/H( OoYEq iH"fB>SӂG55_ eGV&GE\-=*:fԣu#bc8<?? GV3ب3 Ӣ/*N<%CNޢ,_40 Ӣ/* N<%CN?8 :' "z_40 Ӣ/* N<%CN?8 :' "z_40 Ӣ/* N<%CN?8 :' "z_40 Ӣ/* N<%CN?8 :' "z_40 Ӣ/* N<%CNMr i5h$8 »j4( pܙlwtQEj@QEQEu+;KU7=nɀoA%B_ "ºM[z-A%B? ' jψG+Ky%AVr`;Tg$`Nl^ROkqu%ūH[i"H '#@$ _A%B? ' j1=(3V8]L#Fтe%LV*,/v]n@X 5@I?V?_G [D|_MS?Wشm-<2ڬ{lqiYNW="($(ow:(%{]'WA\sa]KKf ( ( ( ( ( ( |$ K]Ur襬z( ( ( ( (0iE-hbܨW ۗ,2G'qxGA1H.3' Cb=G^mMypꭻ<`K'9\-i{k[U*=2Xc8|+oqso>E=oZG̼QNѵ=zK-O$rTH*q}+xaP$i|5C ( ( ( (8>FZ}\?r?{-k9ºo]s2t- Q@Q@Q@Q@Q@xW_)u5K.Tn"Xe!iMY𮯥۴k=񴄅 TN2} sxİ$M%jc ׵Dvլ:umndI()>I#5K\{IFKȆ?M, u+ğҿm'# G?OG}0koO\buX ;"

ki!Vuh:Vn :} 2Wty8OJWCs־02h+ưyh \K<3@U@=s[&i+mC#wxK0999Tji w-I;um Vs^0M=\̑JN\g*&OS2U&="&2IHkg9ﶵ4i){tc|Y%1xF9a' RRC/>l'{e-͐s#93Q7ilNYE9d C~az[_%mvEcI.c< 䄢RT \R-6IZ"#`? PZڥlYHIc@*zDh?PuMH# 9GW3qKZQ ]E<\m zV<[AMdoO4-6^NRr$Ũ²C"vO>1X!5N$K{/坷*!}` cw& 'h'7_I CR mɘ۔e%y; 9߆:UOơ=K<[sm *A' 7b> 'h'7_Iw ǂ']fƕ7G$B0rcjH (Gsް 'h'7_I{\%_"~ 'k‰w5ſ F7&$?pc YPR*( (uoźkC*HKWR2",Gz]'}^']Zެ25[]'}^բ8r_?Q >jG8r_?Q >jG8r_?Q >jG8r_?Q >jG8r_?Q >jG8r_?Q >jG8r_?Q >jG8r_?Q >jG8r_?V}i|CyZUXmiyv8Q]-q(D}Sl($(ow:(%{]'WA\sa]KKf ( ( ( ( ( ( ]x|-mo&*3/%EN=Mz-r襨Q'%j>h8z$o e< ̳~-&'%j7M97)'#TDĿG[@M5m3UI uKd.=0}~-&'%j2Ƴ,FD,O$ d2?1O '%j>h8zPc[@M5ko4OKն%Љʪ?0 =iDĿG[@M5oS"9Iadet9 B(~-&'%jVW#5%GDfp%N8 4DĿG[@M5nR7 d 4̱Jಡ<1b}ſ?q/#QDĿ["GN3dEt`e9z_ _F~-&[@M5ko4OKսEy6/[\i_o}߼wD뜞kGZ'ewմv3?/WMk_AT (((((/:.o-f8ĥ"V zV_E@SNkVRh^-/ D̿[TsQh9hoOȵE9Qh9hoOȵE9Qh9hoOȵE9Qh9hoOȵE9Qh9hoOȵE9Qh9k'᷈eP垹 $r$1U vu_ eGUM%chButx55ԓRF4ATCz+Р}s~lQɍU1A&4fm/ i__ ?>g>߱SȇCiVO?G&Эv~YϤQ ?9s3_ +kݧ}} bD?6mom/ iA~`H?أ39M[[?KB}g>߱G,(ACiVO?G&Эv~YϤQ ?9s3_ +kݧ}} bD?6mom/ iA~`H?أ39M[[?KB}g>߱G,(ACiVO?G&Эv~YϤQ ?9s3_o ϊ;짳[6(hG}n}} b8xFP)&MEU((% ?Y5nͽvԢy08nqI >-Uv?fpw-I}`MW?|[C&~.FCſ2j5_cha̎?|[C&~>-Uv?fFCſ2j5_cha̎ J? E>-Uv?fs×^5R\fy[yK5Q"QLM(B(WO7`_X>襭fEPEPEP ڶ;_jF)9r~߅<sFDV3_j]=ۿHmk g-&F-F}6[F"xAb2:4fcXom˛d:9>մu9ԚH ^+!YLr59##sɠi677 ukp%Hz-2R3]Ҵl-L_8rd۷vq*4;$-4m:81C'ڜZ[O#;=ގbx9FA](lx]uvw' eILǸ?/Z#Jӗl-F x'׽vi4e,;hV5-dgϵ-tQE ( ( |Q#`k]q(D}}EVaEPkG+hCw-mbH+ ~W+']Z΢.=voiqw%ԑS#j푟ZQ7mͰ8iceSq* 8c/.pDr5`9{U{}+W&MV2Ћ6!vBQqaF+"]4oϦjkkeY{$sn#o_ۆOӵ; ^H&mdC6m ~g<֊j%% -Kk0$J̞V2Pq=me*Os?$9gJ{һj)s1+m.,rvx+V"2BZk"#e N37rSH3^ Eo%c7ͻ #:`dkK-u 'Dݔ,_54S\^_%y"h9UڅcyA9}Ar #V{kin&P[Z zLc;QK|Y2i5h^eY<*d;2`tn=ao5Ri.ɯw>W*;AE/C-/4EnngiD`$`rᕋcc75mJOT\'ӳa9{s[TQ}nh^M{kgQ=̅!]T62x+[@ 4[rF4c2ĠJ֕^J);)QEq(D}>FZ}[Cc9ns2t- e ;o [ tB ( ( ( ( (9 i[ j7' qq*C ZI#TQy $w8 :' "9z_40 Ӣ/*F DŽi?aG'D_Uz_Y7fqdb)o0lEbO cO ֻKyRhe$l]HG޴2=v( l9hрM R m998?7tM+ X2ʁo`?bsGW3~^??[xM+Cq#G$E?pXqWܳm!@#5o!gk<ַ;[RCy{kմ{m'ZO٥7O1-yzxA^\o?r?{-j;(3 (>@%{]'>6^I㢀>o+lW?WR٫((((((_?RU\m/ \\D*.JFNMEr<7@+  ҿ]O+(Og:?VxozW ه1Q\* /Jtt¬GGc?U^Y_.fYEr<7@+  ҿ]9VxozW g:=se¬GG* /Jtt{0:+Y_.U^auW'  ҿ]<7@+Ø(:}IYt1u{KP   ҿ]9VxozW g:=se¬GG* /Jtt{0!GZ'ewY|=tٌV/##򮾭++_A\ma]7Ka((((({ƿšwZ_AaM;Kak,[LeDfrcu99㷭g=ZE'd٭E5+(Hc#^}S*R];]u2m720voemp:!8l  oc&42 S0>'5\OReEpJ rڇu M&&o.=$e|24HFߏ7}YЬEӠvG*904I3sa4R衵z-c66R|8F2Cuj[-߇ :+\1q4gBpO WUuiWMeq*Mn$eRHO@*;w6qkTu` (# 0OAF SZC<ddc?3vCXj<޳Gm#2nlO86oM:fvC1h#·''֚^aj_0B8\qM:[6OqYG#ha/+<5G0$qVosuVCd3[DҬr NM73wt0EIR "%UEfڊ v`S*c񞄎_AY_hQ@Q@rA x PUreEEPEP-/]WQɫv% ?Y5nsUv8'8|MM*{=@h".~*\c 7\RE,ku AJ_Uu#ibXdn_P{h[zUGg+:wxzLxr<p |==G{/ i2)f5)7y Otm{52//O޶1o Zd 1TF!;;iVϞ X$o*|ѱݖ<`}Zk="/wu!v"qXgT 1f4αugG-ԆK&@D*Luy 9!ktny%aȐȇ Kp:tZzY\o|GmX$[Z&U!I]rt5i5Xot{i P3†##N@h?P6^I㢏Wwx ; _[5t7@w?Կj(((((((ס* |$ KS)Xi\ ߃kcG'~C?UjQS 2; z a51J(ew?Q ߃kcZQ51ס*() ߃kcG'~C?UjQGS/ס*NC^Ԣh_'~C?U?0UE9LNC^?; z aR=r?0Tw?V{@8 ¶=O]':{kO-Щ[?0UE9LNC^?; z aR=r?0Tw?V{@+%u6uBJrHRN2@ϸJ/Uxkc???F fa b>ZGwgkc???F 9o'D_UxKUݟG#v.@38 :' "_40/F ?C(c7 Ӣ/*N<%CNnzO}???Ž@38 :' "⫌U<7Z.-IWeu AGz_F >:|*MOQP }=* }QT AmS=?[3~^ڹJeOx "_`9}A*{?~?Z/+뗊 PK!Fm{pWʨ3Ul V->:'B.T_j^Cr [n8Qz{fqZ?[3~^ڲ͵el.7\rF9cFr/Cy{h?LovnW62*Y??,m NѦ0gs8.tڹ J? ET7&[QZQEQEyE%Xj\U6G>$?&XNZ'7_I.+dջX7'7_I-މy&q?doO4}ſ?O/$\ xz' > 'kz.<[AMdoO5E-މy&(q\[j|BbC01G]rA nL;( (|$ K[i1,-4{;6;xmbYUTo羗y"e#7?K<GH̎Š}/Eo羗y"F(?O?$Q{'(a̎Š}/Eo羗y"F(?O?$Q{'(a̎Š}/Eo羗y"F(?O?$Q{'(a̎Š}/Eo羗y"F(?O?$Q{'(a̎¸>FZӼ}/EdN!񦘺fuZ ̶ݝ>1Ŧ&GEEPkG+Xĥ؏ 7?0G皥=.4{k H.h׵Eߛ/GN~_xlt#;ɅM[-o=ؚZzӼ̱F]c ٘*$ MBK/e2JKmP2NI(adfbj9kտr͗#՝W^TkטMgQɭC"]6@''D_UxKTF+a0GTQfm>eh̃aW-Ǔ =G݉/n<J DŽi?aG'D_U{Q>ҭ1t*@ V5qG-кIenҸ$!M*~R B*'D_UxKTF+cOLk:(H2N ,lV Ӣ/*N<%CNƬ4(  DŽi?aXԼi]]Aum&6Mѱg8aUCqKcШԀ((ʹ^NuxS?sZB/&-3<ہ{ſ2j߃sa]KKfſ2j5_ck 8Oɪ߻3Gdݏ,?|[C&~>-Uv?f( o 4`MW.ſ2jտxrKfK9qo)cF1Qһ (Š(EPEro&6U[ϧ3`RK ucMZ 䪗$ftW3Z <kC6^I㢏Wwx ; _[5t7@w?Կj(((((((:vM}DV >nqZ@c_n}IEO,YtbOZΣ*;S[6_G#zۆd9mȡdTWiaa=܈deLn dƣRS[6_G#z km6mY\<2یۜ摵k$w1bp xTѨ]8kS[6_VGFMVѼ:*8JZ@_ClqGʇއ~$ ԥC~lG?5eΗ>f\(xΠʧQ{.g@˲F jFG#z?p͗#3O o=8kz.#z?p͗#\ G?5e?ߛ/G(?8kS[6_[Qp0p͗#C~l`?ߛ/GO o=oQE[ObQߧmRB^$Ɲs=1}6>FZ}[Gc9ns2t- e ;o [ tB ( ( ( ( (9_Ÿ#zĶ9$]U*ג:zG$ {+ OoYEj'*,QoZtڿ=6ݑfi qϥr moVkveV.vRrAO< OoYEj')8hjc|d쉵m)w$ yWlpK ЗZzźAG5ݽBI/qQd@ /J O$Q B~"z_<& ]4j{ZM%/L`8##9=x}^uH")u+̰NT$ֶ O$Q B~"m[:[|bo`y2lrcL~Z'%ۀ~^Mn7EӴmc!G#rOIS?[_G$ .o:ޢ O$Q B~"7̾/ OoYEq iH"fB>SӂG5 QEh@W'i<֑vjVW?x±XnzO}???¶( F ?C+bnzO}???¶( F ?C+bnzO}???¶( F ?C+bnzO}???¶( F ?C+bnzO}???¶( F ?C+bnzO}tKkK7#EQEQEQEp^ +`.gj +R0,䞾V&C~l/]WQɫvrw4IXտr͗#ߛ/G+m2K|xOr*xJ[mbٔqyd G3,&C~lM[-o=mkBKX%S!IKc y fغ2W^Z2JnȪ21{s$ Pe%eA*sBW _3(;lzް&m.&2C*cDWo])QEQEWOZ쫍GZ'eT7;(3 (>@%{]'>6^I㢀>o+lW?WR٫(((((( Zj |=k{m%@>Rf:|$ KYبzngXgcp@='Ԭ]Y3і+ޭQPn줒VG3s?.-7ӣ%F0Fl:G<2s}b/$X.$q=/n+'ǡ˯Vd:;ɗ`$ی*c 'xn]?H%xLe] otR{ʯn.w_aw1cjצ|;6t϶s{֭"8U%_BpGM{fA0zzRʯp)QEQEQEQEQEQEq(D}>FZ}[Cc9ns2t- e ;o [ tB ( ( ( ( (9_Ÿ#z?)aW;MJ[U+5c۳z"tk)RvFW7Ap5?Q жAx(RS~r*ŷesKi_oWwi+ 瘁#")Hwuր73ɨq-##"F//9v+ivWhwWe#:n,R&_1oR =Emks$w~P]3%Gm?۰SrZUܹF~9z?E%y|Qc%_ eGUrdzQZsC乓JH$d6omfw{SwJ ' h_+h/uo.CLm!K+ʹm*F7.O! ڟ%%R㑡|ZTH# v@Olk%f7 Э/&A%B U[7SC/$c Fz՞_+h/ Э/&p0 ' h_+h/(?Km4/O\ A%Bӭ-4z=6-,V$j͹ >»j7xX뚸nL;( ((% ?Y5nb|7^F#Lx295 B~"kSEV/~nne "lA[؟8 eF@3tq B~"H5?e ͤ0DEs %0w\A;5TZè-\:B!1uPN$ ? O$S_!Y_-X?WCWS47AFXqI$Dl7llcL{ ~|S B~"H5?e~97Iߧ숻]`C?+ W$ ? O$Soq$\|T& sZ_j'+{߉\iZ{;\Ly09\xN[EVQ@-gP\Cm\.>l9hр6^I㢏Wwx ; _[5t7@w?Կj(((((((WO7`_Wi'֑aɣVUdPP g*&بQOi_6ğҿm'#r2Q\o%$i?JKcN= Q WCϿ>G&>.D>fsh~ ?h~ ?t?ؚw4biȃ'k5G'k5]&>ؚw4r g= S[2&YNT ~?M;}?4hA{U5o(Cbp+ӿoN}ƎD<5_^?<5_^4hӿo39O4?MWןj_fu ֿ{4&X2x9r8 ȯKӿo_֑isNbE5 ҚBnUEU+?? GV k/Tf[Cdyط <3بuV<[AMdoO5fOoD[3}7m3R}ſ?O/$OoDS 'h'7_I}@Oh44&,E$BEX?doO4}ſ?O/$zE`ſ?O/$OoD\ckmt8m/ < .Lg.HtwbGF0;]}{YXn¬PB}F'ooQCj A^$ux"m8M%ɋRT Ȯ+:|^Žtim v>bJgQo*L]\ ʜ | QEAQEWOZ쫍GZ'eT7;(3 (>@%{]'>6^I㢀>o+lW?WR٫_5l1C tojulnS 髖.+d2vCJ?'k(Q;\_ZTsQ >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9Q >Bvl"IeE9QOOϑoesnfZGc6y:Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k)~+Yx"KX$'{rȬW\o?r?{-im/WMk_AZQEQEQEQEQEr!a-Vay3%d In?oK@m+bw.+C -;5?ӿ\*nʲ0ӿ\-;5ݢ0ӿ\-;5ڗV5M>-.PIQ-LCjPę񎙩ئ.T4v7W,' w>REadi?oIxGu9M鰴6̊x?\U NUm71A*GT{KNsvD?{{kv.da%;G"Zwk=㵻Eada%;\nGdG+ Is,IJ/?2K*2GE\Ɖ!R?"}Ck-SQGF?14O%cKY/I|){dz\^bMH-%L, BU{S8%NˢimBm eF$3`t9c؜Qd>g/k=5XRV8Fj ~} -k, g@U8>`餍pI I^U$c Wj$M떕 @IAz2#,.in\< }-+"I s'\G_jXrOĦ ᣍ۰ Yk妇OyݛYE9[{)ڤ ( vp]<аIRIPr=~u ]Mح`hV(JŪYaԱclԚׅ5e{s,J8Q0HI! 6)K; +[ƍ#*vn#+1j-y|RcH ۃ.$e{\|彎[] 9QyF=A4nCm%7HbDe miqenv>Kݙ.~' ezH9o:*((>_*ׅ¸M^:[QZQ@Q@/ 5=E~R1ZIuV^nzO}???¨~0ևy*/O7%Q΃C(nzO}>_?5oJ?TseF ?C* h'aAU9Y{???F Z <kCFZCqKc+c0(Wwxow:(º]s u/- +.+d-/]WQɪ'Qݢ+"Š((((((/zV:՞-g孼ۅ۲3*J!wws_%G%mΡIpau$Ă~c$28b&.T {SM=-K8&8OIZavw|1D< 綷fG6wbpn~iUqs\#m4[iZ9,mD=<[z8Vr0Z={]oM{g}bl/.ɡW-XʤK848#МZ/k=Z}OHZ,UOʸry=Z[LlA&H_a/^n5"[㻞J" fzU42HQDff$31,ĒNI&(@QEQEQEQEQEG-2ֻ*|Q#`kU -ºo]s2t- (((((/(/mlW795qkks7mdh/ie9y㙾h8)\v7'%j>h8,QE`ſ?q/#QDĿEE^nik;L=MSE5Z;AK;[Y!Z7 ͷiŒ8|c+[~-&'%jiks"sisjЋ9}LŤ-h8 6z9=J4I<C"I^so]m.ms!;K!Ŵfr< t:?p{_{-bn&|dI{oRK׶W:<L`sOּ1k:mnHMo4I&d$`C K`]mK:-oM{?-f]êr0xjԮB}wR&ks玠کEM愿@z6z4\4G*lc`YN w;Tx+MYἷ侸#a+y . 8#<W%/ԿP+K_Urdw4QEj@QEu϶]iZk7ɥINb2p+/g:(g:?VxozW VxozW g:(g:?VxozW VxozW g:(g:?VxozW VxozW g:(g:?VxozW VxozW g:(g:?VxozW VxozW ^:bᴴsoj-_ɯH~J`i@Q@Q@ |mۿEk@O7@w?Կj+o+lP^ wR45]C|ؼ <? 5:[h8j"8?& ?@*'Q [D|_MKm5sE"֭xk #HzӥhK '!^+6ܨ[Km4/O"uxMٲ0Hw X=ʽsnO[H,Q"FH=iًoX?V?_G [D|_MG7"aS0NwFG9넲񕎣6Vy>H ܲ?ϵ{;/O?V?_T'-. i-ĥOp퓕&3@|_HQ{C> 2DѲxR1OYd/ [D|_MKm5NJ3\ZCi%ݴ"Ļ`M|n,hÿ ' h_+h/1dldϘF۳l,Vz7q+s uW`ij42 ' h_+h/TSHt~";d#`L&VC1CA!]y6pq\ Э/&A%B1,`/DYxTGF*K|<:Sq+~3֓WiKm4/OU2 V3C4 J$ :sgn2q'Y%ŴҮ%IU .8n22)۰sGA%B? ' j+oi7w6;B8)$NdErEm5 UC9$wߝBbĿKm4/Oֵ_w+2!*5߼*$xKR ' h_+h/O+!]ᡂH ȼy88{İyLydyQ-6'қMh.h [D|_Msh27O>noĖ3igzw0:儒<> ?\׊?r?{-iڃi{_A\ma]7Ka (((((/(/mlV>%E]jCV/ŷ{񟽜e/ }dVROp'_WVՓS]Y $ݧNYY '1jRJU2FA FYYW$ űGVamm Q9xmMB.xb].#a-Yا pWr9cd ?RԊtr2Du T9>+[ +vų#Y#/O=ǭkmْI+ұSNvQ|,v9┑+z%s>KfX^Nܤw-Ąsa:jRV] (Š(( /?2K*2=f(H =!V?"bO/@Ե:le{pm>dszcZs}GsE?'k)]s}GsE?'k( 3IeOН/H,Ύ?'N?$Q >Bvl"::+Q;\_G$ .s}GsE?'k( 3IeOН/H,Ύ?'N?$Q >Bvl"::+Q;\_G$ .s}GsE?'k( 3Ie>hJNӯ4˸#_.&ES1AEЬnQE((h5F5]C& *d9SױZiRKA_jݬc 3}u?0?[) L]owjL4G{ƫzL]owjL4G{ƫzL]owjL4G{ƫzL]owj>̷ }: %6FyV ޻ZY%idw4QEh@QEICap-Τ𳱆9r`p%cOoOȴC+Em[uLcKſ?s/"h9kbv>TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ>,liw{k$z瞘笮79hіQlM$( (>@%{]'>6^I㢀>o+lW?WR٫o "ºM]MrEu,{͸Hdh' 02NONȳ/ hj }ё- Bn?.1a$mkY)ʄb@#i[S,{cgfF$QynKe9lGJC<ۈX޸WGC|_r8  jErDZҝbUh8Aa :+a =OYGޤ,&$8\(U(Uأa 818o{4{w,$2,qƪ$ ˕*+S2-ȞY (CJtM9XQc 7ݐr (TbZ-ǘ$i?y|z1рzbvô/˟/bszU(^Qp ܬgn_ "2H| ؓEaʎs[ 쁄a;Üuѷ/5ē'3$p\h\)~Ee{2tu+3۝[-WgF14E7"/|ۏVRsw[Fh.Hscn ~Gb+jM>f2O $gVU{?gvܓyqݍwo3R47"*'Uœ kV.dӦP6OXXb͖FI8(ӅNeݿR7mݎ3}kNW*R]$k #Z7 F^{v>f$K6Rq$YS pr8 )݅gain`Y۷wj8<;#"C)Rc Iq#.;TсJբc,wNc>Vd |7]jRZh6NL+渒V-Iv$ (Uحmc~5*rwr}S>.A!w 0ql7yo JP #h')վ6|Mm|mG2j,'կJwGQ\o h6ג~ƁĬ@yizl.-n~τa4[Dsda[va̭4z%&vj6pi_*ׅ¸M^:[QZQ@Q@ua]GK&4hz֛=zIlGr/&<0>UU^7 uW'  ҿ]<7@+uW'  ҿ]<7@+Ø(Og:?VxozW ه1Q\* /Jtt¬GGcK_R¬G[-%8 0#UuUMڢ* (9C+Em[uCO}OZӬmJ7Xn6+;aϱN<%CNKSEE`q/tOEQ DŽi?aSaV'D_UxKTX + Ӣ/*N<%CN,`xk@%{]'>6^I㢀>o+lW?WR٫o "ºM]Mrx>KJa4I%$jd4o\* /Jtt¬GS:+Y_.U^auW'  ҿ]<7@+Ø(Og:?VxozW ه1Q\* /Jtt¬GGc?U^Y_.fYEr<7@+  ҿ]9VxozW g:=se¬GG* /Jtt{0:+Y_.U^auW'  ҿ]<7@+Ø(Og:?VxozW ه1Q\* /Jtt¬GGc?U^Y_.fYEr<7@+  ҿ]97,%MQN׺q[?<7@+Ø(Og:?VxozW ه1Q\* /Jtt¬GGc79hі7* /Jtuffax,5 ;ºo]s2t- B(((KMxWW-6k@JD,+*E5CZ <kC<[TV<ӕ_?5oJ?UE9QZ <kC<[TQÕ_?5oJ?UlzHՆuK!tBy7}=:Ut6FTE:haʌ/O7%QZ ՆH'V$CЊi*1|kCSaʌ_/O7%QzRU滴ֶlY܃#a[Uh?PU=sQ_.=Rk8gtǴpA'x^=zMN֊nIs\AIy/0&TA|ݺ~T׮PyL+U S<0'o8'9_>u{-]xʀi&[yf#mZ8XUtkײ_yq鱋c0I%Y)͑iYޢt=N?m1v q3 syvL(C ( |Q#`k]q(D}}EVaEPkG+˻kҶ|]0Ҵ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;TcixZ'eZ?[@-2-lQG;Ts׾%7:\$YV=M#u0O+,M=W t:'F"Jma]7Kaºo]P(((iQ`7L4G{ƨL]owjYʗÿLYCx5:?+oo#n2͊:GL3 JvH8BL]owjL4G{ƪs#I"ŇMhe-@Y<ьJ #dz%ʩu`| 68ɮ 3}u?0?[OVGyxP׷Y]Ckwcy[=6-;Ev=kђ$aT|V/&g#TaϮ;5S?+ 3}u?0?[`7L4G{ƨL]owj^eF_uiWe|I: ']D0ʰO QEh@W/0]wŬs!dǕj+?? GVبMj]GQnf .zu޵iFX*ḿ)՛JN^O=sۙz\HG*cէ: :ݗ+lD\ dIgc5tSe-ywBIq%2MW,,I"ViWo,IjwDEeE*ijcDr{yßqUm`֦czXm} zU} ķZ^*79TcV&g#TaϮ;5BZm{ޓ6I1G#j? XRZyĤ%(q#9L]owjL4G{Ʃ_o/8׈ Ɵy&{:tIg6Ҽ  r ms^"jvfV/&0Y čwc׵L]owjL4G{Ʃ;²>g5v-cy"n %$c:L]owjL4G{ƪ]݇\%_"0?[ ^EMrc}@`OpQaӸU ɖǡQEEP1Hn4O‘m2lJ KML8]rrd*FRh\lnָRaM|OJHtm>ګj#X r=~zwb+^:";{%Aj9tm.{so6g$ )S2qWh;"Tkw&d(VfK08]Et{"@fG*jѢعWbFsn3E$*HA>->V(lBv@p8VXԧ,¨Y$f`3ؓ?8 :' "_40}O{V'D_UxKU6z_40 Ӣ/*E`q/tOEQ DŽi?aEޢ8 :' "_40A,?tOЍp/Wu- ;K KP .' O»@#Zb%/WMk_AVHQEQEQEW?'%Uj+*E5jQY+6Mp*GqWvF8#H.1W=_[YCYe?1>dGq.,xF,JYvnA8?6x˥οtW'K-&KٴZq,,*ۤ%gj^"V9>y(LupNhw{Dw4W4R\ ຎ4[2pGOy$GQR))2K t8['R۝xR-\ldY 3ə^uRTt+kHl.&y`YQ:F=[~^c;MPyhu:8H4gIyCZ+׾!͸k+ChH,|4;qv }᳻mSV;|Ę;y $9ٽ59KkhԞ%.l]Bd5ݴZz- y210hgE(if_SWjW2$K$"BqЖ~A#fqUM\:| _Opc6)vd0y*"U )5hOEQC0۴@-Uv?fFCſ2j5_cha̎?|[C&~>-Uv?fFCſ2j5_cha̎?|[C&~>-Uv?fFCſ2j5_cha̎?|[C&~>-Uv?fFGZ'e?ſ2j[LNh]Imyhr: ;QEh@QE+(l/qep27eqa)+^ZD2 e`dӶ2lYyxR3OK$`(>G888n'hDPU( >T>mgwmsKɧ8R(乜@(Hnɤ Ԡc5Q+c|EO ~+jieƠ+k5P\$]a-+2 8=~;?|!cf4c>xq)E#An%nu$>Bp=9Ey*}}F p J G+ttU-^鬴[ݺy$!IF~ gn@š|-l'0Hr-ٍ9ϵ!CCЬn5wW$g*.Y ۿs!nIrOZ|ek5_]^]BxXaVK1|{ CWQFhK)+)+[M4'DVV)?wy?wyÜq.pIZur_OA]Sw]OA]Sw]>FhK)+)+[Er_OA]Sw]OA]Sw]uW%?wy?wySqwVA2E*2Qy_!] SWTUl7Q!K3<#E'dM\ca7shBx;G?R kϾ+5G&O"T\5[]'}^.CEs?Q >MtE{ƨI}oWj\&O"TkϾ+5Eh{]'}^?5[t4W= >?Qp:+I}oWjMtE{ƨ sPo_JOMtE{ƫ>Z>!e<*wڬge<];ggp;( (>@%{]'>6^I㢀>o+lW?WR٫(((((( ѷuW3=_V?6{;TQEbhTK/K#S"}6b0A =Պ( u)[]B+m6p9<4;;+kd@B1* ?JEDYCٗo!s*E42RB"_7gs\ E;*i,$K>@1T 9j$($[t7} qWpi2!mn%2"_`s]gӊȽ{[_k}#Dor%K( |kPi5f@vm% 0m='zw٠|q}*Z) iX6@ PbQ4gj7b8? 1~gSEOt.%01k1 TdV gjgC#Hv~SؒG5-\,WZUFaʈx8EDT@T`R@X((y"] x?_{ǟ+X\5-ºo]s2t- B(((|_\v] Φ7ndEÀZ6VSD?{{j\W:+KNsvD?{{is򳩢oD?{{hKNsvth[-;5?ӿ\+:+KNsvD?{{hAΦӿ\-;59roD?{{hKNsvth[-;5?ӿ\+:+KNsvD?{{hAΦºUӿ\^l Y MnAfbxbI=&thMMW]֒ɲk+2;q!\Vԣ.i%ޫwGV?u+[7\1=Io "ºMJnȨGbj9kտr͗#3*տr͗#ߛ/G(adbbj9kտr͗#s01?5oebj9kn9YؚZz?5oe>-/A򿴮Z/43 UmQ8=jնiy5Vyj9SPt`xZ|,M[-o=ؚZzׂttu 0X7nOci=+(xg@ 䃑EYbj9kտr͗#YؚZz?5oeE,OM[-o=ؚZzۢfF'&C~lM[-o=mG3 #V[6_TKQ|awjWZ-ki4OrD$PFzZ돗JajbV;( ((% ?Y5nua]GK&j ȏT_sXErsI"Nq Zy:UMNQvk[V,pdGu0W i+yv9;8'H>"OX&จ;IaMvmj h%ˉbzQ۶)xoL s+}Uݙhlf==-_Ah^8B}sV}V-w-s0#V&v]'R:0 ߻ϙ.,lghpXbߵ5[I\^Y* qbº=O5eđpX!_ rC/O_MR40B}$U>Jӭ,mGn-GAI?Y}+x PW_\%_"-(H (9C+Em[uHn`*FQEQEW u^6+5܏٢KtXwyrDˑ˴r >#Z\Csgcr{B|\AM&o_ 3Z&jo!W >Sv:6oov&Kyb&w2,(h6*IFЕ]G÷1ZQt%ʤ1qrAdAOŤMl!m\ˉǼf>0d K0S)QEQEWOZ쫍GZ'eT7;(3 (>@%{]'>6^I㢀>o+lW?WR٫((((((OUBM)t.\\ƌgPwtޠ$sRjN) Q WCϿ>G&>O"39O4?MWןjO4?MWןjM;}?4hA{U5U5N}ƏM;}9s3CMyƨCMyƫӿoN}ƎD<5_^?<5_^4hӿo39O4?MWןjO4?MWןjM;}?4hA{U5U5N}ƏM;}9s3CMyƨCMyƫӿoN}ƎD<5_^?<5_^4hӿo393BS2dE G>>0|ذ۩=obiȃ'k5G'k5]&>ؚw4r g= Q WCϿ>G&>9vcc}f>sK݉f(TOjOЍؚw5r#bvϽRVw0e ;o [ t@v)(((}z[/d i5([[kQ%7@`?`xl7E /,%L6H"'tNr^IqW$vR6'b_7&V%JovQ"y>*-CWK}m>m-!)ˈ̌r_,W$n&z$R4I,NFCЃS4TE 0)jXטQEQE%Bo5W/ G\y[c7W-/]WQɫ?}kg} >/#]WPIj&<[Ӛ8vV$ ? O$VV,ޢ O$Q B~"E`AП/H OoYEzS?[_G$ ,REORw&kY݀rl8U~$伂6(0J uX2k_ OoYEj')kjRjIc-=5.<,6ϙR29z}O—בkAE`[yYsƉRl=cZj'(S?[_M]}H{idbbVlА>Qm$ ? O$Rzޢ O$Q B~"oQX?j'(S?[_Eޢ O$Q B~"\|T& sZ_j'+{߉\iZ{;\Ly09\xW ɖǤQEEPEPGjqb#( ^Ik?ߛ/G.+dջX7S[6_G#zޢ`?ߛ/GO o=oQES[6_G#zޢC~lG?5eEO o=cR[_ky=䋨 8@"Ӏ:z]rA nL;( (4O‘m#k'Tj(F[jW돱V7PO=q??[eޢ?[3~^ڑV!gk<ַ;@V!gk<ַ;@'FΨ5Cٝ@ k11Z͹_4:]m4S?-1pIsK~?Z/ZM{9_M0ZA$ ٷzӓKӦl-^+hTe>n ?LovCy{hg@MM{[f--iH9%WROXΨ5O?6!|1oq:w!gk<ַ;@V!gk<ַ;H +3~^??[ +3~^??[ |Q#`kZ9hOK|nyW\c[t񞂪;[EVaEPkG+gI.K yYHMtE{ƫV9ÔI}oWjMtE{ƫV9ÔI}oWjMtE{ƫV9ÔxL5aoM2֟qob \?r?{-k-Yma]7Kaºo]1Q@Q@Q@; 5Or5V,?}ſ?q/#T'?*GsZ.;?ko4OK}ſ?q/#VS/giggg'Xc2FzԕDĿG[@M5n#*r7V'\68lg ch~-&'%jޢ?ko4OK}ſ?q/#VVZxPɑ€QXz~I[]BA4s/~-&'%jֻ5/49>ƒQ3^[Di ULך2h8_ _F) _ _F~-&kF0U$lG VyR "c~-&'%jޢ'%j>h8zx$G*91 08{95~$\6kkm7BN|K4hAxaQEphWL`h3>bn(^>^vRA %DN ]@FZŵ߈ń2M$͸DQ 69l oOv ]B,Jv-[&wqQ:t;+,_g\}r$ort#cS hֱE46kn|1$ cߏQ{K& +t@kQP<$T+E"IlNє"gQӧnvO477Zxby pAmC+EmZ[JѮ+9l ^V$~[}=ⳏkyf ?9H1+' ^ePʖ2#m,@)! ft{tK#tDlK8L2I<֠i13P YP mF#TgS f(m.G?xHswwYVO2fbm );GCs-?4yTK<ȆY 1S8g=1w6f JrR]u`12cMRȌA>x.Ş&Db6ɶ@R<'?/9Go_D㲳Tk fvU`ݹI\`7O]Ŭ\y,Q#ޤp@#oӬ/oe+y.ʬ$B9koq4ƯH[ٖEe>w`"oi*@O!1Ck,uO':xSr`2˸_y`;KÜU&TrM2"G8S;FB; bO0߭[A$۟12F{禄W~6.;g&I5;2,>Uh#}+T.7VeVyBcW%UN+:KiّoX2v6=1Qj>DO# ǎ)05] ru^1MԱ'$%_F!wa~RH H^)[ĚbHwȶs3ӂY@vQmK[UM?tۗU 2zlU=Sf"1a(wm 2q6ggޗq^>!EnRFB7i;y94iZj,D-^`*H' 0@#/p5$z5[v@ ҡtv!4V-hv9O֢*K |Q#`k]q(D}}EVaEPkG+FZ}[Cc9ns2t- e ;o [ tB ( ( (9_Ÿ#ԴVZ(">nK S¯w5YMٔՂ6X (㷑Z[q$BVx ܶsmiEyWyل;pPŻgrַ;Zv)c >iGOT6ED/eK|0mrka#Ldyk9LF@YHW~GI89?Yѵ,Og/LyU!F#x2=w+`G&;/xA$7D#;h rx`K3OޅɉFm;syD9h/f8f7qYBIk5巛OVo㰩5}7]Kd"Ovq$u#^4x):wCn੤sH9..u2%(>V%%VF8fsTմpe%FTQ31ffWqE\6NiL &a'Ao-٠ӄw),cnr dq!p:9ȿ[|T& s]prP,?uwv%xKA_jk~xwT{BZVk٤rI,N9'_*ׅ?VxozW 'np%ᴵ˫8X9t19\(B((((((((((cD)[Vbh_#+j۬e(Q@Q@Q@Q@Q@Q@Q@Q@q(D}ʸ>FZCqKc+c0(Wwxow:(º]s u/- ((((((+?;뙧Gu 5[Pba$GN߭zr^@h=SRgF >7$D*;?LovCy{jiݳOC:#o.Eb982= ouRU33Y+=OCy{h?Lov J3x:K y|8Y?8#M]9w+$rD$كd.HCv?LovCy{joI,[Kky8Kidi @EU%gOS6HK'vbPX?<-C=~?Z/KlKV) `i|< #6RK#.#AA+ƢCA< vsG!gk<ַ;Vlyf3˳lr[ . htr(u##"1??[3~^ޢ`ַ;G!gk<㵽E3~^??[(?~?Z/oQE?LovCy{kz.!gk<ַ;[Qp0?[3~^ޢڶmI4}51%O1o^+kGZ'ewմv3?/WMk_AT (((dԶI9v n*[Fqުyj&Uȋ,mzT4j\Sv9O4?MWןjO4?MWןjM;}?4ir!3CMyƨCMyƫӿoN}ƎD<5_^?<5_^4hӿo39O4?MWןjO4?MWןjM;}?4hA{U5U5N}ƏM;}9s3CMyƨCMyƫӿoN}ƎD<5_^?<5_^4hӿo39O4?MWןjO4?MWןjM;}?4hA{U5U5N}ƏM;}9s3a Miض-!-%.X"8=kz=R,H`w~5z+QE0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (8KL=C\ }6I&Xbe=;[O?$WyE.T;|s=y9_ (ʂ}/Eo羗y"(Avp~o羗y"7?K<]r8?7?K<GH9P]HO?$WyE.O?$Q{'+Tg{'(|s=QG* |s=y9_ (9_ <}/EwQʂ}/EUm3wͶ2X#OKHǔ=:j) ((>6^I㢏Wwx ; _[5t7@w?Կj((((((([_WS\ua]GK&Gsf xbBP-Uv?f( o 4`MW.ſ2j5_ck 8Oɪ߻3Gdݏ,?|[C&~>-Uv?f( o 4`MW.ſ2j5_ck </K;0Soiopvdy8?jo 5g%YU 8Oɪ߻3Gdݏ,?|[C&~>-Uv?f( O m}^ 2CꨮP\ݯ\}Es2t- e ;o [ tQEQEQEQEQEh_#+j۬MC+Em[u4[QR0(((((]ʶtwh6P⎶^mx ֋i\Cd+[t.D/\S.w{'.oΧ%jrlA)"@0w28 pFsM=YIA-gKziw @;ņl;2]/(M&IhX|ms(2uOMov}H`ZT6Ӄ^*G5_6]:Wm]DBA]DCZEy|z%]N\I b*az A7:nl1KBI`ʊDà?r>oVo;(aEPEPEPEPEPEP5,?tOЍs<\BJᮇD</ְ؉nhQEdQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ |mۿEk@O7@w?Կj+o+lPEPEPEPEPEPEP^_j^/ rK&hԱzWW+']Zӿ\-;5ݢ.KNsvD?{{kv.KNsvD?{{kv.KNsvD?{{kv.KNsvD?{{kv[Ŗ_o+{#f;Xad\'"Zwk=㵻Eada%;G"Zwk=㵻Eada%;G"Zwk=㵻EadqŘީ M[XuKt6Ӷ <TwV4ְtV8+ Q[$Br+l5W?/WMkQEQEQEQEQECO}OZӬmJ7Xn6+;aϱN<%CN~!R?"$ݱնCXsE DŽi?aG'D_UoTmYv38 :' "_40( DŽi?aG'D_Umy T\djJ4 LN<%CN?8 :' "niIpƥݏ@4<Wj<8u8E01?8 :' "_40}Z=܅#PHBK'4M#+ Ӣ/*N<%CNа5)8>В RHP$U${FN_40 Ӣ/*.i76hդ#f\,IOC @'*q/tOEQ DŽi?a[QN<%CN?8 :' "VP9-f,iʬM;3 Ӣ/*N<%CNޢN<%CN?8 :' "z_40 Ӣ/* N<%CN?8 :' "z_40 Ӣ/* N<%CN?8 :' "z_40 Ӣ/**GiawW2j;!7vDAWqkW t:'FKsB($((((_r^_ik7<4\X2HXNC^?; z aNC^?; z aNC^?; z aNC^?; z aNC^?; z aNC^?; z aNC^?; z aNC^?; z a|YN;;iWwRgd0^#' N'(((((((((((ow:(%{]'WA\sa]KKf ( ( ( ( ( ( |$ K]Uy׃PGi7U\܀q'eDh'%j>h8+oQX?ko4OK}ſ?q/#Q`7'%j>h8V[@M5ko4OKX .| ֯mz^Aun1(#h+9}+G~-&'%jjY|0Mlſ?q/#QDĿNZ_xDҮu;n/I\laEc9[uDĿG[@M5!V[@M5ko4OKԬDĿG[@M5z_ _F~-&E`ſ?q/#QDĿEo%uIyg%zvm{k}キ 1sqa oV؉nc@v++l5UQEQEQEQEQEr:'kĞɊb5S!9D2H;O͹saȨeơ-f1Hdf( p)prkI%ZJGx1K}N9mELm֌f=ڱFyx6omjK$ c2!;g#Vgc*$Vq,rl0OE`z0AH% X׌u<a5KC9Ms1sח1db&r]Vxr8̜xaazgy2Fќ` g]=Q~v&Ii[i(ˡmP09 ǎEI7ep|"B( AQEcuםm"LϱX.T6H 'J]]3ɺX.F]`+hI^#m"z)r*J< >wa(OY<-$Rq̾;0{Z4 a ڮrƺj(Cu>zei!@3ʒwMP@5o^²&IW`D>YPpyctP`yKsgMZiJ,-mV)2E9 Rð-#8"H]`$¦MJEPdQEQEQEQEQEQEs^<\BJᮇD</=,?tOЍk QVHQEQEQEW=_AaM;Ka i[ Z(juKeh@JU$d?6Ji1FRE;um5`eԃ*~BGZOz,z^/^XњktT1˴=62FqO~gErD_%?jY|Hwٿ>m x]Ֆnme{6kAUeK,2dPwWm#MK->iMAo%%7,=.5xI9,B6ӈÙ$`r9PAsea³p)<ȱƀ;=voiqw%ԑS#j푟Znm5恨[[.tI,ACI;-v\@co\gI\V}͵K;uYdxˁH#-ZuX#&n'#0c IJe\MF9;J+ZU b fȇto9bvryf͸Rn%~PF6n>N/oH/gy { #q1xdefX%pYPHd~b\^d$i-d+2yX`aA8'5_=@d1-E*7J,{F:P (QkpOR㎝k=a %9&KU޹y:^$ )].WyI%?LovCy{kW.-b N *aq p{jv%#3~^??[*nQ~?Z/\ Cy{h?Lov`ַ;G!gk<㵽E3~^??[(?~?Z/oQE?LovCy{kz.!gk<ַ;[Qp0?[3~^ޢ~?Z/\ Cy{h?Lov`ַ;G!gk<㵽E3~^??[(7caGs HsuBqֻ@#\?WҸk? B56"[QEY!EPEPEP\4-yMᄍ&x]-=VX–Bo!FG^A٪څ\X^Fb7ܤ`++O o=8k,Wϛ6q$.BɂsR]4iشѥ99 ?ߛ/GO o=0,2 Ihf~]!"snZ z {h:cx "j#z?p͗#ѭfxi+$2fıq{z Y-]]\[tz+xK|8vu%C=ʶlKYظnj麝c ;`⥺KجQU,~I>ÓO8b]ơg8`UMb6H`s"l1". ~Cjr# 9d ͬ';wR_JiZtr3do-qs=\j%<1(GGc6}7oy2x2;֯~ vxeV* w$uSHUm]f\KsGı&yfXU~@A:CڲI "rttɑهHuNPY eX =hyHFhXxݏ=+?ֲF [!f}|޾RH.P[xbȲβ́6n?GL*1`8">ךa/)*ބ9AzJ+7c ZV6s-Zys~x늜piv(Bvgc== sZ?u<5E!Y$eFF $^jVn<-[+.,If#,:< rr>A8$ïKaeI|yR;9?FȾH043d)bg#8 +{0C6'Rv(hityIGVjvSZ ]CB!U1.I=r9Q궭qA+3NӎAC\ɳ`٠x9BF2gY?2XlsҷOd27^&*I㎝ $%&ّo%uIr6_ 7\W_a oUas_A\ma]7Ka(((((?? GVկSn1?8}UuDGح֗+F]>lN0>Q88&{"`r"Mze&aymI (^8r灒j̚4WqC?Vx DTO1ٓd3E]H%X /S~srskWMmVMa;`Hs =jyqt ǜcc2 <閷TQ3*NX a)g.C~}+]PKOѭ7[!|)Y YUdU0xpp WZ'ԝ(6) qkmp01ܱhv8څQHaEPEPEPEPEPEPEPEPEPEPEPEP5,?tOЍs<\BJᮇD</ְ؉nhQEdQ@Q@Q@s5ӿk MjYeZ[N* 36OUQKr<7n8=:ѻwKC'_meY$WZ( n^`e^6⋋"7kydL>zogq{3Co-r׸;k68±ҟ4)* BcKMl}սNCL?t}2 k+'fbdvRGN}c^Ҭj#Cq:)v*0]-sc ֺ*^7)ǪjoZXmyMscӽn[mlr@|9<UCu V戦t/P̄U$Erwr=f#}+9%"QP; p5tkɮu^)ʝ6B 4HO\Ð (EJw( ((S7aFK?m\ NsC#)^ 4gdݏv×VQVǦ}m q(bIF 'dݏſ2jwE;!]'dݏſ2jօ|E[ Kkh-dGo*WQnd8SixZ'eZ^2?|[C&~>-Uv?f[@-2-^->-Uv?fɪ߻3Z^-/ D̿E>-Uv?fɪ߻3Z^-/ D̿E>-Uv?fɪ߻3Z^-/ D̿E>-Uv?fɪ߻3Z^-/ D̿E>-Uv?fɪ߻3Z^-/ D̿E>-Uv?fɪ߻3Z^-/ D̿Eo]z{WP[ILE0UQ'dj~z7eTB`ixZ'eZ?[@-2->h̓_A\^<[mEw&dn>:{g</ D̿G2 3/ D̿Q}B]u:n-)o^%*A144YEQLAEPEPEP/HRjp:+jFծ)KX%ح+Ds8;Tz'WaHڶ.H+Zǥ4#dia=s31]EgF/;"|2f\?%n} z.}9bJWeV0@Uq;?kv *"*2@zXˣxnY6M.q/FLWWjX;q:tQ/9iZǶtfx{{8.$D,K7$ =q]I/ ^2ch\޷um.ȣT+urarǾP~o$NlYY.##x\ݏZfutL+·~wu?$R$`n< Gnd|zC"6d9',pxN/?yt61?ۭB-R5%+jfxCeKKkH1G.Uzu[:tIͽ*SJX61NjoIE0.T{s5SRMU;'&dHFPpw }F9%u=jQXk diWp%ѷ&1/|Ac=|VrEPHQEQEx(Iq]}!\o:'6"[(B((((((((((>6^I㢏Wwx ; _[5t7@w?Կj(((((((((-Eu;2Q6/$;6ZF]'(K?u"T  T߾GF<\LW9}:˯G$Xpg8\sşHkAp)xKA_jݬ/ "ºM[lQE ( +m--5 O4K]w!.P P ot_Zv]JXaK2|ڶm8P ,(^]{xKshyKF`rqFONoEN3s5N'c2܈ۧC[N}SŰ_x}ݧ&umim"%U0}EW.|Iu/M>[d0$8M5/O+$ӭo˝dG_617\gWA-@I7*K hn~H]lM_}C0hs\KqΥN p3g5ycY0M1op>_'vQIبQHaEPEPEPEPEPEPEP5,?tOЍs<\BJᮇD</ְ؉nhQEdQ@Q@Q@s5ӿk xLoEm03:udV*YT%/9j䁀OҹѻVKR) ISsd䍬U>3}j:5obX.8XPuWwo H]` $ ǂW6W :34i%|$ǘ~IiYWzd_+#ݵ*K%Wg!pv2Gpyt92_זC2ڼ9j_=mtɺ-_[ sۛS^ H8*,j z{.KoaÝ|Tڿ`:sj7è%:068݁s]E4LN9tIwī02qW(op(QEQEx(Iq]}!\o:'6"[(B((((((((((>6^I㢏Wwx ; _[5t7@w?Կj((((((((((FZGqKc+c0(((?? GVկP42}p|[ډN?btkjiiok."1N1G^}r1beQoZݢ(.aY>qN;q[7oRKeu"E3P0HKy %~&gGmp.%2');6tU zU8im <+k&R6H->e{F;)(休Ȕsq9$q)}C%9]>KVb/#=9iߵRVYIpʒKrywlh1ӷ[[[[xuUP}sHP19mtlNa}GFK&ei dFV}n;Od⛴ybC4ybQ#ff.o&m)Üqڷ.4}2:m31qY47H#mh)]qcZIǷo!i멀'b[h&I$W1yr0?4@d?tǴlSϒ WKuo/ zw:JT2EdO֬}E9,pGI#ҋZ] |Mz[[kª;gN3_sZOwj2>Up~_~U}ꮵk lg/X4$[ozӷIBŦ`N{=KyX*K ( |Q#`k]q(D}}EVaEPEPEP1He$I ubs~Eb]j88?mާt(4{ ]K(Q1czXƭdXiv%KRY$€~c+Z ]f&"~џF%z#n=z-:y㶈+mA$4Pmhpek`7Ă%A rXÏCC u[cuZgG9,pr ❕r{Dr,YC̅NACێQQap Gd}v\[Kl/ BEݱz0rJx綾e n%7F9B /e95{#zqq ahh) 8'?".^O*1Q6 g{~6?]]4G`AGR*Ke?//mfhCCО:uz}r%Hɴ/icsdcۻ$5E:H/av`n^f;ID$YyF1ZWI6D6噥AX[_^wb'sIh\Ciw؅0pOGNhB8e HRAW1ImWB?%-"O*W}C9A@sHbt yᇆ˕u2X S]{QPXQEQEQEQEQEQEQEQExEqa +@#\?WҸk? B56"[QEY!EPEPEP\4-y7^K{heԴ92A# + Э/&A%B57A%B? ' hzg/(c,3]x4Џ h&UP̟ap 68?CE`/O?V?_H +Ox2W)4`ʭ$9K<2Z b$AS ' j8ə/hH~_c訬A%Bo!>.Sp#gϱgfRxkAu TAw  [D|_MR Q[$Bľ{i.e3jL%F~ppJq8VIk (((((((((((Wwxow:(º]s u/- (((((((((=!V?"sşHk(?|IcAycCp5+0Uӫ#J2 zO4?MWןj{:A$o`6?Pbi8"yj&Tyj&UbiϿ>G"fsh~ ?h~ ?t?ؚw4biȃ'k5G'k5]&>ؚw4r g= Q WCϿ>G&>9yj&Tyj&UbiϿ>G"fsh~ ?h~ ?t?ؚw4biȃ'k5G'k5]&>ؚw4r g= Q WCϿ>G&>9yj&Tyj&UbiϿ>G"fsh~ ?a:Ů2kLV7I+c4 ܨ̈'ctN}ƏM;}j ; ((((ј.92۵Oj]GQnf .zuޡ?? GVղe"v}O{W9/R]n[* xfɠ鲕S+|ӹ3=)!C6vW+Y\ҘIYd(ݽ=G%1Kw1we9`֕ihP˫\]1RFӂ{*&,-TgV9ݱYC ]Eoq?_ٷ?gvn= c4+u)t5l/dbhJN<`0m~AkiڕH]cƠoe,}w6v iifIB{I-on`q+4$2 y kyOpחƵS]Y@cq+2]T(䓒sryMJ Wͱ%s0BaUOZ4koyw?m${~)o4K[-yLVPl2<6IK MqK)ne Hwb˞d%Ԯ^zVᥤqq\2p wcŽK`qZ 64 B# F hvW%'fk?Xďmks342‡-$*FؓG ͸f pN7i)-[6jI̙'̒Y%v㎼qQ1ªݣn,eKV>0pI /-D&mdk$RB1#MʬORǚ-KO#w(ޯ*EY,వKku+g$I$I$rjzNХ{jQE!Q@Q@Q@Q@Q@Q@׏?WҸk? B5xEqa +@#Zb%EUQEQEQEx@SNk{ƿšwC5&Tf,QcXl09F8ZQTr>S{cKks3V[8[Čg'h]ݎaKkPi23C]>ȡx# ))CuWr&7 ]PWz ۧ\}QلiVxbU!lH`ۀ*#1|M+U՞Vj KQwvpXORO?tXz-&kKV?/ mIE+f?CRL!=BUk( bGFvK˒>`F3cBvl"IeE9QiZcCY)z!E1a:Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕ?'k(Q;\_ZQÕcizrJ=ÈL1X۷\WFdx"I.+urO*j̱EU(((((m]nj& ڥѭg:ݼ񴹈E'x5!R?"x"Xq6EbeWruyV;88V,L|PpJ~H=e(؋c-U dx=qIVjqBksl|ОY8j>`0vg= [Fcwzfe!m9;vBvGVmp~a yǮj״Mi:c@֌ ri(kK4.fPЅ69r3]28E;J|8`p3ia|8x?M߆jX Օư9U\HTO=t**+ZE#Aa(.M” # /~-xIdH4ci ptcV."uY$Ivx񎻨66N&K^;weHL?C#$qOW5O-ƥir[`ܱ&efo<@|Š(0(( Q[$BI.+urO+XlD,QEdQ@Q@Q@Q@Q@Ue:#VkKKq.aonX (qzUtbW]i XQSmRڵޥ=\iwkhxc<1ŻY\׮D!H9#x3+(ml[m ]\(ese#yFVoaNi+ ("ҥ%٭#d<0O=ㅳ5 !Ys+C*YBvwm)XnbmokcG.ëuQבZռRtɮgW`~@.7a*}z-~lZZH ŗ%\q~;}g-ݙǓ)׾qך˟wHMko6\,L'n ```el 5e<7RV9`F=яCNqqkYc!n!kU +m$?b`|k^Kd+iiQXG<3VhSC 5y;VYYr }G,sKVu:Z*us{X]kq4*#lHϠU~Vv);QH((((((((((((kǟ+X\5y"] x?_aТ* ( ( ( ( ( ( ( ּ>uoe fB+,n7 ;l@%> |Umkv-5FCnAɕ1ǯgak:y$^uM $5x±tZQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|JnO|mۿE}?WR٫WA@Q@Q@Q@Q@Q@Q@qWCԿt+Jn̷YqWk\PXۺl8G?V?_G [D|_MXu9 WA%ydtխYjZi`/O?V?_RV{WaE:1y0c6kgY$,1E2Z{'+|QiztB%OڌX)&4`2Q >KHwf'Hx)⸇B; 2IB1}t?Q >]V) V q*4aA(VǟdwB,M<;BیIkI}oWjMtE{Ʃ俱|Bl#f@FF6'f<>I& ɣ͓ 8ɮ]'}^?5[-cd`H?OݱbMvW`LTOC\r G)e܅,A2I'5kϾ+5G&O"T[G8 _h!\-eQ.1֦|s= >?Qdf'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Ef'HO?$V&O"TkϾ+5Eg3W{/ gq*9Y f`2Pw:t SSsYEtP? Bf"HuO5eQ@$: ?!?L?$WAEs&k(T3\_]CЙ/HSsYEtP? Bf"i: :(d0!))ulW?g%YU((((((((((>6^I㢏Wwx ; _[5t7@w?Կj(((((((f?(zmt%WUÎF"`0:d&EswhdgbLt/;\XTk5$D[g>[ن-o2֢عV2SÚlMDQy2o9|0I2xw}RĻl0$IqZtQv/tW7IpTq(8jdѴ%d2fTv*)WcZEaʻgC;;Y"2H8ݘ]N=A9(xMXdhdDUIUeCmLJ4cKw V9eb )?r=V.Õv2dH$RgghRk B:Ɓt<"dICLA-Uv?fɪ߻3G#duW!5_cho 4r0G_Er>-Uv?fɪ߻3G#duW!5_cho 4r0G_Er>-Uv?fɪ߻3G#duW!5_cho 4r0G_Er>-Uv?fɪ߻3G#duW!5_cho 4r0G_Er>-Uv?fɪ߻3G#duW!5_cho 4r0G_Er>-Uv?fɪ߻3G#dIo%uIp]z{WP[ILE0UQ'dj~z7eTB\U-ݓQEB ( ( ( ( (9 ѷu\m|CԾ-yZU߲MouuӾq:~?Z/c-#E`ַ;G!gk<#7Cy{h?Lov7Cy{h?Lov7Cy{h?Lov7Cy{h?Lov7Cy{h?Lov7Cy{h?Lov7Cy{h?LovLqGys4QƮc'pI2q*yU"n49hò犥~?Z/f]O{pZ F8xJjxsCK#t{{-.ク|~?Z/@hPSeU.@18W3~^??[ +3~^??[~?Z/~?Z/~?Z/~?Z/~?Z/~?Z/~?Z/<\BJᮇD</ hQ>&c>u2D9G{D</ְ؉nQֵFX4:kyoE\ $Ga?^-KJ`i[&M^-/ D̿[TKſ?s/"h9kb9rKſ?s/"~<[}cgݵiOen~矻EsF?_EKſ?s/"sF?_EKſ?s/"sF?_EKſ?s/"sG7>{xGhl丑c%,U6gֺkn2@q$ğ MZ^t!ZEL(oWCKy{+ w"Ơne_\4- >Bvl"IeEeFG$ ?'N?$VsFG$ ?'N?$VsFG$ ˃UV75"Mg4o;1?%\sG;TdOН/H}GsEkG;TdOН/H}GsEkG;TdOН/H}GsEkG;TdOН/HGW:uΝy]Rw 2,JpyOZЮ>_*ׅbqQEdQ@Q@Q@Q@Q@ |mۿEk@O7@w?Կj+o+lPEPEPEPEPEPEPEp>\ 5,p%䞕?zo\":w=#޹;@Xc;~?ӿ\,tW1?zo:z+GNsvDt?{{h =#޹;G":w=?ӿ\;~OEs?zocDt?{{hGNsv\":w=#޹;@Xc;~?ӿ\,tW1?zo:z+GNsvDt?{{h =#޹;G":w=?ӿ\;~OEs?zocDt?{{hGNsv\=m?[#h_nupynhpN kٮ]2AIQPeQEQE%WUXqWR^Zb|ݔLwjlPXۺIy[2Fqz*Q%rrj:ƷGO߲EhFayX?69{gUS C?mۻj띹+9._O㴻VLIo @g+%0rAz%yI$Dqn-U,$wA'b\.qsoI$QK",23@=RZkew f]$e@9=-[JrN{H:p]_[f쏴y @>qjڬ1޽[d%wo"RjH״w5ki<U5z9U-%ISpGA)NU,'◆PkPevJMv((cu*wrr`AY6j$H?9w#9w ٧<#tEgB۸7͑Hm.%Z5Ԗ:Nv2Fd`}V9:ZMn&70[[+Pl ܨ:o?nװ&/Jy{8ϵ_HdцUi[NOfֲ6F3}(,~{z#.} "Mߐ ]~PG]UF`5 +azWi/Gg[[Z)Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@׏?WҸk? B5xEqa +@#Zb%@m+bvSY.fXԷhp 3x57'D_UL֣ܠ\Tטc·^,pinK7r3ZYuې s]'D_UxKU*ʺ96wgm5ΧlY[}&Kty16+}KZGs~o;1n7Y*x Ӣ/*N<%CNoHoƹhskuPٺ'*C@ #W<֚}ZDÐ 3]GeiF]"F88_40 Ӣ/*1A ѣl:x4y9=ż=OF"y&UcVDeHi | w DŽi?aQO"Lj ]]VKXS1ׁ{hM.pL6$ں :Oآ* k ?)l5=_AaM;Ka\:>34vV2 ^b$$`6g(Xcq wlAcw$ۄ9v r+֞=Ě~oa[)a/;1!E,xQiyq$ nm\<ݱ%<Cc;GoMk_Csky7srG (.Sí2׈4>5Ĉe]$BI?tWG5Iq6pGnks~^9wLE&ӿ]Dx/^h]sMɧ4%Lj/\KIj ﵲ:8Mk4&i/~9n]r\FH*)vXi!k iq츂@]!vdbBg&#2 ^uuӄè~ʒ1.A pEzVtcog+ػOvbM}|cy?48_VRMLasI]%0E6ZO>fh†\5SW \|T& s]qP,?u8n((((((ow:(%{]'WA\sa]KKf ( ( ( ( ( (9o?Rq.4ViIHci HѢڠ&xPK ay_K-Qde1]Ldp)gmŬrZYC /~r7Һ071[z{iw eou;󰸺0(E*FeԎWyY-%er(p7[:Ͷ]s2P0!)nvFįox%g- ^c.3 2P+Bq[V!y|1>ua5vyTSk!'{W''5n}#Mtj [g<2e=엣c{(eQ0Gc{R5/u7H-Go;\[GY 1$(ÉP:d &qv-#x* w@)]ܢKEr-A-k=>;ƍdX avrO,O&~&T5FgkK.w~Sb{ѻ=/GE`Y^^e6TqycL} 5~{&{۸""(H'M&OͤډD/hVY\"balHWݣl+O~OEh#`xr}AؑOtvW%u m&GW p iLţ'q†4,@`{h16guÝ*y<'Q\Z-=#Cvv]c*p ߒG]hp (Q@Q@Q@*ԼZG\O ) ѰQ䎵]>ynOaxRVVA𖹩_yk66)IYB_1`0O\ޝ%Z]!EP3=_V?6aͨZJ0G ) gPG%WUXwzՔMռ0+4 qa?ޟ7+6+ \IEQJK$$x'rq]sx$z_؉G1-ʗ?>8M߻[tRv춢fI@is<;ʆ#p 10ϼ3;%u[;ipL \xʏL[x$YbA(˓hV].r q9ZUy6;}WqDgd, L8Nr `V^7vqk(9EpA*Z$*(QEQEQEQEQEQEQEQEQEQEQEQExEqa +@#\?WҸk? B56"[z w6Ҷ+R.FVD*;QR0(((((OI`եI]O'$]j #b($+xa-"IRHPo!x =_AaM;Ka[ Э/&A%Bޢj`/O?V?_[Qp0 ' h_+h/(?Km4/O\ A%B? ' kz. [D|_MKm5E Э/&A%Bޢ?V?_X6zVH,-lk;hXԷp2B39W/ G\reQEEPEPEPEPEPkG+->D6}>5ͳe 9=?{+ ܴV63y(DFۓx$i.S[Ծy&QtMrKB0۾fq]QtzL.e$l=z)Wj:FDjzuhۑ.`YBP=46ݲ|-Y8Dܠn䏔,$hqa6ь 'y#4;Yn.c4褟&yVɜq=NsWKybegPcߌ~sEZRۻf7O;snv-rQ&MH,a$XaILӲòuqJ?SÚͬ6|B7 7Vl >VV6֜(]q<5:jE$Lh͟b]`,v )'q&fH} mij[jkv\A*\5Ĝ>0Ϗ7mN/p1h|qAE@#qR6PjOad5х|Ӂ~3tjXu}LX[4Y[tB;x`rMa=(]Ms "iLnjG݆ x 8l{i^,/WRKFe. o8 w2 `?KzK([ +؀3#_nq+NS}>K~Lo0q9u S-q%n; }c~{ A.-Vs:OBt/aI[X0Vg#0 qjQ-?bYtذ:7n#y 4҅smg3ʳNۢ`y}j[hwvPY\t֖`8R0? 㮴 SN:H#H0+ss2JIn.7wIe#B (Ivv:.ۛK2yX_pF3׮)dд]*ա;B Y84M.6Ow%"y9vpr21Zz ktza3uT.[88N_\ڇIm}P,fB2rWci=U(aEPEPEPEPEP.%Z];J`w]%"B(f?(zmmV,PXۺuwi]^˫]\C0Pȱz3?\3`Sڇu[\y ܶ3Uk=bMB ZgaG~#XB`hS`|FW-hz/DFmնuywiҢF%'$iZ+Es׾,v̀#jGwo]+RIieV!6G E(y?SӬm6mCyh&H#r$2;0[Pb @I?.M;Zژ~21 0b '<(͎,ޯZGK"3=[}c';N31BOK\eӬgk;y.E3ĥ2=7M1eirp88qpG hO~^L٣TYt`8y=|=LӼ7lp(/ v#尪H $ xkj5p0>S3oHgʮ Zji,3QbS3)i q;r{ݎ̰JYP@H#\H kƯfd6M0[(3ʒ).}gyIi3- 2ecI/khf!EPEPEPEPEPEPEPEPEPEPEP5,?tOЍs<\BJᮇD</ְ؉ne_P4_Jج}KJ`i[ܨQEHŠ((((( ?'SV'u?Vo?w_)K+XlD({ƿšw] s5ӿQEsQ@Q@Q@Q@Q@Q@qP,?uv%Bo5pR((((((ow:(%{]'WA\sa]KKf ( ( ( ( ( (8=VESح Ӎ>1}/j՗m 9V^8犞Pqሦg 3 g(ïl<#d2,Fˏ"ahv(zNK4/R$6˫ *0$7t#\i YOk0hfe_d`8xᴹ0B鼸`;l1*TsjՏVwu+ȶwˉvn:s_Z.|kͥ9e#m,B1c9 UnVVoiFBNwb-M;H 0xw*sibfa^hQ)ԯ4գm<ʭ:ȱePъp>'P D0o0Bӂi/ g'g S~]'$ bTE,/<k[Mwr 2yk+`Qщs׽1|-'oL4ofm=GD>mt>R+gyI@j,q12*K閫I|C E@w۵'P}j0n}/S༗X\$$J$„Up0~dQ9%ot=Z{ǀز}|WD""Oy)[mݷ۳v9ۜT6r[]2R7T yDϾTBi5 v"w3}|ݸwnyot [Y."EV_ICJLJW2ؠlӇ<^7kZʬx+Xg3[KlukXDi)p@E1a-9> 0<d1 q!cS9g4Nj4b[lDsD0]YQ9 о1ZMrJ p5)#U4UAmq:(KćaTT|皳mXa)'ԯghtrmA%:W;|r3E24dRF'-Nq9<QEQEQE@ֿan뤮oN.FIH(J`wSHu Yh\s9#*FֲAO$ʸ@q3an]I+&VV2O["R|eg۸&w.s֬\\"z䷷cRw0w4-⍧%KIf-eѼPd`62qӜZzKIb@*@y"NGy8?GÂDjܱmˈCG \nԚllr\]8XpEê,W`=h_sGry|G`q*HUFǪ],͔vv5rV-O^FM.5*$TܹUlx|m]ôar6B}K)'涢jɋ'4I.$Q fr*1u۔ q#8oikp3!c$c0#۸= qm€hip yO0dc;zzΞ'^ȭ4ah畑y3 l1IMIpEfc5 ߅4=, PuGǗRz=^,n-Uv?fFCſ2j&(;+OIuF2I1 I$Xc,F .2Wr0GQ\dݏſ2jÙ}`MW?|[C&~9\dݏſ2jÙ}qP,?u/dݏ4 궺ԯ類CIp`c5QFMTbފ($(((((ow:(%{]'WA\sa]KKf ( ( ( ( ( (&[:X[)7p7s16t[Y-&- Qv;# H]WhK4y⺶eH<#q>m,ehЅ -؅.si 4N :gF,KzI ;[9$9aLKan_crш4BsRp8sVhz/5]f;My&$[r2n-@x+TZe4(esz褹LJ0y dԴt;fүGl-Tmݴ.wg?]-.1F)҅l ֻJBuH~C-|W^]m ?̼P1ܿ(AΡ5Z_[vFIhO%r9qJfHc 4X:wd֍ED'ygh&V] b9ېjM?wj5ji16/6n ˅bxN1ZBfF pO$:{R~!cfw4jAcC1c0 ޳6]cLK;ˉb_,+*VPeVێw*H'g4pU 'z%+ p~˦i=%,r$s`20rV_j>!2]YKHQerO^9\0")f8Zl}d<Tc]Fp:U7y/]Kikb/#I"IPacW¶;t-:V}z7K8VG!,#rU}tkx|o3;Ե=WKm5 s`F,1摸wuRTӭ"$LGdL$޻-hft̐ќ ?5->:ώu}+K2}b Y2t ă =j'VMoIF5di[.wIQx]}ilEn]>ơ Ȑܡ8NI +9+Nj7[wTJ5Kؖɛ0FssTf4kiYn#.>XR0p 0${Lhi\$qwc2MS4UV_q̿a.L.Ip\V>"]·#5dGu]k1չ#ЊRǠ5->䪐8[_]ܴXE ;Z$5w8IN{ S7u֯j#i@ߨc ؓ 2g' 'nO[k:- 属$e:9MU|68L^7[ZpF]sHCwA.r*o}W첛'oG$S ?x }@18<K*}XH}{xA lI9o"l,%'w$ e@9[E'21~:OjlF#?y'j mH(QEŠ((((((((((((kǟ+X\5y"] x?_aТ* ( ( ( ( ( ( ( ( ( ( ( ( ,--F5W6pw"+IIT^:;]I7XrWxl-K4MSD,!S~IrKq^O|fIՎ·%ͽ}ܛ@O R1th}_6&mf*ȫ#Jcy`$T (((((((((Wwxow:(º]s u/- ((((((?K>v!6/nA , ƞ6C>iW#n3 ;7 .E-om,Q?oaN4[ѐ[S$cgׇ<1Vppa2̙˷19Ǔ޺*+}3Rkŷ42H%8yLqjl ɂ WUuIY 4QeUq yE%(m,s~'Цզ43SHڌĊB?0G@y H.JI5^O:O42y5s| Zm+z1!B*]Kdg&< pm0N֕#`v8AX [Ri ?Gy.fӥwul#7V-F[IdYͼ.9GcJ>BӴ$:WJp_j9q$in>q93Z3$ebPcYPG-7UI-&RlmÍ۱QM_0Zlpڏ bkY 1MXB>T`A)WwH˕y1,00G$gkyAhr^gKm="H #PJNy^-[Kp Wo;o8ۛ,ȃ~NyvQՌKmGG6Am(#kV0%q\ymEeC9#Ȼ_(|6Tu:)[[]nVR>$?s6l##*hX?2Bpc.KJ q[+J:Mſ˷ K #?nQ0VĊDL&B##M~y#85h=JZtݯ#pv[:%y@7`t)hF2T̟_C9M67F[y9Bvl"ҼM\:uwqK<$ȲU*c68==h(Q@Q@Q@Q@Q@ |mۿEk@O7@w?Կj+o+lPEPEPEPEPEPEP ˽oG𾑦\x?Xi졷̩d@JտM$WMEnj&(տM$WMEsտM$QЛ/H3Л/HsV7[_]5gsV7[_GBn"j( Bn"[oYEtP9[oYEۚ 騠.s?ۚ ?5oueQ@\5ouenj&+nj&(տM$WMEsտM$QЛ/H3Л/HsV7[_]5gsV7[_GBn"j( Bn"[oYEtP9[oYEۚ 騠.s?ۚ ?5oueQ@\5ouenj&+nj&(տM$WMEsSQFZtZ[ķ2B3H JH]5P (J`w[4WgN:f*FӬmo/-d`ZGn{&F;ϵc? تZ;1xCn A}sxJ\ص.&8&(aXPJ`91+[x{OmDޯy4 0=1Ѭ!0dc1e' zqҹ9uҬwڄKVlC1f)mɟr1c'p4]Vis"m7qŴnPʧc{f/_ےM_ikq,DkWy T$vU4Y٣m/Y]ٳ ^lm'WlG0) /iK{X`XK5Y.YOéA@V<i' 7w/gEc˶MՋ'y ,Ic 2SDK3"I5of @aa؆x7g~(6ɰ d:(\I2O4K&a mc 8૚BTԵ3M0;%ȓVBKIe7xXpܗ;( (((((ow:(%{]'WA\sa]KKf ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9 ѷu dU=_V?6aͨZJ0G ) gX5u4l?-~~/g;s}^v>ke9sT;*<ܞU%2 *" "G=j3"iw׎:|<'{N=*>V;N9|jvH% X=d] P$+h=1ѤK/t96J[[%YI >psK]sM2w a]q{ZƟC-AbYě;9QrV򩇆.m促8Ei$y M؜i[G_CfT#i//V4ʀ1z*+f[$g.9#@8T{;3\u-,U*`F.~ɑ֞Itu..V-"HF q'$c1cPm4,̗SEiI )9>C:,Ua2pp{y.mD7C|w?ܬ_p0N27<_p'%xR&ww=ޢQeƗjVi=u = ڭ"Juu*r2"al1dXܾqozڌ8S2dc<>)GB\nś\Yȃil@(_guA 8٧LBOg9ž5Fo-_D-ܬF2 O7}ߘml㊣?;;X.(cDsrLwjiM'}י>kqOi줄U u3Z+u QDFݰ8ʶ38sLW[i%ߐ2_qzMF_ƶfyx߻{nsޞ(ӽ?\\. RHmȗV/8A4homYDMЌH?@2H xxIafrW# #q&[FݚgA 7E71'<-5%K5+miN35%e@g1_2 }2Zo O*I5IRVa{n;s[6bpیa=)+"J fY)Q@Q@Q@Q@Q@Q@Q@Q@׏?WҸk? B5xEqa +@#Zb%EUQEQEQEQEQEQEQEQEx@SNkkǐCuᄷ&]KOI#C+A;P٢ ' h_+h/sSz_+h/ Э/&7iiw}mt#9!s FO$ ' h_+h/?V?_G [D|_M 7A%B? ' hz\6ž[9 661VBx<ßZ_+h/ Э/&V [D|_MKm4ޮ>_*ׅ/A%BҴEžake YػGm ƥ끒ϰc(Ԁ(((((Wwxow:(º]s u/- ((((((((((((((((((((((((((c*FӬu{j]&BFsl8=_V?6FiG`GTh _cYͿofcwgڶ?wfv7}qjʋJW1$i4Ao*g H88p{vz#!&+p0#bisIf8bEnIg#6#&)#V =rpOӚv_cю4WNHpHe*;z UmSXOm-^+r8zWᷲ-8'ʹ!@Oj9-4۝I&[d ȭ,JA}phw{nZw,biAB !U\ʜ= zeݜ:n@*cAj7y ݴ0\Z#u5NQ\Jèִ/El?hmmܑ,e**tw=I5&Љʪ0Cfs3}QAEPEPEPEPEPEPEPEPEPEPEPEPEP5,?tOЍs<\BJᮇD</ְ؉nhQEdQ@Q@Q@Q@Q@Q@Q@Q@s5ӿk բ+((((((+Jak>_*ׅyEVaEPEPEPEPEPkG+e岼Z 9D LadcINГSsn`x.4/F&I .\Mooɮml0呷099>?ZQQ,bhVPFˀ2xG:[I4ΥIԪq?YRZӾmZHY =h%:mp_Z+7[~+mہWz`-UcukIVdP @-$X_im,ҩ]EVv+ 0ВS{'EW:)8٨>3/p;s]A(;֫i5Id,/`pӡreVnVMY!ES2 ( ( ( ( ( ( ( ( ( ( ( (9Ȯ?!apCkW t:'FKsB($((((((((+ C\4-Q\EPEPEPEPEPEP\|T& s]qP,?u\7;(3 ( ( ( ( (>@%{]'>6^I㢀>o+lW?WR٫((((((((((((((((((((((((((f?(zmk$L$9?d%WUXkrkWQ^Yb| kzqXhLu n/'h^s2Z_/81wgkf$ o/,!2@c%:0zdzHzٙmnX i-|dd7o6Isirf(&푓~qo m/5 h%iI/Z?%Y3mmr6acI{۫h!T ;e[.<_HchF!Hw Ǡ%tw:M6RQ+Fo&5$;إu}{:wmm6u<ƞhLgQ0?$4+}KSG fۣEH*\t `-u}FM~k!襄 ?NJZdӴmI9$w29|zb{=u~F|^M[ d-MԠ5orrp >A!*v`0{wl-Uv?f( o 4`MW.ſ2j5_ck 8Oɪ߻3Gdݏ,?|[C&~>-Uv?f( o 5&V\:ci. lqF:݉ފ,p)QEQEQEQEQE+6MI\ny Yibd1x^HOS3Pݍ)Iٻ|GoJ#Kk::eA<kNk`ͼYC%G*P 9N08i]*pV5{q[mP۝8Ta*$ۃ3W*/L_,K!bEeFv1j΅sM56{'% |dv*7u\!}UUپ  YY7.v(2nc ;8F*܂E{#JnP1V%P!@=*S!aEP (((((((((((((W t:'FȮ?!apCkXlD4(B+gFYZt2]J۪#1+t ?5oebj9k9\cV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltcV[6_G&C~ltG:Z}y>kW3hj ( ( ( ( ( ( (>@%{]'>6^I㢀>o+lW?WR٫((((((((((((((((((((((((((f?(zmKej|p^#%~f@N9E=_V?6hC70tc?ua?-1<[f}rAkv? A| Ey!fid o<k7~>'̌fʦıI%IeHb8#jZq].x^E{H&FLYp r16K+ w*u8*Ų ݷ30?[ 3}u]cLi ]JlNQ԰>#{a@Y)?wg]_iQ >hG5/,?P3~CA=‹'dTr(@`9R~4X.L4G{ƨL]owjı  >Syh6‰87gBPC@7miQ >]:=+*\Fwߦ .9m}JdP!AOB?0X.iQ >oQHf&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[P&g#TaϮ;5[PXQC>c>u ]Dyw(uD</=,?tOЍk QVHW;qojt1[4Jy18\8]sz w6Ҕ܇ OoYEj'*5hZ^rnqt:;j㹃 B~"H5?ev\/Ŕ8eM ]*XoM.7WT3[Hi4]ϳ+AП/H OoYEY_ g0,O+nW$x9, \$Sk- ht t̊"$ ? O$S!\aV C)p_d9N*I|OO-Ĩ$VmMȪp(FKFqwWkAП/H OoYEYM95Ğ_,2`ci<0-0B2sp<|sE{9eoH5?eAП/HIw~}.{v f)l=^mvؼ7(T*Ax V)oH5?eAП/H/=2;h2N.*ZλN܀ `1NuYBuud:n$Eн{2$ ? O$V@%{]'>6^I㢀>o+lW?WR٫((((((((((((((((((((((((((f?(zmMi&TQ`BG\@Ny 5UB%di&?Y{9&[dGە`!+Ԓ k? K2c ;R5ҭ[H՝WBΒwCiIY!jahG $9'ixuW J⮗D</ְ؉nhQEdsz w6ҺJ/(/mL#7"oB s~%V&=Ɔz2N,a+]?>T35M<\\<ӆVbl]%Uf9隍<]maGN<7tA8[N͠Y=ɼ9D[z}s] (f+ QJs$EI*D1қ g+RxZN{$H HsvƊ5Ej0 i 1)6xYPO*ſ->Ύ6B*q\*QyEBWؐ7{6c%r%_wMt}F+y{<a{me*AZPՁTwoH,/,[Ǚn`s Y@3 1<h]X쌋 &{?1r q}wؼ_eHDXC.r'1] 5ubc9GfT> iNc-ot"O#UM2 +&%HBXNN~cԞrbsVBZmRiivRٿ'-zR^x;MYnIB eC\.1l}v+KZi0t |fa"r9Fxd&.OdkȰWnAX2Okzvso[mQFɝ2xX2hة] ]GH)$'9iVWSA:[xnq5qEqr.O9FHǷ =*(I%an핬=:&8C(9ǹ9&E2oVrA x PWw[ESQEQEQEQEQEQE+rsI\7/ܾy<]imǦ],WmdG w#7۞&z.-پN(8  9nn_Qѹ}GX^3V5iSM]ۙBO:ga]R}Ph{`Pr﵆}:E>V%8[n_Qѹ}GXzR?e8mX3f3ۏz|>*o,e(#}pF.V&~u.ሳx&2 rV!KktҮKʳˆ\8s8Sr΍?:nt׺|SHed :lV2[r΍?:EVܾrά@/ܾ4Pm?:7/[r΍?:EVܾrά@/ܾ4Pm?:7/[r΍?:Er6 dqWMkW t:'FKsB($+Կh ѶW7@m*eQXQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%_"4( c7QEQEQEQEQEQEQE|JnO|mۿE}?WR٫WA@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@PXۺPfL<PXۺuԷwXn2Nx[ӲFe^xsJ.kwx0 0d`sZofeUwVB,@ ~Q֥n9Zڛ+t{o7v6߿# OXGPbMr6W:i4Z\HV<2'BIg8yD_lR+D󉏖+ч\|͜繫>Ո6d!c6iBMeXe\yxwLܴ2@ߴ67ϽgEY.Qox=Ȇ  Nk Ėˤ3[ɗlāmtty&L%(Z;KO&(lJqpG=):!f đ60N`y/f]FYڼ gcJݺԍ^ tPy2atWSN/KHZݠ+ĝ 2sŝ?Mi/( 23dn<0]kZGsw6m.[1v27ޡsD.}?uU>bx8 |5V$ixFe{c#_#ݍn83K'٤F$$o<5ېϽsxE -Fݠwd u-n5 {WHٱrc|^JOEprQmYZ2FF,qw,IN ګ20dF @qڹ[^+Z[t1pO ll3%Jn-@YМxj_as-,FpY##cd)8EKegqōIAױ'#▼ı#ˌ{qr MӕXPpF3)YV۶NYI?Y]پnceUNE)XU#pǧkEc":Aqu}n쏴1ZKܝB3(S6؜۷6vjoE%Q@Q@Q@Q@׏?WҸk? B5xEqa +@#Zb%EU k"FH&kr cav/=mQ@7 SWTG SWT] ?wy?wysE  ;  ;빢?uOt?uOuE???hpOA]Sw]OA]Sw]w4Q`8o@.@.(7 SWTG SWT]X)+)+, ?wy?wysE  ;  ;빢?uOt?uOuE???hpOA]Sw]OA]Sw]w4Q`9}‡CiBdY[f`@KHI<*uQL(((((((>6^I㢏Wwx ; _[5t7@w?Կj(((((((((((((((((((((((((((J`wZqIe+:qd%WU<;j6}WRHQHbbEU_[ e֦D&?esu#J }+k6H]c eu=Nme .!X(l&n%Z,MnmI cqZC-&u!vm${cұχZЬ6^I㢏Wwx ; _[5t7@w?Կj(((((((((((((((((((((((((((J`wN˫t!Td'qSc*Fc-i] @_ m] t5Q} 3gv13Io|4α].qWrqNw#MiL*J '!q<'Dfy4'%nz魦hZŽv'4﹇?5*Xt& }ϙVF?tv: ͭi5ṵ{#nS[{g[1E$ֱGg U 8 ;/xNm>y7[k#ۦLJqAOIoPm$6L;ZK0JQKwqxڂ)>TBoOV',2Vju( Ӈ^0?#(]Ugr+)ogb}2X4/^__?*ie<|''Gr$7{ ɿyV²ymO=Qѐ=W#(7/xs n,4Iې9)Ѽo8±Ȭ@+0qmhf# VʖfyS7.9j4! $(qRw}i5PdyHQNi'3jut7fB\(/Gҵ屴r%^0Sӌ w;w5FX@օmF|76\GutO9^30J*89 Տmmtm`71&Hg {֝agqZAndD%PAF}zN,Z}xaT/ߒ4] ҺԹETQEQEQEQEQEQEQEQEQEQEs^<\BJᮇD</=,?tOЍk QVHQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE+ӕ8lo.IeLӚ7Җ31dR,bn:oJ~Шo!Up.' xO6iV?},AڪH^603ﱛ7t^ g M K#;tA+hGJugL^\|+"gNj&O^\D<]ccbv=>2d@Lk {y޾D:D,Akk(!&Hq!|E[kny6]ZRG^qސxL*Ud{y2v;s6g "I+͸mٳ8pG3^<6kl5[,/.uS 4>b>݉< kx _ǧ]K6l4{cBa0@ZkV7']1Hvܫ#NH'k2wٮ1:@d۵IC96bTcAa "Q'l}3wQ)ɢQ fcap 208TtwiLeXok{*6DyI+-ڪąf;pH8-{Q$pRr+e{fF  ,X8\jzT/_a$l>\غMY\YfOYy䁑zb|] Xp]5;Bbz($!]]9RPxfSPm$4lPRF^Ea̻C ( (9Ȯ?!apCkW t:'FKsB($(((((((((((((((((((((((ow:(%{]'WA\sa]KKf ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9 ѷu%ēYO gLPXۺuƶWvvتp1F8[ӲFQ\f&rnq cLίW96a-vm# w`D^f#o+}&.|ausi4Dj! )3f@bI\IHYs'̄cw pa]L2ӤM4XsaHd'Cc]>Z3 <\I|ӱm9l&12nb%9bI'П5ue²3 *=JWڮ|;u,W׏ő&>rsߦ#ҭ( 0}HTri\EsGE <_\\]#o0{SՏZ<5d-p8eyqVg$AEA9E8Q7s\ZV|eE_ū_XJ'pml׶sҪ/4tTx$}Χl`V~<86qt&%A*N:t查TԣQ{lh=lsq*zf[7_ê>֚۬+baSo|-gA"_O5̒GfYR&9Oz:q\Ğ<QE&/~ۧ8Y/."[[[O! cct'<8+G c𭍝٤R8\x돮hռ)k;A"96xY;M]nl$[K; V#:X'c${ڼ1Go.I(܊w#܍;_4VݷGa(D *QNpQ`A;o\r2I`n~ezrY\\ʓ9F1ݪUB`QӌW>im-ıKXKeN=j+ĚQͧ 1}*J|{~vTW9jw۫ai-H;8fc@y㞎'p) (y"] x?_{ǟ+X\5- ((((((((((((((((((((((((Wwxow:(º]s u/- ((((((((((((((((((((((((((c*FF:P (P;ps'G!vmt>gK-SL]O *@M|H+g#ߩ'4Yw|.UEyGI%-Y*ks`cIky <>nFB#F&ԮkzhIC# r=_sRmA`-ܒT<Tk.s!whB˾h8L)5;zk6zlCqUfDr@N#S\!zl&ymT#E8cy#jO @m/P̻HCIn oAO_qsɭPˉbDѰV$CG*xUj>5 Y@xgn g6a+dP[L]GlddLbW!A8J._%SI .態'3ԕ x$NKHEC),)9>xK1E%V]A,13m` :c.+Q΅p꤂?E{%r' #ILH7H`4[6Y[E?8+v#s'g,]ʱ`ʞbmnn\+7RQnHI,lQd ؈?y˹.5bv yg Fڸ``1EZvWWPZMup! ' OTfF|^Dț,f@ރ<ӧz]lJp2x*R$ 1mdH#3[{rPmN3MF=_qsI:+^jD9STGqxX#cJnk8-m\\nH f-XO56CRn5W(LFҞ ;Wq_ ŵxxL|eg f.d/2h9"R8EUBF@6TFGJ*mHDf MY՞E]QHg5,?tOЍs<\BJᮇD</ְ؉nhQEdQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ |mۿEk@O7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP3=_V?6u9 WA%ydtPXۺPfL2ݖeaՔi~²y&߽یfk=KMO8Q&9Mr߃qIRy"[s$`s]rٱs w*qi vꥂ7q jN6b8Lj 2,9'$I'O<܉P20oo̠qSN7W2%3kXn%ѩiDE*C2G>x9'P`'|6ݟ3f0GgڭNh#oX d ܁*i({[yF7˷:0Pi]ұ=똶X.-\8i?3Oob,E#2 \cQ2iG|"-19c;xUɬei!0ugcr=vR_f(^m&$ c P'm6sK<CBN$fx=~Vtm8ۉ3w@46縉 RZ2[dbw?# O` L:jiki'#_6P(?z|i6d/s3r#BF(ZB)I؋#ŀqf%U1]AtfQRXQEQEQEQEQEQEQEQEQEQExEqa +@#\?WҸk? B56"[QEY!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPkG+Yg- i_8]ጒ' 硋YҖx-<~R\d0T@ Ec;yD2 z|Ñ;oWב\1vb>Csoz5=ֹrWdhEij,M0c9k9kX}_iҞXo3MXI,vȐ8[vXI]>/sZn'KNv;]܃y{%EKpbFc#}gCkBj]Lr_K 2*ʛ.̸Wq֋vg%^ yγ@lq 0Dśxi;1kvE s&P44¤BCCbxl.$ñ;?)Wt>+?6n?=wD=Xg:ѶWwR9B#X ;Fcԑ(t^y}3Km?P%$/;HcCҵgycP2"LfNAps>?iK} Ϫr+ۜӡR0B]7!a,Wrgө&it$AŜ nsW\ntKYV)EEȮs4;ZW4hRk:\-˩YJ :s9>k +o9+ p$#] *dwEPXӨp;s*M>SEd•u{h(((y"] x?_{ǟ+X\5- ((((((((((((((((((((((((Wwxow:(º]s u/- ((((((((((((((((((((((((((c*F֞luIm>+F (u yX eX?d-$ҹ=`~{l/A&Ϳ7coV%5s4kdȞh e!^ӷ_Ix[8 @ޙnx'?s|BO"1_|<,ߌ&Dp}8 GпJBEj2!s$Oz,LO,DRB]0:gzwk^-߅}LO@02 oiȎDo{̖67kf8 ~K1''96'L}?¶Io>ͼC j,C.KyQ3xZk[MB-KN݇{+{s|B |HPe,r$Y3ͤ"|&ZOio<1cw)nQ!J@_a\xZi-5,nURSey%8$qc肺 7?)1{(>gקI`Z_4eUFO0cq5!Z)w[>r$"3q WI!F.g"f~+y"utH>OI'Nzc޳%cdQ!FFpl<`G2(Q!OūXʟâ[6nBYǜU>;뻛"J+$[nRQWSҗWDRM1={-C0am-S) #?s|BqOs__ ( E]v݌E,d$jw?(?qFܽ t%%-GI=][Ҭk9I~bFP0 =ޥ?s|B=OEA!FOEA!FOEA!F`Eqa +@#\׍ُ'?0Ҹ? B56"[QEY!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPkG+P?| ȶ\k+$2$J\</`0HʹCVcL. Ds $1[k<8뎼g-uV`G򂁵O'8CZEƯ,?gڪtBq~[O֒r[Y\aU|UwrK |8>$_)JizbC,"FKO=O,Jktf צ53̼\'ɍs]Woc24'$s`D=8.g^o o [w'9[_E1ܼ6i'XRԄ6qor玚]G[<")&"X$d 9Vs5қg|r9?)^6,Ot&kt+*ĕ8R1~|K^IyP` p7e=2vEecKr΍?:g՝CBV6;r歏[\MifG9vU8=QlH_r΍?:/iP[YM"[ȋ 풢Lрlg2xY GovES9ѭ}GFe?bX<_<| TyK[HA2WiA}GFdAhm]̲"bS%L݊/me[W)q,A\G*~ys"m?:7/1NjP Tl"49c)Tl H+=wv-~ 䓱}GF,KsmmqnΡmr 3ֲ5Ŧ]m$pZʯ'K#HE5/ܾB&/\>wiQfʌ?2pGaHd>*Xw27t[pw\ܾrΛ_jfMWh9 :HVܾrά@/ܾ4Pm?:7/[r΍?:EVܾrά@/ܾ4Pm?:7/؃ᓃ/]6 x?_{ǟ+X\5- ((((((((((((((((((((((((Wwxow:(º]s u/- ((((((((((((((((((((((((((c*FF"`0:d&*FӬ.ŕ|KvS] 2vLVRݖ6+>EGWT-)3nHa1qZ^#\m%фHb.T%fĂJtԭ I][*i6i͒?;re${桺y)A䘮$ |jb5na.0KnF G nu>Eyuy n31L*Ly 91UqC}Oikd/4">͙ȅāFeqGSkUuvk|g[Afi6|7g*֘n$[cx]d"?(brhvx7kh-`8m[~WGduҷ@V@qFJHM4_<>N?^C8?ei YI.%7®7gF:U ynnZCM{: z3BOS`I6}RV]k5XryB'$$sUw{W41ڨrVC{ҳ-l-'[>fw9{_IY8,ggF7L?xܓI(wՖJ(@QEQEQEQEQEQEs^<\BJᮇD</=,?tOЍk QVHQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE+ 8sެVׅܐ*?$\Iw}FKBiAYFEh}^E<95a<_{ MBϐ n$3$6^I㢏Wwx ; _[5t7@w?Կj(((((((((((((((((((((((((((*G]֮dXmŕL/@e!Qde(v ]=#.0(r1ؒ==?s|B3ۖ4K+m$ې?n] t)-bA\L<,A bQׯ7?(?Txv2+e{vqϑtN/]$vil)mٍ>>tQOD.u ~r}?tqƂPuSɏ=w 1X ][T}8<woF4u?s|B`e=w/۟nSw/ܾnQ!Mܾr΀!F7r΍?:v?:7/۟nSw/ܾnQ!Mܾr΀!F7r΍?:v?:7/۟nSw/ܾnQ!Mܾr΀!F7r΍?:v?:7/۟nSw/ܾnQ!Mܾr΀!F7r΍?:n|0A9]. x?_g *OЍk QVHQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE+UA;MnQ|xܻP6 r:9R;⣗ZmY]=YchxɗcZxgK !X]U We rYm#"ƙ$B9ngKJ{g:qUͪљz5KSڥM2tڊ̻XHAMo{ =`h?&7ISrogoonN̤ĖI-Z8b nnӕsҒkgљxJ $Y'0rZ@G*ԗ6$aQ4y_,I# iё1y_~^O*]r FV@zϭAi3uo=Wo UmFvӖ FHO+$ы+[D)d9fi=K8,2] .3F@,E9.ys*ɸ L ;@{&tvX񄰽2dU@ `\541os$ǀw$*a&$܄$RNzd2H)ʴ$=qѽ-.QRXQEQEQEQEQEQEQEQEQEQEQEQExEqa +@#\?WҸk? B56"[QEY!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPkG+@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!VnWwx?[ڵ/KSv 8P?pyparsing-2.0.3/docs/HowToUsePyparsing.html0000664000175000017500000020762412171434766020030 0ustar barrybarry Using the pyparsing module

Using the pyparsing module

Author: Paul McGuire
Address:
ptmcg@users.sourceforge.net
Revision: 2.0.1
Date: July, 2013
Copyright: Copyright © 2003-2013 Paul McGuire.
abstract:This document provides how-to instructions for the pyparsing library, an easy-to-use Python module for constructing and executing basic text parsers. The pyparsing module is useful for evaluating user-definable expressions, processing custom application language commands, or extracting data from formatted reports.

1   Steps to follow

To parse an incoming data string, the client code must follow these steps:

  1. First define the tokens and patterns to be matched, and assign this to a program variable. Optional results names or parsing actions can also be defined at this time.
  2. Call parseString() or scanString() on this variable, passing in the string to be parsed. During the matching process, whitespace between tokens is skipped by default (although this can be changed). When token matches occur, any defined parse action methods are called.
  3. Process the parsed results, returned as a list of strings. Matching results may also be accessed as named attributes of the returned results, if names are defined in the definition of the token pattern, using setResultsName().

1.1   Hello, World!

The following complete Python program will parse the greeting "Hello, World!", or any other greeting of the form "<salutation>, <addressee>!":

from pyparsing import Word, alphas

greet = Word( alphas ) + "," + Word( alphas ) + "!"
greeting = greet.parseString( "Hello, World!" )
print greeting

The parsed tokens are returned in the following form:

['Hello', ',', 'World', '!']

1.2   Usage notes

  • The pyparsing module can be used to interpret simple command strings or algebraic expressions, or can be used to extract data from text reports with complicated format and structure ("screen or report scraping"). However, it is possible that your defined matching patterns may accept invalid inputs. Use pyparsing to extract data from strings assumed to be well-formatted.

  • To keep up the readability of your code, use operators such as +, |, ^, and ~ to combine expressions. You can also combine string literals with ParseExpressions - they will be automatically converted to Literal objects. For example:

    integer  = Word( nums )            # simple unsigned integer
    variable = Word( alphas, max=1 )   # single letter variable, such as x, z, m, etc.
    arithOp  = Word( "+-*/", max=1 )   # arithmetic operators
    equation = variable + "=" + integer + arithOp + integer    # will match "x=2+2", etc.
    

    In the definition of equation, the string "=" will get added as a Literal("="), but in a more readable way.

  • The pyparsing module's default behavior is to ignore whitespace. This is the case for 99% of all parsers ever written. This allows you to write simple, clean, grammars, such as the above equation, without having to clutter it up with extraneous ws markers. The equation grammar will successfully parse all of the following statements:

    x=2+2
    x = 2+2
    a = 10   *   4
    r= 1234/ 100000
    

    Of course, it is quite simple to extend this example to support more elaborate expressions, with nesting with parentheses, floating point numbers, scientific notation, and named constants (such as e or pi). See fourFn.py, included in the examples directory.

  • To modify pyparsing's default whitespace skipping, you can use one or more of the following methods:

    • use the static method ParserElement.setDefaultWhitespaceChars to override the normal set of whitespace chars (' tn'). For instance when defining a grammar in which newlines are significant, you should call ParserElement.setDefaultWhitespaceChars(' \t') to remove newline from the set of skippable whitespace characters. Calling this method will affect all pyparsing expressions defined afterward.

    • call leaveWhitespace() on individual expressions, to suppress the skipping of whitespace before trying to match the expression

    • use Combine to require that successive expressions must be adjacent in the input string. For instance, this expression:

      real = Word(nums) + '.' + Word(nums)
      

      will match "3.14159", but will also match "3 . 12". It will also return the matched results as ['3', '.', '14159']. By changing this expression to:

      real = Combine( Word(nums) + '.' + Word(nums) )
      

      it will not match numbers with embedded spaces, and it will return a single concatenated string '3.14159' as the parsed token.

  • Repetition of expressions can be indicated using the '*' operator. An expression may be multiplied by an integer value (to indicate an exact repetition count), or by a tuple containing two integers, or None and an integer, representing min and max repetitions (with None representing no min or no max, depending whether it is the first or second tuple element). See the following examples, where n is used to indicate an integer value:

    • expr*3 is equivalent to expr + expr + expr
    • expr*(2,3) is equivalent to expr + expr + Optional(expr)
    • expr*(n,None) or expr*(n,) is equivalent to expr*n + ZeroOrMore(expr) (read as "at least n instances of expr")
    • expr*(None,n) is equivalent to expr*(0,n) (read as "0 to n instances of expr")
    • expr*(None,None) is equivalent to ZeroOrMore(expr)
    • expr*(1,None) is equivalent to OneOrMore(expr)

    Note that expr*(None,n) does not raise an exception if more than n exprs exist in the input stream; that is, expr*(None,n) does not enforce a maximum number of expr occurrences. If this behavior is desired, then write expr*(None,n) + ~expr.

  • MatchFirst expressions are matched left-to-right, and the first match found will skip all later expressions within, so be sure to define less-specific patterns after more-specific patterns. If you are not sure which expressions are most specific, use Or expressions (defined using the ^ operator) - they will always match the longest expression, although they are more compute-intensive.

  • Or expressions will evaluate all of the specified subexpressions to determine which is the "best" match, that is, which matches the longest string in the input data. In case of a tie, the left-most expression in the Or list will win.

  • If parsing the contents of an entire file, pass it to the parseFile method using:

    expr.parseFile( sourceFile )
    
  • ParseExceptions will report the location where an expected token or expression failed to match. For example, if we tried to use our "Hello, World!" parser to parse "Hello World!" (leaving out the separating comma), we would get an exception, with the message:

    pyparsing.ParseException: Expected "," (6), (1,7)
    

    In the case of complex expressions, the reported location may not be exactly where you would expect. See more information under ParseException .

  • Use the Group class to enclose logical groups of tokens within a sublist. This will help organize your results into more hierarchical form (the default behavior is to return matching tokens as a flat list of matching input strings).

  • Punctuation may be significant for matching, but is rarely of much interest in the parsed results. Use the suppress() method to keep these tokens from cluttering up your returned lists of tokens. For example, delimitedList() matches a succession of one or more expressions, separated by delimiters (commas by default), but only returns a list of the actual expressions - the delimiters are used for parsing, but are suppressed from the returned output.

  • Parse actions can be used to convert values from strings to other data types (ints, floats, booleans, etc.).

  • Results names are recommended for retrieving tokens from complex expressions. It is much easier to access a token using its field name than using a positional index, especially if the expression contains optional elements. You can also shortcut the setResultsName call:

    stats = "AVE:" + realNum.setResultsName("average") + \
            "MIN:" + realNum.setResultsName("min") + \
            "MAX:" + realNum.setResultsName("max")
    

    can now be written as this:

    stats = "AVE:" + realNum("average") + \
            "MIN:" + realNum("min") + \
            "MAX:" + realNum("max")
    
  • Be careful when defining parse actions that modify global variables or data structures (as in fourFn.py), especially for low level tokens or expressions that may occur within an And expression; an early element of an And may match, but the overall expression may fail.

  • Performance of pyparsing may be slow for complex grammars and/or large input strings. The psyco package can be used to improve the speed of the pyparsing module with no changes to grammar or program logic - observed improvments have been in the 20-50% range.

2   Classes

2.1   Classes in the pyparsing module

ParserElement - abstract base class for all pyparsing classes; methods for code to use are:

  • parseString( sourceString, parseAll=False ) - only called once, on the overall matching pattern; returns a ParseResults object that makes the matched tokens available as a list, and optionally as a dictionary, or as an object with named attributes; if parseAll is set to True, then parseString will raise a ParseException if the grammar does not process the complete input string.

  • parseFile( sourceFile ) - a convenience function, that accepts an input file object or filename. The file contents are passed as a string to parseString(). parseFile also supports the parseAll argument.

  • scanString( sourceString ) - generator function, used to find and extract matching text in the given source string; for each matched text, returns a tuple of:

    • matched tokens (packaged as a ParseResults object)
    • start location of the matched text in the given source string
    • end location in the given source string

    scanString allows you to scan through the input source string for random matches, instead of exhaustively defining the grammar for the entire source text (as would be required with parseString).

  • transformString( sourceString ) - convenience wrapper function for scanString, to process the input source string, and replace matching text with the tokens returned from parse actions defined in the grammar (see setParseAction).

  • searchString( sourceString ) - another convenience wrapper function for scanString, returns a list of the matching tokens returned from each call to scanString.

  • setName( name ) - associate a short descriptive name for this element, useful in displaying exceptions and trace information

  • setResultsName( string, listAllMatches=False ) - name to be given to tokens matching the element; if multiple tokens within a repetition group (such as ZeroOrMore or delimitedList) the default is to return only the last matching token - if listAllMatches is set to True, then a list of all the matching tokens is returned. (New in 1.5.6 - a results name with a trailing '*' character will be interpreted as setting listAllMatches to True.) Note: setResultsName returns a copy of the element so that a single basic element can be referenced multiple times and given different names within a complex grammar.

  • setParseAction( *fn ) - specify one or more functions to call after successful matching of the element; each function is defined as fn( s, loc, toks ), where:

    • s is the original parse string
    • loc is the location in the string where matching started
    • toks is the list of the matched tokens, packaged as a ParseResults object

    Multiple functions can be attached to a ParserElement by specifying multiple arguments to setParseAction, or by calling setParseAction multiple times.

    Each parse action function can return a modified toks list, to perform conversion, or string modifications. For brevity, fn may also be a lambda - here is an example of using a parse action to convert matched integer tokens from strings to integers:

    intNumber = Word(nums).setParseAction( lambda s,l,t: [ int(t[0]) ] )
    

    If fn does not modify the toks list, it does not need to return anything at all.

  • setBreak( breakFlag=True ) - if breakFlag is True, calls pdb.set_break() as this expression is about to be parsed

  • copy() - returns a copy of a ParserElement; can be used to use the same parse expression in different places in a grammar, with different parse actions attached to each

  • leaveWhitespace() - change default behavior of skipping whitespace before starting matching (mostly used internally to the pyparsing module, rarely used by client code)

  • setWhitespaceChars( chars ) - define the set of chars to be ignored as whitespace before trying to match a specific ParserElement, in place of the default set of whitespace (space, tab, newline, and return)

  • setDefaultWhitespaceChars( chars ) - class-level method to override the default set of whitespace chars for all subsequently created ParserElements (including copies); useful when defining grammars that treat one or more of the default whitespace characters as significant (such as a line-sensitive grammar, to omit newline from the list of ignorable whitespace)

  • suppress() - convenience function to suppress the output of the given element, instead of wrapping it with a Suppress object.

  • ignore( expr ) - function to specify parse expression to be ignored while matching defined patterns; can be called repeatedly to specify multiple expressions; useful to specify patterns of comment syntax, for example

  • setDebug( dbgFlag=True ) - function to enable/disable tracing output when trying to match this element

  • validate() - function to verify that the defined grammar does not contain infinitely recursive constructs

  • parseWithTabs() - function to override default behavior of converting tabs to spaces before parsing the input string; rarely used, except when specifying whitespace-significant grammars using the White class.
  • enablePackrat() - a class-level static method to enable a memoizing performance enhancement, known as "packrat parsing". packrat parsing is disabled by default, since it may conflict with some user programs that use parse actions. To activate the packrat feature, your program must call the class method ParserElement.enablePackrat(). If your program uses psyco to "compile as you go", you must call enablePackrat before calling psyco.full(). If you do not do this, Python will crash. For best results, call enablePackrat() immediately after importing pyparsing.

2.2   Basic ParserElement subclasses

  • Literal - construct with a string to be matched exactly
  • CaselessLiteral - construct with a string to be matched, but without case checking; results are always returned as the defining literal, NOT as they are found in the input string
  • Keyword - similar to Literal, but must be immediately followed by whitespace, punctuation, or other non-keyword characters; prevents accidental matching of a non-keyword that happens to begin with a defined keyword
  • CaselessKeyword - similar to Keyword, but with caseless matching behavior
  • Word - one or more contiguous characters; construct with a string containing the set of allowed initial characters, and an optional second string of allowed body characters; for instance, a common Word construct is to match a code identifier - in C, a valid identifier must start with an alphabetic character or an underscore ('_'), followed by a body that can also include numeric digits. That is, a, i, MAX_LENGTH, _a1, b_109_, and plan9FromOuterSpace are all valid identifiers; 9b7z, $a, .section, and 0debug are not. To define an identifier using a Word, use either of the following:

    - Word( alphas+"_", alphanums+"_" )
    - Word( srange("[a-zA-Z_]"), srange("[a-zA-Z0-9_]") )
    

    If only one string given, it specifies that the same character set defined for the initial character is used for the word body; for instance, to define an identifier that can only be composed of capital letters and underscores, use:

    - Word( "ABCDEFGHIJKLMNOPQRSTUVWXYZ_" )
    - Word( srange("[A-Z_]") )
    

    A Word may also be constructed with any of the following optional parameters:

    • min - indicating a minimum length of matching characters
    • max - indicating a maximum length of matching characters
    • exact - indicating an exact length of matching characters

    If exact is specified, it will override any values for min or max.

    New in 1.5.6 - Sometimes you want to define a word using all characters in a range except for one or two of them; you can do this with the new excludeChars argument. This is helpful if you want to define a word with all printables except for a single delimiter character, such as '.'. Previously, you would have to create a custom string to pass to Word. With this change, you can just create Word(printables, excludeChars='.').

  • CharsNotIn - similar to Word, but matches characters not in the given constructor string (accepts only one string for both initial and body characters); also supports min, max, and exact optional parameters.

  • Regex - a powerful construct, that accepts a regular expression to be matched at the current parse position; accepts an optional flags parameter, corresponding to the flags parameter in the re.compile method; if the expression includes named sub-fields, they will be represented in the returned ParseResults

  • QuotedString - supports the definition of custom quoted string formats, in addition to pyparsing's built-in dblQuotedString and sglQuotedString. QuotedString allows you to specify the following parameters:

    • quoteChar - string of one or more characters defining the quote delimiting string
    • escChar - character to escape quotes, typically backslash (default=None)
    • escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=None)
    • multiline - boolean indicating whether quotes can span multiple lines (default=False)
    • unquoteResults - boolean indicating whether the matched text should be unquoted (default=True)
    • endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=None => same as quoteChar)
  • SkipTo - skips ahead in the input string, accepting any characters up to the specified pattern; may be constructed with the following optional parameters:

    • include - if set to true, also consumes the match expression (default is False)
    • ignore - allows the user to specify patterns to not be matched, to prevent false matches
    • failOn - if a literal string or expression is given for this argument, it defines an expression that should cause the SkipTo expression to fail, and not skip over that expression
  • White - also similar to Word, but matches whitespace characters. Not usually needed, as whitespace is implicitly ignored by pyparsing. However, some grammars are whitespace-sensitive, such as those that use leading tabs or spaces to indicating grouping or hierarchy. (If matching on tab characters, be sure to call parseWithTabs on the top-level parse element.)
  • Empty - a null expression, requiring no characters - will always match; useful for debugging and for specialized grammars
  • NoMatch - opposite of Empty, will never match; useful for debugging and for specialized grammars

2.3   Expression subclasses

  • And - construct with a list of ParserElements, all of which must match for And to match; can also be created using the '+' operator; multiple expressions can be Anded together using the '*' operator as in:

    ipAddress = Word(nums) + ('.'+Word(nums))*3
    

    A tuple can be used as the multiplier, indicating a min/max:

    usPhoneNumber = Word(nums) + ('-'+Word(nums))*(1,2)
    

    A special form of And is created if the '-' operator is used instead of the '+' operator. In the ipAddress example above, if no trailing '.' and Word(nums) are found after matching the initial Word(nums), then pyparsing will back up in the grammar and try other alternatives to ipAddress. However, if ipAddress is defined as:

    strictIpAddress = Word(nums) - ('.'+Word(nums))*3
    

    then no backing up is done. If the first Word(nums) of strictIpAddress is matched, then any mismatch after that will raise a ParseSyntaxException, which will halt the parsing process immediately. By careful use of the '-' operator, grammars can provide meaningful error messages close to the location where the incoming text does not match the specified grammar.

  • Or - construct with a list of ParserElements, any of which must match for Or to match; if more than one expression matches, the expression that makes the longest match will be used; can also be created using the '^' operator

  • MatchFirst - construct with a list of ParserElements, any of which must match for MatchFirst to match; matching is done left-to-right, taking the first expression that matches; can also be created using the '|' operator

  • Each - similar to And, in that all of the provided expressions must match; however, Each permits matching to be done in any order; can also be created using the '&' operator

  • Optional - construct with a ParserElement, but this element is not required to match; can be constructed with an optional default argument, containing a default string or object to be supplied if the given optional parse element is not found in the input string; parse action will only be called if a match is found, or if a default is specified

  • ZeroOrMore - similar to Optional, but can be repeated

  • OneOrMore - similar to ZeroOrMore, but at least one match must be present

  • FollowedBy - a lookahead expression, requires matching of the given expressions, but does not advance the parsing position within the input string

  • NotAny - a negative lookahead expression, prevents matching of named expressions, does not advance the parsing position within the input string; can also be created using the unary '~' operator

2.4   Expression operators

  • ~ - creates NotAny using the expression after the operator
  • + - creates And using the expressions before and after the operator
  • | - creates MatchFirst (first left-to-right match) using the expressions before and after the operator
  • ^ - creates Or (longest match) using the expressions before and after the operator
  • & - creates Each using the expressions before and after the operator
  • * - creates And by multiplying the expression by the integer operand; if expression is multiplied by a 2-tuple, creates an And of (min,max) expressions (similar to "{min,max}" form in regular expressions); if min is None, intepret as (0,max); if max is None, interpret as expr*min + ZeroOrMore(expr)
  • - - like + but with no backup and retry of alternatives
  • * - repetition of expression
  • == - matching expression to string; returns True if the string matches the given expression
  • <<= - inserts the expression following the operator as the body of the Forward expression before the operator (formerly <<, which is now deprecated)

2.5   Positional subclasses

  • StringStart - matches beginning of the text
  • StringEnd - matches the end of the text
  • LineStart - matches beginning of a line (lines delimited by \n characters)
  • LineEnd - matches the end of a line
  • WordStart - matches a leading word boundary
  • WordEnd - matches a trailing word boundary

2.6   Converter subclasses

  • Upcase - converts matched tokens to uppercase (deprecated - use upcaseTokens parse action instead)
  • Combine - joins all matched tokens into a single string, using specified joinString (default joinString=""); expects all matching tokens to be adjacent, with no intervening whitespace (can be overridden by specifying adjacent=False in constructor)
  • Suppress - clears matched tokens; useful to keep returned results from being cluttered with required but uninteresting tokens (such as list delimiters)

2.7   Special subclasses

  • Group - causes the matched tokens to be enclosed in a list; useful in repeated elements like ZeroOrMore and OneOrMore to break up matched tokens into groups for each repeated pattern
  • Dict - like Group, but also constructs a dictionary, using the [0]'th elements of all enclosed token lists as the keys, and each token list as the value
  • SkipTo - catch-all matching expression that accepts all characters up until the given pattern is found to match; useful for specifying incomplete grammars
  • Forward - placeholder token used to define recursive token patterns; when defining the actual expression later in the program, insert it into the Forward object using the <<= operator (see fourFn.py for an example).

2.8   Other classes

  • ParseResults - class used to contain and manage the lists of tokens created from parsing the input using the user-defined parse expression. ParseResults can be accessed in a number of ways:

    • as a list
      • total list of elements can be found using len()
      • individual elements can be found using [0], [1], [-1], etc.
      • elements can be deleted using del
      • the -1th element can be extracted and removed in a single operation using pop(), or any element can be extracted and removed using pop(n)
    • as a dictionary
      • if setResultsName() is used to name elements within the overall parse expression, then these fields can be referenced as dictionary elements or as attributes
      • the Dict class generates dictionary entries using the data of the input text - in addition to ParseResults listed as [ [ a1, b1, c1, ...], [ a2, b2, c2, ...]  ] it also acts as a dictionary with entries defined as { a1 : [ b1, c1, ... ] }, { a2 : [ b2, c2, ... ] }; this is especially useful when processing tabular data where the first column contains a key value for that line of data
      • list elements that are deleted using del will still be accessible by their dictionary keys
      • supports get(), items() and keys() methods, similar to a dictionary
      • a keyed item can be extracted and removed using pop(key). Here key must be non-numeric (such as a string), in order to use dict extraction instead of list extraction.
      • new named elements can be added (in a parse action, for instance), using the same syntax as adding an item to a dict (parseResults["X"]="new item"); named elements can be removed using del parseResults["X"]
    • as a nested list
      • results returned from the Group class are encapsulated within their own list structure, so that the tokens can be handled as a hierarchical tree

    ParseResults can also be converted to an ordinary list of strings by calling asList(). Note that this will strip the results of any field names that have been defined for any embedded parse elements. (The pprint module is especially good at printing out the nested contents given by asList().)

    Finally, ParseResults can be converted to an XML string by calling asXML(). Where possible, results will be tagged using the results names defined for the respective ParseExpressions. asXML() takes two optional arguments:

    • doctagname - for ParseResults that do not have a defined name, this argument will wrap the resulting XML in a set of opening and closing tags <doctagname> and </doctagname>.
    • namedItemsOnly (default=False) - flag to indicate if the generated XML should skip items that do not have defined names. If a nested group item is named, then all embedded items will be included, whether they have names or not.

2.9   Exception classes and Troubleshooting

  • ParseException - exception returned when a grammar parse fails; ParseExceptions have attributes loc, msg, line, lineno, and column; to view the text line and location where the reported ParseException occurs, use:

    except ParseException, err:
        print err.line
        print " "*(err.column-1) + "^"
        print err
    
  • RecursiveGrammarException - exception returned by validate() if the grammar contains a recursive infinite loop, such as:

    badGrammar = Forward()
    goodToken = Literal("A")
    badGrammar <<= Optional(goodToken) + badGrammar
    
  • ParseFatalException - exception that parse actions can raise to stop parsing immediately. Should be used when a semantic error is found in the input text, such as a mismatched XML tag.

  • ParseSyntaxException - subclass of ParseFatalException raised when a syntax error is found, based on the use of the '-' operator when defining a sequence of expressions in an And expression.

You can also get some insights into the parsing logic using diagnostic parse actions, and setDebug(), or test the matching of expression fragments by testing them using scanString().

3   Miscellaneous attributes and methods

3.1   Helper methods

  • delimitedList( expr, delim=',') - convenience function for matching one or more occurrences of expr, separated by delim. By default, the delimiters are suppressed, so the returned results contain only the separate list elements. Can optionally specify combine=True, indicating that the expressions and delimiters should be returned as one combined value (useful for scoped variables, such as "a.b.c", or "a::b::c", or paths such as "a/b/c").

  • countedArray( expr ) - convenience function for a pattern where an list of instances of the given expression are preceded by an integer giving the count of elements in the list. Returns an expression that parses the leading integer, reads exactly that many expressions, and returns the array of expressions in the parse results - the leading integer is suppressed from the results (although it is easily reconstructed by using len on the returned array).

  • oneOf( string, caseless=False ) - convenience function for quickly declaring an alternative set of Literal tokens, by splitting the given string on whitespace boundaries. The tokens are sorted so that longer matches are attempted first; this ensures that a short token does not mask a longer one that starts with the same characters. If caseless=True, will create an alternative set of CaselessLiteral tokens.

  • dictOf( key, value ) - convenience function for quickly declaring a dictionary pattern of Dict( ZeroOrMore( Group( key + value ) ) ).

  • makeHTMLTags( tagName ) and makeXMLTags( tagName ) - convenience functions to create definitions of opening and closing tag expressions. Returns a pair of expressions, for the corresponding <tag> and </tag> strings. Includes support for attributes in the opening tag, such as <tag attr1="abc"> - attributes are returned as keyed tokens in the returned ParseResults. makeHTMLTags is less restrictive than makeXMLTags, especially with respect to case sensitivity.

  • infixNotation(baseOperand, operatorList) - (formerly named operatorPrecedence) convenience function to define a grammar for parsing infix notation expressions with a hierarchical precedence of operators. To use the infixNotation helper:

    1. Define the base "atom" operand term of the grammar. For this simple grammar, the smallest operand is either and integer or a variable. This will be the first argument to the infixNotation method.
    2. Define a list of tuples for each level of operator precendence. Each tuple is of the form (opExpr, numTerms, rightLeftAssoc, parseAction), where:
      • opExpr is the pyparsing expression for the operator; may also be a string, which will be converted to a Literal; if None, indicates an empty operator, such as the implied multiplication operation between 'm' and 'x' in "y = mx + b". If numTerms parameter is 3, this must be a 2-tuple containing the 2 delimiting operators.
      • numTerms is the number of terms for this operator (must be 1,2, or 3)
      • rightLeftAssoc is the indicator whether the operator is right or left associative, using the pyparsing-defined constants opAssoc.RIGHT and opAssoc.LEFT.
      • parseAction is the parse action to be associated with expressions matching this operator expression (the parse action tuple member may be omitted)
    3. Call infixNotation passing the operand expression and the operator precedence list, and save the returned value as the generated pyparsing expression. You can then use this expression to parse input strings, or incorporate it into a larger, more complex grammar.
  • matchPreviousLiteral and matchPreviousExpr - function to define and expression that matches the same content as was parsed in a previous parse expression. For instance:

    first = Word(nums)
    matchExpr = first + ":" + matchPreviousLiteral(first)
    

    will match "1:1", but not "1:2". Since this matches at the literal level, this will also match the leading "1:1" in "1:10".

    In contrast:

    first = Word(nums)
    matchExpr = first + ":" + matchPreviousExpr(first)
    

    will not match the leading "1:1" in "1:10"; the expressions are evaluated first, and then compared, so "1" is compared with "10".

  • nestedExpr(opener, closer, content=None, ignoreExpr=quotedString) - method for defining nested lists enclosed in opening and closing delimiters.

    • opener - opening character for a nested list (default="("); can also be a pyparsing expression
    • closer - closing character for a nested list (default=")"); can also be a pyparsing expression
    • content - expression for items within the nested lists (default=None)
    • ignoreExpr - expression for ignoring opening and closing delimiters (default=quotedString)

    If an expression is not provided for the content argument, the nested expression will capture all whitespace-delimited content between delimiters as a list of separate values.

    Use the ignoreExpr argument to define expressions that may contain opening or closing characters that should not be treated as opening or closing characters for nesting, such as quotedString or a comment expression. Specify multiple expressions using an Or or MatchFirst. The default is quotedString, but if no expressions are to be ignored, then pass None for this argument.

  • indentedBlock( statementExpr, indentationStackVar, indent=True) - function to define an indented block of statements, similar to indentation-based blocking in Python source code:

    • statementExpr - the expression defining a statement that will be found in the indented block; a valid indentedBlock must contain at least 1 matching statementExpr
    • indentationStackVar - a Python list variable; this variable should be common to all indentedBlock expressions defined within the same grammar, and should be reinitialized to [1] each time the grammar is to be used
    • indent - a boolean flag indicating whether the expressions within the block must be indented from the current parse location; if using indentedBlock to define the left-most statements (all starting in column 1), set indent to False
  • originalTextFor( expr ) - helper function to preserve the originally parsed text, regardless of any token processing or conversion done by the contained expression. For instance, the following expression:

    fullName = Word(alphas) + Word(alphas)
    

    will return the parse of "John Smith" as ['John', 'Smith']. In some applications, the actual name as it was given in the input string is what is desired. To do this, use originalTextFor:

    fullName = originalTextFor(Word(alphas) + Word(alphas))
    
  • ungroup( expr ) - function to "ungroup" returned tokens; useful to undo the default behavior of And to always group the returned tokens, even if there is only one in the list. (New in 1.5.6)

  • lineno( loc, string ) - function to give the line number of the location within the string; the first line is line 1, newlines start new rows

  • col( loc, string ) - function to give the column number of the location within the string; the first column is column 1, newlines reset the column number to 1

  • line( loc, string ) - function to retrieve the line of text representing lineno( loc, string ); useful when printing out diagnostic messages for exceptions

  • srange( rangeSpec ) - function to define a string of characters, given a string of the form used by regexp string ranges, such as "[0-9]" for all numeric digits, "[A-Z_]" for uppercase characters plus underscore, and so on (note that rangeSpec does not include support for generic regular expressions, just string range specs)

  • getTokensEndLoc() - function to call from within a parse action to get the ending location for the matched tokens

  • traceParseAction(fn) - decorator function to debug parse actions. Lists each call, called arguments, and return value or exception

3.2   Helper parse actions

  • removeQuotes - removes the first and last characters of a quoted string; useful to remove the delimiting quotes from quoted strings

  • replaceWith(replString) - returns a parse action that simply returns the replString; useful when using transformString, or converting HTML entities, as in:

    nbsp = Literal("&nbsp;").setParseAction( replaceWith("<BLANK>") )
    
  • keepOriginalText- (deprecated, use originalTextFor instead) restores any internal whitespace or suppressed text within the tokens for a matched parse expression. This is especially useful when defining expressions for scanString or transformString applications.

  • withAttribute( *args, **kwargs ) - helper to create a validating parse action to be used with start tags created with makeXMLTags or makeHTMLTags. Use withAttribute to qualify a starting tag with a required attribute value, to avoid false matches on common tags such as <TD> or <DIV>.

    withAttribute can be called with:

    • keyword arguments, as in (class="Customer",align="right"), or
    • a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") )

    An attribute can be specified to have the special value withAttribute.ANY_VALUE, which will match any value - use this to ensure that an attribute is present but any attribute value is acceptable.

  • downcaseTokens - converts all matched tokens to lowercase

  • upcaseTokens - converts all matched tokens to uppercase

  • matchOnlyAtCol( columnNumber ) - a parse action that verifies that an expression was matched at a particular column, raising a ParseException if matching at a different column number; useful when parsing tabular data

3.3   Common string and token constants

  • alphas - same as string.letters

  • nums - same as string.digits

  • alphanums - a string containing alphas + nums

  • alphas8bit - a string containing alphabetic 8-bit characters:

    ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ
    
  • printables - same as string.printable, minus the space (' ') character

  • empty - a global Empty(); will always match

  • sglQuotedString - a string of characters enclosed in 's; may include whitespace, but not newlines

  • dblQuotedString - a string of characters enclosed in "s; may include whitespace, but not newlines

  • quotedString - sglQuotedString | dblQuotedString

  • cStyleComment - a comment block delimited by '/*' and '*/' sequences; can span multiple lines, but does not support nesting of comments

  • htmlComment - a comment block delimited by '<!--' and '-->' sequences; can span multiple lines, but does not support nesting of comments

  • commaSeparatedList - similar to delimitedList, except that the list expressions can be any text value, or a quoted string; quoted strings can safely include commas without incorrectly breaking the string into two tokens

  • restOfLine - all remaining printable characters up to but not including the next newline