From 4ab9f5b5959759074ee9eff220a170fb9206b84e Mon Sep 17 00:00:00 2001 From: jeanpaulsio Date: Thu, 26 Mar 2026 19:38:59 -0700 Subject: [PATCH 1/4] fix: support ::TopLevel leading scope resolution (BUG-015b) Allow ScopeResolution to start with :: prefix for top-level constant references like ::TopLevel and ::TopLevel::Foo. Also support :: prefix in className for class/module definitions. Uses ~scopeOrClass GLR marker to resolve ambiguity between className's :: repetition and ScopeResolution. --- src/syntax.grammar | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/syntax.grammar b/src/syntax.grammar index e6ecccb..c01cc76 100644 --- a/src/syntax.grammar +++ b/src/syntax.grammar @@ -127,7 +127,7 @@ ModuleDef { } // Scoped class/module names: Foo, Foo::Bar, ::TopLevel::Foo -className { Constant ~rescue ("::" Constant)* } +className { "::"? Constant ~rescue (~scopeOrClass "::" Constant)* ~scopeOrClass } ModuleBody { statement* } @@ -289,9 +289,10 @@ MethodCall { Constant !call ArgList } -// Scope resolution: Foo::Bar, Foo::Bar::Baz, self::method +// Scope resolution: Foo::Bar, Foo::Bar::Baz, self::method, ::TopLevel ScopeResolution { - expression !member "::" (Constant | Identifier) + expression !member "::" (Constant | Identifier) | + "::" (Constant | Identifier) } // Subscript access: arr[0], hash[:key], matrix[i][j] From 5d9bc25c9b212e7d7e9e865892aa2140abd3db48 Mon Sep 17 00:00:00 2001 From: jeanpaulsio Date: Thu, 26 Mar 2026 19:41:25 -0700 Subject: [PATCH 2/4] fix: add HashPattern for pattern matching in case/in (BUG-026a) Add HashPattern and HashPatternPair rules reachable only from InClause for Ruby 3.0+ pattern matching. Supports {name: String => n} binding syntax and {name:} shorthand. Uses ~hashOrPattern GLR marker to resolve ambiguity with regular Hash/HashPair rules. --- src/syntax.grammar | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/syntax.grammar b/src/syntax.grammar index c01cc76..bbd4cd9 100644 --- a/src/syntax.grammar +++ b/src/syntax.grammar @@ -174,12 +174,19 @@ WhenClause { // keyword conflicts with IfStatement/UnlessStatement in the LR parser. // Hash patterns ({name: Type => var}) and find patterns ([*, x, *]) are also deferred. InClause { - kw<"in"> (PinExpression | PatternBinding | expression) statement* + kw<"in"> (PinExpression | HashPattern | PatternBinding | expression) statement* } // Pattern binding: match a type and bind to a variable (e.g., Integer => n) PatternBinding { expression "=>" Identifier } +// Hash pattern for pattern matching: {name: String => n}, {name:} +HashPattern { ~blockOrHash "{" (HashPatternPair ("," HashPatternPair)* ","?)? "}" ~blockOrHash } +HashPatternPair { + Identifier colonOp expression ~hashOrPattern ("=>" Identifier)? | + Identifier colonOp +} + // Pin operator — scoped to InClause only, since ^ is bitwise XOR elsewhere PinExpression { "^" expression } @@ -413,7 +420,7 @@ InterpolationEnd[openedBy=InterpolationStart] { "}" } Array { "[" commaSep "]" } Hash { ~blockOrHash "{" (HashPair ("," HashPair)* ","?)? "}" ~blockOrHash } -HashPair { expression "=>" expression | Identifier colonOp expression } +HashPair { expression "=>" expression | Identifier colonOp expression ~hashOrPattern } @precedence { member @left, From f77dd5d25311fd27ad9139e6a5e3ae20a9111845 Mon Sep 17 00:00:00 2001 From: jeanpaulsio Date: Thu, 26 Mar 2026 19:53:10 -0700 Subject: [PATCH 3/4] fix: add FindPattern for pattern matching [*, value, *] (BUG-026c) Add FindPattern rule reachable from InClause for Ruby 3.0+ find patterns. Requires leading * to unambiguously distinguish from regular Array. Supports [*, value, *] and [*pre, value, *post] forms. --- src/syntax.grammar | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/syntax.grammar b/src/syntax.grammar index bbd4cd9..bbaa17f 100644 --- a/src/syntax.grammar +++ b/src/syntax.grammar @@ -174,9 +174,14 @@ WhenClause { // keyword conflicts with IfStatement/UnlessStatement in the LR parser. // Hash patterns ({name: Type => var}) and find patterns ([*, x, *]) are also deferred. InClause { - kw<"in"> (PinExpression | HashPattern | PatternBinding | expression) statement* + kw<"in"> (PinExpression | HashPattern | FindPattern | PatternBinding | expression) statement* } +// Find pattern for pattern matching: [*, value, *], [*pre, value, *post] +// Must start with * to unambiguously distinguish from regular Array. +FindPattern { "[" "*" Identifier? ("," findPatternElement)* "]" } +findPatternElement { "*" Identifier? | expression } + // Pattern binding: match a type and bind to a variable (e.g., Integer => n) PatternBinding { expression "=>" Identifier } From 00c227589686c03dafad14981cd6080c0016d7f0 Mon Sep 17 00:00:00 2001 From: jeanpaulsio Date: Thu, 26 Mar 2026 20:11:50 -0700 Subject: [PATCH 4/4] chore: bump to 0.4.0, fix auto-indent, update docs and demo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix rubyIndentService to use cx.lineAt() instead of raw doc access, so auto-indent on Enter respects simulateBreak - Update README: add new features to "What's supported", remove stale limitations (symbol-key shorthand, ::TopLevel, hash/find patterns), add guard clause limitation, update Rails benchmark 94.2% → 94.3% - Rebuild demo for GitHub Pages - Bump version to 0.4.0 --- CHANGELOG.md | 17 ++++++ README.md | 10 ++-- demo/demo.js | 158 +++++++++++++++++++++++++++++---------------------- package.json | 2 +- src/index.ts | 120 +++++++++++++++++++++++--------------- 5 files changed, 187 insertions(+), 120 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e42800..c98e91f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,23 @@ All notable changes to this project will be documented in this file. This project follows [Semantic Versioning](https://semver.org/). +## [0.4.0] - 2026-03-26 + +### Added + +- **`::TopLevel` leading scope resolution** — `::TopLevel`, `::TopLevel::Foo`, and `::Foo.bar` now parse correctly. Class/module definitions with leading `::` also supported. +- **Hash patterns in `case/in`** — Pattern matching now supports `in {name: String => n}` and `in {name:}` shorthand via new `HashPattern` rule. +- **Find patterns in `case/in`** — Pattern matching now supports `in [*, 2, *]` and `in [*pre, value, *post]` via new `FindPattern` rule. + +### Fixed + +- **Auto-indent on Enter** — The indent service now uses `IndentContext.lineAt()` instead of raw document access, correctly respecting `simulateBreak` for real-time indent-on-Enter behavior. +- Rails parse accuracy improved from 94.2% to 94.3%. + +### Changed + +- Known limitations updated: removed fixed items (`::TopLevel`, hash patterns, find patterns), added guard clause limitation explanation. + ## [0.3.0] - 2026-03-26 ### Added diff --git a/README.md b/README.md index fc86bd2..3ce43ab 100644 --- a/README.md +++ b/README.md @@ -35,20 +35,20 @@ Tested against popular open source Ruby projects (large, representative files): | [Devise](https://github.com/heartcombo/devise) | devise.rb | 534 | **98.1%** | | [Jekyll](https://github.com/jekyll/jekyll) | site.rb | 577 | **97.6%** | | [Fastlane](https://github.com/fastlane/fastlane) | runner.rb | 379 | **95.0%** | -| [Rails](https://github.com/rails/rails) | query_methods.rb | 2291 | **94.2%** | +| [Rails](https://github.com/rails/rails) | query_methods.rb | 2291 | **94.3%** | | [Grape](https://github.com/ruby-grape/grape) | api.rb | 166 | **94.0%** | | [Sidekiq](https://github.com/sidekiq/sidekiq) | config.rb | 321 | **93.5%** | ## What's supported - **Definitions**: methods (with params, endless `def f(x) = expr`), classes (with inheritance), modules -- **Control flow**: if/elsif/else, unless, while, until, for/in, case/when, case/in (pattern matching) +- **Control flow**: if/elsif/else, unless, while, until, for/in, case/when, case/in (pattern matching with pin operators, hash patterns, find patterns) - **Error handling**: begin/rescue/ensure/raise - **Strings**: single-quoted, double-quoted with `#{interpolation}`, heredocs (`<<~DELIM`), `%`-literals with any delimiter - **Literals**: integers, floats, symbols, character literals (`?a`), arrays, hashes, regex (`/pattern/flags`), nil, true, false - **Expressions**: assignment (including `||=`, `&&=`), multiple assignment (`a, b = 1, 2`), method calls (with receiver, args, splat `*args`/`**kwargs`/`&block`), chained calls, binary/unary/ternary operators, lambdas, ranges, conditional modifiers - **Blocks**: brace blocks and do/end blocks attached to method calls (`items.each { |x| x }`) -- **Operators**: proper precedence (`**` > `*`/`/` > `+`/`-` > comparison > logic), safe navigation (`&.`), scope resolution (`::`) +- **Operators**: proper precedence (`**` > `*`/`/` > `+`/`-` > comparison > logic), safe navigation (`&.`), scope resolution (`::` including leading `::TopLevel`) - **Bare method calls**: `puts "hello"`, `require "json"`, `attr_reader :name`, `include Comparable` (25 common Ruby methods) - **Variables**: local, `@instance`, `@@class`, `$global`, `Constants` - **Comments**: line `#` and block `=begin`/`=end` @@ -57,12 +57,10 @@ Tested against popular open source Ruby projects (large, representative files): ## Known limitations - **Heredocs as arguments or in chains** — `foo(<<~SQL)` and `<<~HEREDOC.strip` don't parse correctly. Heredocs assigned to variables (`x = <<~SQL`) work fine. The limitation is architectural: the heredoc body starts on the next line but the closing `)` or `.method` needs to be parsed on the current line, which requires a split-token approach not yet implemented. -- **Leading `::` scope resolution** — `::TopLevel` as a standalone expression doesn't parse. Scoped references with a receiver (`Foo::Bar`, `Foo::Bar::Baz`) work fine. -- **Advanced pattern matching** — Basic `case/in` with array patterns and pin operators work. Hash patterns (`in {name: String => n}`), guard clauses (`in x if x > 0`), and find patterns (`in [*, 2, *]`) are not yet supported. +- **Guard clauses in pattern matching** — `in x if x > 0` is not supported. The `if`/`unless` keyword conflicts with `IfStatement`/`ConditionalModifier` in the LR parser and cannot be resolved without an external tokenizer. - **Heredoc and `%`-literal bodies** are opaque tokens (no interpolation highlighting inside). - **Inline rescue as a standalone expression** — `value = foo rescue nil` works (rescue in assignments), but `foo rescue bar` as a standalone expression outside of assignment context is not supported. - **Newline as statement separator** — Ruby uses newlines to separate statements, but the grammar is whitespace-insensitive. An expression followed by `if` on the next line may be parsed as a conditional modifier (e.g., `x = 1\nif cond` parses as `x = (1 if cond)`). -- **Symbol-key shorthand in method calls** — `foo(name: "value")` with symbol-key syntax is not yet supported. Use rocket syntax `foo(:name => "value")` as a workaround. - **Line-based indentation** — The indent engine uses regex line scanning rather than tree-based analysis. Most patterns work well, but complex multi-line expressions (e.g., multi-line method args followed by a body, trailing commas inside nested delimiters) may not indent perfectly. ## Development diff --git a/demo/demo.js b/demo/demo.js index ae24330..990f171 100644 --- a/demo/demo.js +++ b/demo/demo.js @@ -27280,15 +27280,15 @@ PercentStringLiteral = 3, moduloOp = 4, Symbol$1 = 5, - colonOp = 210, + colonOp = 215, Heredoc = 6, lessThanOp = 7, lessThanEqOp = 8, - inheritsOp = 211, - shiftLeftOp = 212, + inheritsOp = 216, + shiftLeftOp = 217, greaterThanOp = 9, greaterThanEqOp = 10, - shiftRightOp = 213; + shiftRightOp = 218; // ============================================================ // Regex / Division external tokenizer (#7) @@ -27742,26 +27742,26 @@ } // This file was generated by lezer-generator. You probably shouldn't edit it. - const spec_Identifier = {__proto__:null,nil:78, true:80, false:82, self:84, return:86, yield:88, if:92, elsif:96, else:100, end:102, unless:106, case:110, when:114, in:118, begin:128, rescue:132, ensure:138, and:178, or:180, not:184, do:465, while:232, until:234, def:246, class:258, module:264, for:274, puts:289, print:291, p:293, warn:295, fail:297, require:299, require_relative:301, load:303, autoload:305, include:307, extend:309, prepend:311, attr_reader:313, attr_writer:315, attr_accessor:317, public:319, private:321, protected:323, module_function:325, alias:327, alias_method:329, using:331, throw:333, catch:335, gem:337, source:339, group:341, validates:343, validate:345, has_many:347, has_one:349, belongs_to:351, before_action:353, after_action:355, around_action:357, before_create:359, before_save:361, after_create:363, after_save:365, render:367, redirect_to:369, delegate:371, scope:373, enum:375, task:377, desc:379, namespace:381, raise:383, super:471}; + const spec_Identifier = {__proto__:null,nil:78, true:80, false:82, self:84, return:86, yield:88, if:92, elsif:96, else:100, end:102, unless:106, case:110, when:114, in:118, begin:136, rescue:140, ensure:146, and:184, or:186, not:190, do:477, while:238, until:240, def:252, class:264, module:270, for:280, puts:295, print:297, p:299, warn:301, fail:303, require:305, require_relative:307, load:309, autoload:311, include:313, extend:315, prepend:317, attr_reader:319, attr_writer:321, attr_accessor:323, public:325, private:327, protected:329, module_function:331, alias:333, alias_method:335, using:337, throw:339, catch:341, gem:343, source:345, group:347, validates:349, validate:351, has_many:353, has_one:355, belongs_to:357, before_action:359, after_action:361, around_action:363, before_create:365, before_save:367, after_create:369, after_save:371, render:373, redirect_to:375, delegate:377, scope:379, enum:381, task:383, desc:385, namespace:387, raise:389, super:483}; const parser = LRParser.deserialize({ version: 14, - states: "!9pQcQ#mOOO'_O&jO'#CsO'mQ#mO'#C}O/{Q#mO'#DQO7gQ&cO'#CjO8TQ&cO'#HPO@TQ&cO'#HPO@[Q#mO'#EZODtQ#mO'#E^OOQ#l'#Em'#EmOD{QPO'#E`OMZQ&cO'#HPOOQ&b'#HP'#HPO!'_Q&cO'#HPOEZQ&cO'#HPO!-{QPO'#F`O!.QQPO'#F_OOQ#l'#Ge'#GeO!.VQ#mO'#GdOOQ#l'#HO'#HOOOQ#l'#Gf'#GfQcQ#mOOO@[Q#mO'#DZO@[Q#mO'#DbO!0lQ#mO'#DdO!7RQ#mO'#DmO!=XQ#mO'#ElO!>gQ%YO'#EzO!>qQPO'#FQO!>qQPO'#FTO@[Q#mO'#FWO@[Q#mO'#FXO!>vQPO'#FYO!.VQ#mO'#FaOBhQ#mO'#CuOOOO'#Gg'#GgO!>{O&jO,59_OOQ&b,59_,59_O!AaQ%qO'#HSO!AkQPO,59iO!IpQ&cO'#HPO!JQQ&cO'#CjO##lQ&cO'#HPO#3UQ&cO,59lO#4hQPO,59lO#4pQPO'#EjO#4{Q#mO,5;TO#4{Q#mO,5;TO#5SQPO,5:`O#5[QPO,5:`O@[Q#mO,5:nO@[Q#mO,5:nO@[Q#mO,5:nO@[Q#mO,5:nO@[Q#mO,5:nO@[Q#mO,5:nO@[Q#mO,5:nO#5aQ#mO'#EiO@[Q#mO,5;YOBhQ#mO,5;]O#5kQPO,5;bO'mQ#mO,5;dOOQ&b,5;e,5;eO@[Q#mO,5;_O#8YQ#mO'#DxOOQ&b,5:`,5:`O@[Q#mO,5;vO#?}Q&cO,5:uO#@hQ%qO,5:xOBhQ#mO'#E_O#@rQPO,5:xO#@wQPO'#EbO#AYQPO,5:zOOQ&b,5:z,5:zOOQO,5;z,5;zO#AbQPO'#GtO#AvQQO,5;yO@[Q#mO'#DzO@[Q#mO'#D|O@[Q#mO'#EOO#BOQ&cO'#HPOOQ#l'#Dy'#DyO#D]Q&cO'#DyO#JZQ#mO'#H`OOQ#l,5=O,5=OOOQ#l-E:d-E:dO$*VQ&cO,59uO$1hQ&cO,59|OOQO'#Gk'#GkO$2OQPO,5:OOOQO'#Gl'#GlO$2ZQPO,5:OO$2fQ%qO,5:OO$8rQ#mO'#D_O@[Q#mO'#DfO$8|Q#mO'#DhOOQ&b,5:O,5:OO$9TQPO,5:OOOQO'#Gm'#GmO$9YQPO,5:XO$9hQ#mO,5:XO$?hQ#mO'#DoO$@OQ#mO'#DrOOQ&b,5:X,5:XO$@VQPO,5:XO$@[QPO,5:XO$@dQ#mO,5;WOOQ&b,5;W,5;WO$@dQ#mO,5;WOOQO'#E}'#E}O$FsQ#pO,5;fO$FzQPO,5;fO$GPQPO,5;fO$GUQ#mO'#H_O$MZQ#mO,5;lO$MeQ#mO,5;oO$MlQ&cO,5;rO$NPQ&cO,5;sO$NdQPO,5;tOOQ#l,5;{,5;{O$NiQ%qO,59aOOOO-E:e-E:eOOQ&b1G.y1G.yO$NpQ#mO,5=nO$NwQPO,5=nO% PQPO,5:`OOQ&b1G/T1G/TOBhQ#mO,59mO%#eQ#mO1G/WO%#lQPO1G/WOOQ&b1G/W1G/WO%#tQPO'#EkOOQO'#H['#H[O%#|QPO'#HZO%$UQPO,5;UOOQ&b1G0o1G0oO%$ZQ#mO1G0oO%&zQ&cO1G/zOOQ&b1G/z1G/zO%4fQ&cO1G0YO%PQ&cO,5:hO&C}Q&cO,5:jO@[Q#mO,5:lO!.VQ#mO'#GoO&I{Q#mO,5=zOOQO'#Gj'#GjO'!gQPO1G/aO@[Q#mO,5:nO'${Q#mO,5:nO'+OQ#mO1G/aO@[Q#mO'#D]O@[Q#mO,5;_OOQ&b1G/a1G/aO'!mQPO1G/aO@[Q#mO,5;_O@[Q#mO,5;_O@[Q#mO,5;_O'+]Q#mO1G/hOOQ&b1G/h1G/hO'+gQPO1G/hOOQO-E:i-E:iOOQ&b1G/j1G/jO'+lQPO1G/jOOQO-E:j-E:jO'+qQPO1G/jO'+|QPO1G/jO',XQ#mO,59yO',cQ&cO'#HTO'1}Q#mO,5:QO@[Q#mO'#DjO'9]Q&cO,5:SO'?xQ#mO,5:SOOQO-E:k-E:kOOQ&b1G/s1G/sO'@VQPO1G/sO'@[QPO1G/sO'@dQPO1G/sO'HfQ&cO'#DqO'NsQPO'#DqO'NxQ#mO,5:ZO'NxQ#mO,5:ZO( ]Q#mO,5:^OOQ&b1G0r1G0rO( dQ#mO1G0rO( kQPO'#E|O($SQ#mO'#E^OOQO'#E|'#E|O( qQPO'#E|O($gQ#mO'#E|O($nQ#pO1G1QO($xQPO1G1QO$GPQPO1G1QO($}Q%YO1G1QO($qQ#mO1G1QO(%UQPO'#GsO(%ZQ#mO,5=yO(+`Q#mO'#FSO(+gQPO1G1WO!>qQPO1G1WO(+lQ#mO'#FVO(+sQPO1G1ZO(+xQ#mO1G1^O(,PQ#mO1G1^OOQ#l1G1^1G1^O(,WQ#mO1G1_O(,_Q#mO1G1_OOQ#l1G1_1G1_O@[Q#mO1G1`OOOO'#Cw'#CwOOOO1G.{1G.{O(,fQ%qO,5=SO(,sQ#mO1G3YOOQ#l-E:f-E:fO(,zQ&cO1G/zO(-_Q%qO1G/XO(-iQ%qO'#DRO(/|Q&cO'#HPOOQO,5=T,5=TOOQ&b7+$r7+$rO(0TQ#mO7+$rOOQO-E:g-E:gO(0[QPO'#H]O(0dQPO,5;VO(0iQPO,5=uO(0tQPO,5=uOOQ#l1G0p1G0pOOQ&b7+&Z7+&ZOOQ&b7+%f7+%fO@[Q#mO7+&|O@[Q#mO7+&cOOQ&b7+&j7+&jO(0|Q#mO,5=pO(1TQPO,5=pOOQ&b1G0O1G0OO@[Q#mO,5;xOOQ&b7+&O7+&OO(1]Q#mO7+&OOOQO,5;O,5;OOOQO,5;P,5;POOQO,5;Q,5;QO(1dQ#mO,5;ROBhQ#mO,5;SO(1nQPO,5=sO(2PQPO,5=sOOQ#l1G0h1G0hO(2XQ&cO7+'PO(8VQ&cO1G0WOOQ#l,5=Z,5=ZOOQ#l-E:m-E:mOOQO-E:h-E:hOOQ&b7+${7+${O(>TQPO7+${O(>YQ&cO1G0YO(>aQ&cO,5;zO(C{QPO7+${O(DWQ&cO,59wO(K{Q&cO1G0yO)%gQ&cO1G0yO)%qQ&cO1G0yO)%qQ&cO1G0yOOQ&b7+%S7+%SO)%{QPO7+%SOOQ&b7+%U7+%UO)&QQPO7+%UO@[Q#mO'#GhO)&VQ#mO,5=oO),_Q#mO1G/lO),lQ&cO,5:UO)2TQPO,5:WO)2YQ#mO1G/nOOQ&b7+%_7+%_O)2gQPO7+%_O)2lQPO7+%_O)2tQPO'#GnO)2yQ#mO,5:]O)9XQPO,5:]OOQ#l,5:],5:]O)9^Q#mO1G/uOOQ&b7+&^7+&^OOQO,5;h,5;hO)9qQPO,5;hO)oQ%qO,5;QO*>yQPO1G1SOOQ#l<RAN>ROOQ&bAN>eAN>eOOQ#l7+%c7+%cOOQO7+&n7+&nOOQ#lAN?rAN?rO+'lQPOAN?rO@[Q#mOAN?rOOQ#lAN?xAN?xOOQ#lAN@QAN@QO+'qQ#mOAN@QO+/YQ&cOAN@QP+/gQPO'#GqOOQ#lG25^G25^O+/lQ&cOG25^O+iQ%qO1G0WO,>sQ&cO1G0YO,K{Q&cO1G0YO,LVQ&cO1G0YO,LaQ&cO1G0yO,LhQ&cO1G0yO-$oQ&cO1G0yPBhQ#mO'#GhO-*sQ&cO7+&xP-+aQ&cO7+&xO-+tQ&cO7+&xO-,XQ&cO7+&xO-,iQ&cO7+&yP--VQ&cO7+&yO--jQ&cO7+&yO--}Q&cO7+&yO-0RQ&cO<^Q&cO1G0yO-DhQ&cO1G0yO-JlQ&cO1G0yO-DhQ&cO1G0yO-JlQ&cO1G0yO.!mQ#mO7+&xP.!tQ#mO7+&xO.!{Q#mO7+&xO.#SQ#mO7+&xO.#ZQ#mO7+&yP.#bQ#mO7+&yO.#iQ#mO7+&yO.#pQ#mO7+&yO.#wQ#mO<Y>gP>gP>gP>gP,xPPPPPP,xPP(f>p(fP>t?W?a?a?a?a?a?hDnEV?hE],xPP,xP,xPPJqPJq,x! fP!#b!#qPP! fP!#w! fP!#}&U&U! fP&UP!$Q&U!$U! fPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP! f!&i!(e!,Z!,a!,s!,y!-W!-b!-l!.U!.[!.f!.l!.r!.x!/OPPPPPPPPP!/U!1fPP!:X!:_!:bPP!:eP!:i!:l!:tP!:w!;Q%mcOReij!O!P!Z!x!y#P#W#X#Y#^#`#b#f#g#h#i#|$|%U%_%a%c%d%l%m%n%p%u%v%z%}&Q&S&T&V&W'[']'^'_'`'g'j'r'|'}(S(V(Y([(r)S)T)X)Y)j*]*^*_*t*u*v*w+_+`+a+b+c+d+e+f+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y,O,P,Q,R,S,T,^,_,`,a,c,d)c[OQRVWbefghijnoqr!O!P!S!T!U!V!W!X!Y!Z![!]!_!a!b!d!g!o!p!q!x!y#P#Q#R#W#X#Y#^#`#b#f#g#h#i#o#s#t#|$b$q$u$v$z${$|$}%O%R%S%T%U%_%a%b%c%d%l%m%n%p%r%u%v%z%}&Q&S&T&V&W&Y&^&f&o&p&r&u&w&{&|'['e'g'j'r'w'z'|'}(S(V(Y([(^(g(r)S)T)X)Y)g)j*V*`*t*u*v*w*x*y*z*{*|*}+O+P+Q+R+S+T+U+V+W+X+Y+Z+[+]+^+_+`+a+b+c+d+e+f+g+o+p+q+r+s+t+u+v+w+x,O,P,Q,R,S,T,V,W,X,Y,Z,[,],a,b,e,f,g,h,i,j,k,l,m,n,o,p,qTsPtR&[#l*][OQRVWbefghijnoqr!O!P!S!T!U!V!W!X!Y!Z![!]!_!a!b!d!g!o!p!q!x!y#P#Q#R#W#X#Y#^#`#b#f#g#h#i#o#s#t#|$b$q$u$v$z${$|$}%O%R%S%T%U%_%a%b%c%d%l%m%n%p%r%u%v%z%}&Q&S&T&V&W&Y&^&f&o&p&r&u&w&{&|'[']'^'_'`'e'g'j'r'w'z'|'}(S(V(Y([(^(g(r)S)T)X)Y)g)j*V*]*^*_*`*t*u*v*w*x*y*z*{*|*}+O+P+Q+R+S+T+U+V+W+X+Y+Z+[+]+^+_+`+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,O,P,Q,R,S,T,V,W,X,Y,Z,[,],^,_,`,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,qY|R*t*u*v*wV&d#t&f(^%n[QVWbfghnoqr!S!T!U!V!W!X!Y![!]!_!a!b!d!g!o!p!q#Q#R#o#s#t$b$q$u$v$z${$}%O%R%S%T%b%r&Y&^&f&o&p&r&u&w&{&|'e'w'z(^(g)g*V*`*x*y*z*{*|*}+O+P+Q+R+S+T+U+V+W+X+Y+Z+[+]+^+g,V,W,X,Y,Z,[,],b,e,f,g,h,i,j,k,l,m,n,o,p,q%m]OReij!O!P!Z!x!y#P#W#X#Y#^#`#b#f#g#h#i#|$|%U%_%a%c%d%l%m%n%p%u%v%z%}&Q&S&T&V&W'[']'^'_'`'g'j'r'|'}(S(V(Y([(r)S)T)X)Y)j*]*^*_*t*u*v*w+_+`+a+b+c+d+e+f+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y,O,P,Q,R,S,T,^,_,`,a,c,d_$x!x$y$|'Z*]*^+yQ#ThQ#]iS%Q!x*^S%W!y*_U%Z!{!}#OS%h#V#W^%t#b%v%z'|'})S)TS'W$y$|Q'b%US'd%]%^Q'm%iS'u%q%uQ(q'ZR)O'x%n[QVWbfghnoqr!S!T!U!V!W!X!Y![!]!_!a!b!d!g!o!p!q#Q#R#o#s#t$b$q$u$v$z${$}%O%R%S%T%b%r&Y&^&f&o&p&r&u&w&{&|'e'w'z(^(g)g*V*`*x*y*z*{*|*}+O+P+Q+R+S+T+U+V+W+X+Y+Z+[+]+^+g,V,W,X,Y,Z,[,],b,e,f,g,h,i,j,k,l,m,n,o,p,q$s]OReij!O!P!Z!x!y#P#W#X#Y#^#`#b#f#g#h#i#|$|%U%_%a%c%d%l%m%n%p%u%v%z%}&Q&S&T&V&W'['g'j'r'|'}(S(V(Y([(r)S)T)X)Y)j*t*u*v*w+_+`+a+b+c+d+e+f+o+p+q+r+s+t+u+v+w+x,O,P,Q,R,S,T,aX!zh!{#O%]X!|h!}#O%^R%d#Rm#Ui#V#W#b%i%q%u%v%z'x'|'})S)TR%m#XQ#[iU%g#V#W#]^%s#b%v%z'|'})S)TS'l%h%iU't%q%t%uQ(w'mS(|'u'xR)d)Oh!cTUxz!r%j&c'Y'v(}+z+}U$O!Q#q)wR&n&`S!ubqQ$^!bX'S$v&r(g*V_!sbq!b$v&r(g*VT!hW%rQ!jYQ%v#bQ%z#dQ'|%xQ)S'}R)T(OS$k!i%rV(l&}(m)`Z$j!i%r&}(m)`(t[OQRVWbefghijnoqr!O!P!S!T!U!V!W!X!Y!Z![!]!_!a!b!d!g!o!p!q#P#Q#R#W#X#Y#^#`#b#f#g#o#s#t#|$b$q$u$v$z${$|$}%O%R%S%T%U%_%a%b%d%l%m%n%p%r%u%v%z%}&Q&S&T&V&W&Y&^&f&o&p&r&u&w&{&|'e'g'j'r'w'z'|'}(S(V(Y(^(g(r)S)T)X)Y)g)j*V*`*t*u*v*w*x*y*z*{*|*}+O+P+Q+R+S+T+U+V+W+X+Y+Z+[+]+^+_+`+a+b+c+d+e+f+g+o+p+q+r+s+t+u+v+w+x,V,W,X,Y,Z,[,],b,e,f,g,h,i,j,k,l,m,n,o,p,q#Q!`Svy!f!t!x!y#O#h#i#l$Y$`$e$r$s$t%`%c&]&a&b'Q'R'['h([(h(j(k)Q)n)v*R*S*T*U*W*X,O,P,Q,R,S,T,U,aQ!kYR$m!j[!PR!Z*t*u*v*wk#`j&T&W)Y+_+`+a+b+c+d+e+f+wX#x}&j(c)_*fjOQRSVWYbefghijnoqrvy!O!P!S!T!U!V!W!X!Y!Z![!]!_!a!b!d!f!g!j!o!p!q!t!x!y#O#P#Q#R#W#X#Y#^#`#b#f#g#l#o#s#t#|$Y$`$b$e$q$r$s$t$u$v$z${$|$}%O%R%S%T%U%_%`%a%b%c%d%l%m%n%p%r%u%v%z%}&Q&S&T&V&W&Y&]&^&a&b&f&o&p&r&u&w&{&|'Q'R'['e'g'h'j'r'w'z'|'}(S(V(Y(^(g(h(j(k(r)Q)S)T)X)Y)g)j)n)v*R*S*T*U*V*W*X*`*t*u*v*w*x*y*z*{*|*}+O+P+Q+R+S+T+U+V+W+X+Y+Z+[+]+^+_+`+a+b+c+d+e+f+g+o+p+q+r+s+t+u+v+w+x,U,V,W,X,Y,Z,[,],b,e,f,g,h,i,j,k,l,m,n,o,p,qQ&T#hQ&W#iQ)Y([Q+_,OQ+a,QQ+b,PQ+c,RQ+e,TQ+f,SR+w,a%n[QVWbfghnoqr!S!T!U!V!W!X!Y![!]!_!a!b!d!g!o!p!q#Q#R#o#s#t$b$q$u$v$z${$}%O%R%S%T%b%r&Y&^&f&o&p&r&u&w&{&|'e'w'z(^(g)g*V*`*x*y*z*{*|*}+O+P+Q+R+S+T+U+V+W+X+Y+Z+[+]+^+g,V,W,X,Y,Z,[,],b,e,f,g,h,i,j,k,l,m,n,o,p,q%O^ORej!O!P!Z!x!y#P#Y#^#`#f#g#h#i#|$|%U%_%a%c%d%n%p%}&Q&S&T&V&W'[']'^'_'`'g'j(S(V(Y([(r)X)Y)j*]*^*_*t*u*v*w+_+`+a+b+c+d+e+f+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y,O,P,Q,R,S,T,^,_,`,a,c,dm+|i#W#X#b%l%m%u%v%z'r'|'})S)T$scOReij!O!P!Z!x!y#P#W#X#Y#^#`#b#f#g#h#i#|$|%U%_%a%c%d%l%m%n%p%u%v%z%}&Q&S&T&V&W'['g'j'r'|'}(S(V(Y([(r)S)T)X)Y)j*t*u*v*w+_+`+a+b+c+d+e+f+o+p+q+r+s+t+u+v+w+x,O,P,Q,R,S,T,aQ%w#bS'y%v%zS)R'|'}T)f)S)TQ#dkR(O%yQ&O#fR)U(SR&R#gT$a!d+S%l`OReij!O!P!Z!x!y#P#W#X#Y#^#`#b#f#g#h#i#|$|%U%_%a%c%d%l%m%n%p%u%v%z%}&Q&S&T&V&W'[']'^'_'`'g'j'r'|'}(S(V(Y([(r)S)T)X)Y)j*]*^*_*t*u*v*w+_+`+a+b+c+d+e+f+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y,O,P,Q,R,S,T,^,_,`,a,c,dR$o!m$sbOReij!O!P!Z!x!y#P#W#X#Y#^#`#b#f#g#h#i#|$|%U%_%a%c%d%l%m%n%p%u%v%z%}&Q&S&T&V&W'['g'j'r'|'}(S(V(Y([(r)S)T)X)Y)j*t*u*v*w+_+`+a+b+c+d+e+f+o+p+q+r+s+t+u+v+w+x,O,P,Q,R,S,T,aQeO[!OR!Z*t*u*v*w!d!we!O#W#^#|$|%U%_%l%n%p%u%}&Q&S&V'g'j'r(V(Y(r)X)j+o+p+q+r+s+t+u+v+xQ#WiQ#^jQ#|!P[$|!x']*]*^+h+y[%U!y'^*_+i+j,^Q%_#PQ%l#XQ%n#YQ%p#`^%u#b%v%z'|'})S)TS%}#f(SQ&Q#gb&S#h'_+k+l,O,P,Q,_,cb&V#i'`+m+n,R,S,T,`,dQ'g%aS'j%c%dQ'r%mQ(V&TQ(Y&WQ(r'[S)X([,aQ)j)YQ+o+_Q+p+`Q+q+aQ+r+bQ+s+cQ+t+dQ+u+eQ+v+fR+x+wQtPR#mtQ#pvQ$c!fW&_#p$c'f(oQ'f%`R(o'QQ#u|R&g#uW$y!x*]*^+yS'U$y'ZR'Z$|Q!{hS%X!{%]R%]#OQ!}hS%[!}%^R%^#OQ#ViW%e#V%i%q'xQ%i#W^%q#b%v%z'|'})S)TR'x%uQ'o%jR(y'oQ$w!uQ&s$^T'T$w&sQ'O$kR(n'OQ(`&hR)^(`Q&k#yR(d&kQ%|#eR(Q%|Q!n`R$p!n%mdOReij!O!P!Z!x!y#P#W#X#Y#^#`#b#f#g#h#i#|$|%U%_%a%c%d%l%m%n%p%u%v%z%}&Q&S&T&V&W'[']'^'_'`'g'j'r'|'}(S(V(Y([(r)S)T)X)Y)j*]*^*_*t*u*v*w+_+`+a+b+c+d+e+f+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y,O,P,Q,R,S,T,^,_,`,a,c,d%bSOeij!O!P!Z!x!y#P#W#X#Y#^#`#b#f#g#h#i#|$|%U%_%a%c%d%l%m%n%p%u%v%z%}&Q&S&T&V&W'[']'^'_'`'g'j'r'|'}(S(V(Y([(r)S)T)X)Y)j*]*^*_+_+`+a+b+c+d+e+f+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y,O,P,Q,R,S,T,^,_,`,a,c,dSvQ!_YyR*t*u*v*wQ!eVS!fW%rU!tbq$vQ!xfQ!ygQ#OhQ#hnQ#ioQ#lrQ$P!SS$Q!T${Q$R!UQ$S!VQ$T!WQ$U!XQ$V!YQ$X![Q$Y!]Q$]!aQ$`!dS$e!g'wQ$r!oQ$s!pQ$t!qQ%`#QQ%c#RY&]#o$b&^&w*`Q&a#sU&b#t&f(^Q'Q$qQ'R$uQ'X$zQ'[$}Q']%OQ'^%RQ'_%SQ'`%TQ'h%bQ([&YQ(e&oQ(f&pQ(h&uQ(j&{Q(k&|Q)Q'zQ)n)gQ)u*xW)v!b&r(g*VQ)x*yQ)y*zQ)z*{Q){*|Q)|*}Q)}+OQ*O+PQ*P+QQ*Q+RQ*R+SQ*S+TQ*T+UQ*U+VQ*W'eQ*X+WQ*Y+XQ*Z+YQ*[+ZQ*]+[Q*^+]Q*_+^Q*i+gQ+h,VQ+i,WQ+j,XQ+k,YQ+l,ZQ+m,[Q+n,]Q+y,bQ,O,eQ,P,fQ,Q,gQ,R,hQ,S,iQ,T,jQ,U,kQ,^,lQ,_,mQ,`,nQ,a,oQ,c,pR,d,qQwQR$[!_R%a#QR$_!bT$l!i%rR#z}Q#y}V(b&j(c)_R&i#wQ#flQ#gmR(S&PQ!vbR#kq", - nodeNames: "⚠ Regex ArithOp PercentStringLiteral ArithOp Symbol Heredoc CompareOp CompareOp CompareOp CompareOp LineComment BlockComment Program ExpressionStatement Identifier InstanceVariable ClassVariable GlobalVariable Constant Integer Float SingleQuotedString InterpolatedString } Interpolation InterpolationStart InterpolationEnd StringEscape StringContent CharacterLiteral ] [ Array , { Hash HashPair => nil true false self return yield IfStatement if ElsifClause elsif ElseClause else end UnlessStatement unless CaseStatement case WhenClause when InClause in PinExpression ^ PatternBinding BeginBlock begin RescueClause rescue ExceptionList EnsureClause ensure MethodCall . ) ( ArgList Arg SplatArg * DoubleSplatArg ** BlockArg & KeywordArg &. BinaryExpression ArithOp | CompareOp LogicOp and or UnaryExpression not ~ ParenExpression BlockPassExpression Lambda -> ParamList Param SplatParam DoubleSplatParam BlockParam KeywordParam DefaultParam Block BlockParams DestructuredParam DoBlock do Range .. ... TernaryExpression ? ConditionalModifier while until ScopeResolution :: SubscriptExpression BlockCall MethodDef def MethodBody OperatorMethodName [] []= ClassDef class ClassBody ModuleDef module ModuleBody WhileStatement UntilStatement ForStatement for Assignment AssignOp InlineRescue MultipleAssignment AssignmentTarget BareMethodCall puts print p warn fail require require_relative load autoload include extend prepend attr_reader attr_writer attr_accessor public private protected module_function alias alias_method using throw catch gem source group validates validate has_many has_one belongs_to before_action after_action around_action before_create before_save after_create after_save render redirect_to delegate scope enum task desc namespace raise Super super", - maxTerm: 235, + states: "!?QQcQ#mOOO'bO&jO'#CsO'pQ#mO'#C}O0UQ#mO'#DQO7pQ&cO'#CjO8^Q&cO'#HUO@^Q&cO'#HUO@eQ#mO'#E^OETQ#mO'#EaOOQ#l'#Ep'#EpOE[QPO'#EcOEjQPO'#EyOMrQ&cO'#HUOOQ&b'#HU'#HUO!'vQ&cO'#HUOErQ&cO'#HUO!.gQPO'#FcO!.lQPO'#FbOOQ#l'#Gh'#GhO!.qQ#mO'#GgOOQ#l'#HT'#HTOOQ#l'#Gi'#GiQcQ#mOOO@eQ#mO'#DZO@eQ#mO'#DbO!1ZQ#mO'#DdO!7sQ#mO'#DqO!=|Q#mO'#EoO!?[Q%YO'#E}O!?fQPO'#FTO!?fQPO'#FWO@eQ#mO'#FZO@eQ#mO'#F[O!?nQPO'#F]O!.qQ#mO'#FdOBtQ#mO'#CuOOOO'#Gj'#GjO!?sO&jO,59_OOQ&b,59_,59_O!BXQ%qO'#HXO!BcQPO,59iO!JhQ&cO'#HUO!JxQ&cO'#CjO#$mQ&cO'#HUO#3|Q&cO,59lO#5`QPO,59lO#5hQPO'#EmO#5sQ#mO,5;WO#5sQ#mO,5;WO#5zQPO,5:dO#6SQPO,5:dO@eQ#mO,5:qO@eQ#mO,5:qO@eQ#mO,5:qO@eQ#mO,5:qO@eQ#mO,5:qO@eQ#mO,5:qO@eQ#mO,5:qO#6XQ#mO'#ElO@eQ#mO,5;]OBtQ#mO,5;`O#6cQPO,5;eO'pQ#mO,5;gOOQ&b,5;h,5;hO@eQ#mO,5;bO#9TQ#mO'#D|OOQ&b,5:d,5:dO@eQ#mO,5;yO#@xQ&cO,5:xO#AcQ%qO,5:{OBtQ#mO'#EbO#AmQPO,5:{O#ArQPO'#EeO#BTQPO,5:}OOQ&b,5:},5:}OOQ&b,5;e,5;eOOQO,5;},5;}O#B]QPO'#GyO#BqQQO,5;|O@eQ#mO'#EOO@eQ#mO'#EPO@eQ#mO'#ERO#ByQ&cO'#HUOOQ#l'#D}'#D}O#EWQ&cO'#D}O#KUQ#mO'#HfOOQ#l,5=R,5=ROOQ#l-E:g-E:gO$+TQ&cO,59uO$2fQ&cO,59|OOQO'#Gn'#GnO$2|QPO,5:OOOQO'#Go'#GoO$3XQPO,5:OO$3dQ%qO,5:OO$9sQ#mO'#D_O@eQ#mO'#DfO$QOOQO'#Gm'#GmO'&]QPO1G/aO@eQ#mO,5:qO'(tQ#mO,5:qO'({QPO,5;eO'/SQ#mO1G/aO@eQ#mO'#D]O@eQ#mO,5;bOOQ&b1G/a1G/aO'&cQPO1G/aO@eQ#mO,5;bO@eQ#mO,5;bO@eQ#mO,5;bO'/aQ#mO1G/hOOQ&b1G/h1G/hO'/kQPO1G/hOOQO-E:l-E:lOOQ&b1G/j1G/jO'/pQPO1G/jOOQO-E:m-E:mO'/uQPO1G/jO'0QQPO1G/jO'0]Q#mO,59yO'0gQ&cO'#HYO'6RQ#mO,5:QO'6`Q#mO'#C}O'PO(/xQ#mO,5>PO(6QQ#mO'#FVO(6XQPO1G1ZO!?fQPO1G1ZO(6^Q#mO'#FYO(6eQPO1G1^O(6jQ#mO1G1aO(6qQ#mO1G1aOOQ#l1G1a1G1aO(6xQ#mO1G1bO(7PQ#mO1G1bOOQ#l1G1b1G1bO@eQ#mO1G1cOOOO'#Cw'#CwOOOO1G.{1G.{O(7WQ%qO,5=VO(7eQ#mO1G3_OOQ#l-E:i-E:iO(7lQ&cO1G0OO(8PQ%qO1G/XO(8ZQ%qO'#DRO(:nQ&cO'#HUOOQO,5=W,5=WOOQ&b7+$r7+$rO(:uQ#mO7+$rOOQO-E:j-E:jO(:|QPO'#HcO(;UQPO,5;YO(;ZQPO,5={O(;fQPO,5={OOQ#l1G0s1G0sOOQ&b7+&^7+&^OOQ&b7+%j7+%jO@eQ#mO7+'PO@eQ#mO7+&fOOQ&b7+&m7+&mO(;nQ#mO,5=vO(;uQPO,5=vOOQ&b1G0S1G0SO@eQ#mO,5;{OOQ&b7+&R7+&RO(;}Q#mO7+&ROOQO,5;R,5;ROOQO,5;S,5;SOOQO,5;T,5;TO(vQ#mO1G/lO)?TQPO,5:YO)?`Q&cO'#HUO)?gQ&cO,59lO)EqQPO,5:WO)EyQ&cO,5:UO)KbQPO,5:[O)KgQ#mO1G/nOOQ&b7+%c7+%cO)KtQPO7+%cO)KyQPO7+%cO)LRQPO'#GsO)LWQ#mO,5:aO*$iQPO,5:aOOQ#l,5:a,5:aO*$nQ#mO1G/yOOQ&b7+&a7+&aOOQO,5;k,5;kO*%RQPO,5;kO*'jQ&fO'#EfO*'zQ#mO'#EbO*(RQPO,5;kO*(aQPO7+&oO@eQ#mO7+&oOOQ#l7+&o7+&oO(/`Q#mO7+&oO$DOQ#mO7+&oO$JgQPO7+&oOOQ#l,5=d,5=dOOQ#l-E:v-E:vO*(fQ#mO1G3kOOQ#l7+&u7+&uO%!|Q#mO7+&uOOQ#l7+&x7+&xOOQ#l7+&{7+&{O*.nQ#mO7+&{O*6VQ&cO7+&{OOQ#l7+&|7+&|O*6dQ#mO7+&|O*={Q&cO7+&|O*>YQ&cO7+&}OOQ&b<mQPO,5=}O*>uQPO,5=}OOQO1G0t1G0tOOQO,5=c,5=cO*>}QPO1G3gOOQO-E:u-E:uO*@mQ&cO<RAN>RO+HVQPO'#HZO+HbQ%qO'#HZOOQO,5=],5=]OOQO-E:o-E:oOOQ#l7+%`7+%`O+HlQPO7+%`O+HtQ%qO1G/XO+IXQqO'#DmOOQO,5=[,5=[OOQ#l7+%^7+%^O+I^QPO7+%^OOQO-E:n-E:nOOQ&bAN>iAN>iOOQ#l7+%g7+%gOOQO7+&q7+&qOOQ#lAN?uAN?uO+IfQPOAN?uO@eQ#mOAN?uOOQ#lAN?{AN?{OOQ#lAN@TAN@TO+IkQ#mOAN@TO,#SQ&cOAN@TP,#aQPO'#GvOOQO,5=u,5=uOOQ#l<YQ&cO7+&}O@eQ#mO,5;bO/7qQ&cO1G0|O/7qQ&cO1G0|O@eQ#mO'#FZO@eQ#mO'#FZO@eQ#mO'#FZO@eQ#mO'#F[O@eQ#mO'#F[O@eQ#mO'#F[OBtQ#mO,5;`O@eQ#mO,5;bO@eQ#mO,5;bO@eQ#mO,5;bO@eQ#mO1G1cO@eQ#mO,5;bO@eQ#mO,5;bO/>OQPO,5;wO/>TQPO'#F]", + stateData: "/>v~O%tOS%uOS%vOSZOS[OS~OP]OR]OT]OU]O_TO`[Oa[Ob[OcUOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!c`O!fjO!oWO!zVO#RVO#SVO#WYO#koO#lpO#nZO#rlO#xmO#{nO$QqO$XrO$YrO$ZrO$[rO$]rO$^rO$_rO$`rO$arO$brO$crO$drO$erO$frO$grO$hrO$irO$jrO$krO$lrO$mrO$nrO$orO$prO$qrO$rrO$srO$trO$urO$vrO$wrO$xrO$yrO$zrO${rO$|rO$}rO%OrO%PrO%QrO%RrO%SrO%TrO%UrO%VrO%WrO%XrO%YrO%yPO&PVO&QVO&WXO&ZbO~OjsOltOmtO%zvO~OP]OR]OT]OU]O_yO`]Oa]Ob]OcyOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!fjO!oWO!z+sO#R+sO#S+sO#WYO#nZO%yPO&P+sO&Q+sO&WXOo%{P~OP]OR]OT]OU]O_{O`[Oa[Ob[OcUOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!c`O!fjO!oWO!zVO!{!OO#RVO#SVO#WYO#koO#lpO#nZO#rlO#xmO#{nO$QqO$XrO$YrO$ZrO$[rO$]rO$^rO$_rO$`rO$arO$brO$crO$drO$erO$frO$grO$hrO$irO$jrO$krO$lrO$mrO$nrO$orO$prO$qrO$rrO$srO$trO$urO$vrO$wrO$xrO$yrO$zrO${rO$|rO$}rO%OrO%PrO%QrO%RrO%SrO%TrO%UrO%VrO%WrO%XrO%YrO%yPO&PVO&QVO&WXO&ZbO~Oh|O~P*SOQ!UOS!UOV!YOW!YOX!YOY!YOp!`Os![O!O!bO!V!bO!_!XO!c!UO!m!RO!t!UO!v!WO!x!SO!z!TO!{!XO!|!YO!}!ZO#O!ZO#P!ZO#f!]O#g!]O#i!^O#k!bO#l!bO#n!_O%q!VO%r!VO&P!TO&WXOP^XR^XT^XU^X_^X`^Xa^Xb^Xc^Xd^Xe^Xf^Xn^Xw^Xx^Xy^Xz^X{^X|^X!X^X!f^X!o^X#R^X#S^X#W^X#r^X#x^X#{^X$Q^X$X^X$Y^X$Z^X$[^X$]^X$^^X$_^X$`^X$a^X$b^X$c^X$d^X$e^X$f^X$g^X$h^X$i^X$j^X$k^X$l^X$m^X$n^X$o^X$p^X$q^X$r^X$s^X$t^X$u^X$v^X$w^X$x^X$y^X$z^X${^X$|^X$}^X%O^X%P^X%Q^X%R^X%S^X%T^X%U^X%V^X%W^X%X^X%Y^X%y^X&Q^X&Z^Xh^X~O%n^X!S^X!T^X!h^X!k^X!Q^X!Z^X!]^X~P0]O!o!cO$S!eOP%xXQ%xXR%xXS%xXT%xXU%xXV%xXW%xXX%xXY%xX_%xX`%xXa%xXb%xXc%xXd%xXe%xXf%xXn%xXp%xXr$VXs%xXw%xXx%xXy%xXz%xX{%xX|%xX!O%xX!V%xX!X%xX!_%xX!c%xX!f%xX!m%xX!t%xX!v%xX!x%xX!z%xX!{%xX!|%xX!}%xX#O%xX#P%xX#R%xX#S%xX#W%xX#f%xX#g%xX#i%xX#k%xX#l%xX#n%xX#r%xX#x%xX#{%xX$Q%xX$X%xX$Y%xX$Z%xX$[%xX$]%xX$^%xX$_%xX$`%xX$a%xX$b%xX$c%xX$d%xX$e%xX$f%xX$g%xX$h%xX$i%xX$j%xX$k%xX$l%xX$m%xX$n%xX$o%xX$p%xX$q%xX$r%xX$s%xX$t%xX$u%xX$v%xX$w%xX$x%xX$y%xX$z%xX${%xX$|%xX$}%xX%O%xX%P%xX%Q%xX%R%xX%S%xX%T%xX%U%xX%V%xX%W%xX%X%xX%Y%xX%n%xX%q%xX%r%xX%y%xX&P%xX&Q%xX&W%xX&Z%xX!T%xXh%xX!Q%xX!S%xX!k%xX!Z%xX!]%xX~Ov%xX~P8^OP]OR]OT]OU]O_yO`]Oa]Ob]OcyOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!fjO!oWO!zVO#RVO#SVO#WYO#nZO%yPO&PVO&QVO&WXO~OP]OR]OT]OU]O_yO`]Oa]Ob]OcyOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!fjO!oWO!z+sO#R+sO#S+sO#WYO#nZO%yPO&P+sO&Q+sO&WXO~O!v!hO~PBtO_!kOs![O!o!jO&WXO~O_!mOc!mO~O$S!eOP%xXQ%xXR%xXS%xXT%xXU%xXV%xXW%xXX%xXY%xX_%xX`%xXa%xXb%xXc%xXd%xXe%xXf%xXn%xXp%xXs%xXw%xXx%xXy%xXz%xX{%xX|%xX!O%xX!V%xX!X%xX!_%xX!c%xX!f%xX!m%xX!o%xX!t%xX!v%xX!x%xX!z%xX!{%xX!|%xX!}%xX#O%xX#P%xX#R%xX#S%xX#W%xX#f%xX#g%xX#i%xX#k%xX#l%xX#n%xX#r%xX#x%xX#{%xX$Q%xX$X%xX$Y%xX$Z%xX$[%xX$]%xX$^%xX$_%xX$`%xX$a%xX$b%xX$c%xX$d%xX$e%xX$f%xX$g%xX$h%xX$i%xX$j%xX$k%xX$l%xX$m%xX$n%xX$o%xX$p%xX$q%xX$r%xX$s%xX$t%xX$u%xX$v%xX$w%xX$x%xX$y%xX$z%xX${%xX$|%xX$}%xX%O%xX%P%xX%Q%xX%R%xX%S%xX%T%xX%U%xX%V%xX%W%xX%X%xX%Y%xX%n%xX%q%xX%r%xX%y%xX&P%xX&Q%xX&W%xX&Z%xXh%xXv%xX!T%xX!Q%xX!S%xX!k%xX!Z%xX!]%xX~Or$VX~PErOP%xXQ%xXR%xXS%xXT%xXU%xXV%xXW%xXX%xXY%xX_%xX`%xXa%xXb%xXc%xXd%xXe%xXf%xXn%xXp%xXs%xXw%xXx%xXy%xXz%xX{%xX|%xX!O%xX!V%xX!X%xX!_%xX!c%xX!f%xX!m%xX!o%xX!t%xX!v%xX!x%xX!z%xX!{%xX!|%xX!}%xX#O%xX#P%xX#R%xX#S%xX#W%xX#f%xX#g%xX#i%xX#k%xX#l%xX#n%xX#r%xX#x%xX#{%xX$Q%xX$X%xX$Y%xX$Z%xX$[%xX$]%xX$^%xX$_%xX$`%xX$a%xX$b%xX$c%xX$d%xX$e%xX$f%xX$g%xX$h%xX$i%xX$j%xX$k%xX$l%xX$m%xX$n%xX$o%xX$p%xX$q%xX$r%xX$s%xX$t%xX$u%xX$v%xX$w%xX$x%xX$y%xX$z%xX${%xX$|%xX$}%xX%O%xX%P%xX%Q%xX%R%xX%S%xX%T%xX%U%xX%V%xX%W%xX%X%xX%Y%xX%n%xX%q%xX%r%xX%y%xX&P%xX&Q%xX&W%xX&Z%xXh%xXv%xX!S%xX!T%xX!k%xX!Q%xX!Z%xX!]%xX~OP%wXR%wXT%wXU%wX_%wX`%wXa%wXb%wXc%wXd%wXe%wXf%wXn%wXp%wXs%wXw%wXx%wXy%wXz%wX{%wX|%wX!O%wX!V%wX!X%wX!c%wX!f%wX!o%wX!z%wX#R%wX#S%wX#W%wX#k%wX#l%wX#n%wX#r%wX#x%wX#{%wX$Q%wX$X%wX$Y%wX$Z%wX$[%wX$]%wX$^%wX$_%wX$`%wX$a%wX$b%wX$c%wX$d%wX$e%wX$f%wX$g%wX$h%wX$i%wX$j%wX$k%wX$l%wX$m%wX$n%wX$o%wX$p%wX$q%wX$r%wX$s%wX$t%wX$u%wX$v%wX$w%wX$x%wX$y%wX$z%wX${%wX$|%wX$}%wX%O%wX%P%wX%Q%wX%R%wX%S%wX%T%wX%U%wX%V%wX%W%wX%X%wX%Y%wX%n%wX%y%wX&P%wX&Q%wX&W%wX&Z%wXh%wX!S%wX!T%wX!h%wX!h%xX!k%wX!Q%wX!Z%wX!]%wX~PMyO_!nO~Or!oO~OP]OR]OT]OU]O_!tO`]Oa]Ob]OcyOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!c!qO!fjO!oWO!t!rO!v!sO!zVO#RVO#SVO#WYO#nZO%yPO&PVO&QVO&WXO~O!S#RO!T#UO!Z#SO!]#TO~PBtOP]OR]OT]OU]O_,uO`,vOa,vOb,vOc,uOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!S#RO!VhO!XiO!c`O!fjO!h#ZO!k#[O!oWO!zVO#RVO#SVO#WYO#k-`O#l-cO#nZO#rlO#xmO#{nO$Q-nO$XrO$YrO$ZrO$[rO$]rO$^rO$_rO$`rO$arO$brO$crO$drO$erO$frO$grO$hrO$irO$jrO$krO$lrO$mrO$nrO$orO$prO$qrO$rrO$srO$trO$urO$vrO$wrO$xrO$yrO$zrO${rO$|rO$}rO%OrO%PrO%QrO%RrO%SrO%TrO%UrO%VrO%WrO%XrO%YrO%yPO&PVO&QVO&WXO&ZbO~O!T#]O~P!1kOP]OR]OT]OU]O_TO`[Oa[Ob[OcUOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!c`O!fjO!oWO!zVO!{!OO#RVO#SVO#WYO#k-`O#l-cO#nZO#rlO#xmO#{nO$Q-nO$XrO$YrO$ZrO$[rO$]rO$^rO$_rO$`rO$arO$brO$crO$drO$erO$frO$grO$hrO$irO$jrO$krO$lrO$mrO$nrO$orO$prO$qrO$rrO$srO$trO$urO$vrO$wrO$xrO$yrO$zrO${rO$|rO$}rO%OrO%PrO%QrO%RrO%SrO%TrO%UrO%VrO%WrO%XrO%YrO%yPO&PVO&QVO&WXO&ZbO~O!T#aO~P!7zOV#cOW#cOX#cOY#cO!_#cO!c#cO!t#cO!v#cO!z#cO!{#cO!|#cO#S#cO#u#cO#v#cO%q#cO%r#cO&P#cO~O_#dOz#eO~P!>TOc#gO#n#hO~O_#mO~OjsOltOmtO%z#qO~OQ+uOS+uOV+yOW+yOX+yOY+yOp!`Os![O!O+|O!V+|O!_+xO!c+uO!m#tO!t+uO!v+wO!x*oO!z+tO!{+xO!|+yO!}+zO#O+zO#P+zO#f+{O#g+{O#i-fO#k+|O#l+|O#n!_O%q+vO%r+vO&P+tO&WXO~Or#rOo%{X~P!@ROo#uO~O!o!cOQ%xXS%xXV%xXW%xXX%xXY%xXp%xXr%xXs%xX!O%xX!V%xX!_%xX!c%xX!m%xX!t%xX!v%xX!x%xX!z%xX!{%xX!|%xX!}%xX#O%xX#P%xX#f%xX#g%xX#i%xX#k%xX#l%xX#n%xX%q%xX%r%xX&P%xX&W%xXP%xXR%xXT%xXU%xX_%xX`%xXa%xXb%xXc%xXd%xXe%xXf%xXn%xXw%xXx%xXy%xXz%xX{%xX|%xX!X%xX!f%xX#R%xX#S%xX#W%xX#r%xX#x%xX#{%xX$Q%xX$X%xX$Y%xX$Z%xX$[%xX$]%xX$^%xX$_%xX$`%xX$a%xX$b%xX$c%xX$d%xX$e%xX$f%xX$g%xX$h%xX$i%xX$j%xX$k%xX$l%xX$m%xX$n%xX$o%xX$p%xX$q%xX$r%xX$s%xX$t%xX$u%xX$v%xX$w%xX$x%xX$y%xX$z%xX${%xX$|%xX$}%xX%O%xX%P%xX%Q%xX%R%xX%S%xX%T%xX%U%xX%V%xX%W%xX%X%xX%Y%xX%n%xX%y%xX&Q%xX&Z%xX!Q%xX!S%xX!T%xX!Z%xX!]%xXh%xX!h%xX!k%xX~Oo%xX!n%xXv%xX%o%xX~P!BhOv#vO~P0]O!o!cO$S!eOP%xXQ%xXR%xXS%xXT%xXU%xXV%xXW%xXX%xXY%xX_%xX`%xXa%xXb%xXc%xXd%xXe%xXf%xXh%xXn%xXp%xXr$VXs%xXv%xXw%xXx%xXy%xXz%xX{%xX|%xX!O%xX!V%xX!X%xX!_%xX!c%xX!f%xX!m%xX!t%xX!v%xX!x%xX!z%xX!{%xX!|%xX!}%xX#O%xX#P%xX#R%xX#S%xX#W%xX#f%xX#g%xX#i%xX#k%xX#l%xX#n%xX#r%xX#x%xX#{%xX$Q%xX$X%xX$Y%xX$Z%xX$[%xX$]%xX$^%xX$_%xX$`%xX$a%xX$b%xX$c%xX$d%xX$e%xX$f%xX$g%xX$h%xX$i%xX$j%xX$k%xX$l%xX$m%xX$n%xX$o%xX$p%xX$q%xX$r%xX$s%xX$t%xX$u%xX$v%xX$w%xX$x%xX$y%xX$z%xX${%xX$|%xX$}%xX%O%xX%P%xX%Q%xX%R%xX%S%xX%T%xX%U%xX%V%xX%W%xX%X%xX%Y%xX%q%xX%r%xX%y%xX&P%xX&Q%xX&W%xX&Z%xX~O%o#vO~P!KPOPtaP#`aQtaQ#`aRtaR#`aStaS#`aTtaT#`aUtaU#`aVtaV#`aWtaW#`aXtaX#`aYtaY#`a_ta_#`a`ta`#`aataa#`abtab#`actac#`adtad#`aetae#`aftaf#`antan#`aptap#`astas#`awtaw#`axtax#`aytay#`aztaz#`a{ta{#`a|ta|#`a!Ota!O#`a!Vta!V#`a!Xta!X#`a!_ta!_#`a!cta!c#`a!fta!f#`a!mta!m#`a!ota!o#`a!tta!t#`a!vta!v#`a!xta!x#`a!zta!z#`a!{ta!{#`a!|ta!|#`a!}ta!}#`a#Ota#O#`a#Pta#P#`a#Rta#R#`a#Sta#S#`a#Wta#W#`a#fta#f#`a#gta#g#`a#ita#i#`a#kta#k#`a#lta#l#`a#nta#n#`a#rta#r#`a#xta#x#`a#{ta#{#`a$Qta$Q#`a$Xta$X#`a$Yta$Y#`a$Zta$Z#`a$[ta$[#`a$]ta$]#`a$^ta$^#`a$_ta$_#`a$`ta$`#`a$ata$a#`a$bta$b#`a$cta$c#`a$dta$d#`a$eta$e#`a$fta$f#`a$gta$g#`a$hta$h#`a$ita$i#`a$jta$j#`a$kta$k#`a$lta$l#`a$mta$m#`a$nta$n#`a$ota$o#`a$pta$p#`a$qta$q#`a$rta$r#`a$sta$s#`a$tta$t#`a$uta$u#`a$vta$v#`a$wta$w#`a$xta$x#`a$yta$y#`a$zta$z#`a${ta${#`a$|ta$|#`a$}ta$}#`a%Ota%O#`a%Pta%P#`a%Qta%Q#`a%Rta%R#`a%Sta%S#`a%Tta%T#`a%Uta%U#`a%Vta%V#`a%Wta%W#`a%Xta%X#`a%Yta%Y#`a%qta%q#`a%rta%r#`a%yta%y#`a&Pta&P#`a&Qta&Q#`a&Wta&W#`a&Zta&Z#`avtav#`a!Sta!S#`a!Tta!T#`a!]ta!]#`a~O%nta%n#`aotao#`artar#`ahtah#`a!nta!n#`a!Qta!Q#`a!Zta!Z#`a!hta!h#`a!kta!k#`a%ota%o#`a~P#$tOh#yOr#wO~O_#{O!o#zO!{&TP~Oh$OO~PcO_$QO!o!cO~O_$RO~Oh$ZO!{!OO~PcO_$^Oc$^O~OP]OR]OT]OU]O_,xO`]Oa]Ob]OcyOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!c,OO!fjO!oWO!t,PO!v,QO!z+sO#R+sO#S+sO#WYO#nZO%yPO&P+sO&Q+sO&WXO~O!n&OP~P#6kOp!`O!m*rO!x!SO#n!_OP#QaQ#QaR#QaS#QaT#QaU#QaV#QaW#QaX#QaY#Qa_#Qa`#Qaa#Qab#Qac#Qad#Qae#Qaf#Qan#Qas#Qaw#Qax#Qay#Qaz#Qa{#Qa|#Qa!O#Qa!V#Qa!X#Qa!_#Qa!c#Qa!f#Qa!o#Qa!t#Qa!v#Qa!z#Qa!{#Qa!|#Qa!}#Qa#O#Qa#P#Qa#R#Qa#S#Qa#W#Qa#f#Qa#g#Qa#i#Qa#k#Qa#l#Qa#r#Qa#x#Qa#{#Qa$Q#Qa$X#Qa$Y#Qa$Z#Qa$[#Qa$]#Qa$^#Qa$_#Qa$`#Qa$a#Qa$b#Qa$c#Qa$d#Qa$e#Qa$f#Qa$g#Qa$h#Qa$i#Qa$j#Qa$k#Qa$l#Qa$m#Qa$n#Qa$o#Qa$p#Qa$q#Qa$r#Qa$s#Qa$t#Qa$u#Qa$v#Qa$w#Qa$x#Qa$y#Qa$z#Qa${#Qa$|#Qa$}#Qa%O#Qa%P#Qa%Q#Qa%R#Qa%S#Qa%T#Qa%U#Qa%V#Qa%W#Qa%X#Qa%Y#Qa%q#Qa%r#Qa%y#Qa&P#Qa&Q#Qa&W#Qa&Z#Qa!Q#Qa!S#Qa!T#Qa!]#Qa~O%n#Qah#Qav#Qar#Qa!h#Qa!k#Qa!Z#Qa~P#9[Or$eO!n$gO~P!@RO!n$gO~O_$lO!c$iO!t$jO!v$kO!n&RP~Os![O&WXO~O_$qO`$qOa$qOb$qOc$qO!c`O~Or!oO&S$tO~O%o$xO~P!BhOQ!UOS!UOV!YOW!YOX!YOY!YOp!`Os![O!O!bO!V!bO!_!XO!c!UO!m*rO!t!UO!v!WO!x!SO!z!TO!{!XO!|!YO!}!ZO#O!ZO#P!ZO#f!]O#g!]O#i!^O#k!bO#l!bO#n!_O%q!VO%r!VO&P!TO&WXO~OP!qXR!qXT!qXU!qX_!qX`!qXa!qXb!qXc!qXd!qXe!qXf!qXn!qXr!qXw!qXx!qXy!qXz!qX{!qX|!qX!X!qX!f!qX!o!qX#R!qX#S!qX#W!qX#r!qX#x!qX#{!qX$Q!qX$X!qX$Y!qX$Z!qX$[!qX$]!qX$^!qX$_!qX$`!qX$a!qX$b!qX$c!qX$d!qX$e!qX$f!qX$g!qX$h!qX$i!qX$j!qX$k!qX$l!qX$m!qX$n!qX$o!qX$p!qX$q!qX$r!qX$s!qX$t!qX$u!qX$v!qX$w!qX$x!qX$y!qX$z!qX${!qX$|!qX$}!qX%O!qX%P!qX%Q!qX%R!qX%S!qX%T!qX%U!qX%V!qX%W!qX%X!qX%Y!qX%n!qX%y!qX&Q!qX&Z!qXh!qX!S!qX!T!qX!h!qX!k!qX!Q!qX!Z!qX!]!qX~P#CQOr$yOP&YXR&YXT&YXU&YX_&YX`&YXa&YXb&YXc&YXd&YXe&YXf&YXn&YXp&YXs&YXw&YXx&YXy&YXz&YX{&YX|&YX!O&YX!V&YX!X&YX!c&YX!f&YX!o&YX!z&YX#R&YX#S&YX#W&YX#k&YX#l&YX#n&YX#r&YX#x&YX#{&YX$Q&YX$X&YX$Y&YX$Z&YX$[&YX$]&YX$^&YX$_&YX$`&YX$a&YX$b&YX$c&YX$d&YX$e&YX$f&YX$g&YX$h&YX$i&YX$j&YX$k&YX$l&YX$m&YX$n&YX$o&YX$p&YX$q&YX$r&YX$s&YX$t&YX$u&YX$v&YX$w&YX$x&YX$y&YX$z&YX${&YX$|&YX$}&YX%O&YX%P&YX%Q&YX%R&YX%S&YX%T&YX%U&YX%V&YX%W&YX%X&YX%Y&YX%n&YX%y&YX&P&YX&Q&YX&W&YX&Z&YXh&YX!S&YX!T&YX!h&YX!k&YX!Q&YX!Z&YX!]&YX~OP]OQ!UOR]OS!UOT]OU]OV!YOW!YOX!YOY!YO_TO`[Oa[Ob[OcUOd]Oe]Of]On]Op!`OsROw]Ox]Oy]Oz]O{]O|]O!O%SO!V%VO!XiO!_!XO!c%OO!fjO!m*rO!oWO!t!UO!v!WO!x!SO!z$}O!{!XO!|!YO!}!ZO#O!ZO#P!ZO#RVO#SVO#WYO#f!]O#g!]O#i!^O#k%WO#l%XO#n%PO#rlO#xmO#{nO$Q-nO$XrO$YrO$ZrO$[rO$]rO$^rO$_rO$`rO$arO$brO$crO$drO$erO$frO$grO$hrO$irO$jrO$krO$lrO$mrO$nrO$orO$prO$qrO$rrO$srO$trO$urO$vrO$wrO$xrO$yrO$zrO${rO$|rO$}rO%OrO%PrO%QrO%RrO%SrO%TrO%UrO%VrO%WrO%XrO%YrO%q!VO%r!VO%yPO&P$}O&QVO&WXO&ZbO~O!Q%RO!S#RO!T%TO~P$#sOP]OQ!UOR]OS!UOT]OU]OV!YOW!YOX!YOY!YO_TO`[Oa[Ob[OcUOd]Oe]Of]On]Op!`OsROw]Ox]Oy]Oz]O{]O|]O!XiO!_!XO!c%OO!fjO!m*rO!oWO!t!UO!v!WO!x!SO!z$}O!{!XO!|!YO!}!ZO#O!ZO#P!ZO#RVO#SVO#WYO#f!]O#g!]O#i!^O#n%PO#rlO#xmO#{nO$Q-nO$XrO$YrO$ZrO$[rO$]rO$^rO$_rO$`rO$arO$brO$crO$drO$erO$frO$grO$hrO$irO$jrO$krO$lrO$mrO$nrO$orO$prO$qrO$rrO$srO$trO$urO$vrO$wrO$xrO$yrO$zrO${rO$|rO$}rO%OrO%PrO%QrO%RrO%SrO%TrO%UrO%VrO%WrO%XrO%YrO%q!VO%r!VO%yPO&P$}O&QVO&WXO&ZbO~O!O,VO!S#RO!T%ZO!V-RO#k-TO#l-VO~P$+bO!S#RO!T%^O!Z#SO~O!S#RO!T%^O!]#TO~O!S#RO!T%^O!Z#SO!]#TO~P!@ROP]OR]OT]OU]O_TO`[Oa[Ob[OcUOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!c`O!fjO!oWO!zVO#RVO#SVO#WYO#k-`O#l-cO#nZO#rlO#xmO#{nO$Q-nO$XrO$YrO$ZrO$[rO$]rO$^rO$_rO$`rO$arO$brO$crO$drO$erO$frO$grO$hrO$irO$jrO$krO$lrO$mrO$nrO$orO$prO$qrO$rrO$srO$trO$urO$vrO$wrO$xrO$yrO$zrO${rO$|rO$}rO%OrO%PrO%QrO%RrO%SrO%TrO%UrO%VrO%WrO%XrO%YrO%yPO&PVO&QVO&WXO&ZbO~O!T!RX!k!RX~P$3tOP]OR]OT]OU]O_yO`]Oa]Ob]OcyOd]Oe]Of]On]Ow]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!fjO!oWO!zVO#RVO#SVO#WYO#nZO%yPO&PVO&QVO&WXO~Op%fOs%gO!_%hO~P$9}O!T%^O~O!S#RO!T%lO!h#ZO!k#[O~O!T%lO~P!1kOP]OR]OT]OU]O_,uO`,vOa,vOb,vOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!c`O!fjO!oWO!zVO#RVO#SVO#WYO#k-`O#l-cO#nZO#rlO#xmO#{nO$Q-nO$XrO$YrO$ZrO$[rO$]rO$^rO$_rO$`rO$arO$brO$crO$drO$erO$frO$grO$hrO$irO$jrO$krO$lrO$mrO$nrO$orO$prO$qrO$rrO$srO$trO$urO$vrO$wrO$xrO$yrO$zrO${rO$|rO$}rO%OrO%PrO%QrO%RrO%SrO%TrO%UrO%VrO%WrO%XrO%YrO%yPO&PVO&QVO&WXO&ZbO~Oc%pOv%qO!S!gX!T!gX!h!gX!k!gX~P$=PO!T!jX~P$3tO!T%lO~O!T%lO!k#[O~O!T%uO~P$3tOP]OR]OT]OU]O_,uO`,vOa,vOb,vOc,uOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!S#RO!VhO!XiO!c`O!fjO!h#ZO!k#[O!o%xO!zVO#RVO#SVO#WYO#k-`O#l-cO#nZO#rlO#xmO#{nO$Q-nO$XrO$YrO$ZrO$[rO$]rO$^rO$_rO$`rO$arO$brO$crO$drO$erO$frO$grO$hrO$irO$jrO$krO$lrO$mrO$nrO$orO$prO$qrO$rrO$srO$trO$urO$vrO$wrO$xrO$yrO$zrO${rO$|rO$}rO%OrO%PrO%QrO%RrO%SrO%TrO%UrO%VrO%WrO%XrO%YrO%yPO&PVO&QVO&WXO&ZbO!T#sP~O&S&OO~P$DOO!m&PO~O!o!jO~O#n&ROP&XXR&XXT&XXU&XX_&XX`&XXa&XXb&XXc&XXd&XXe&XXf&XXn&XXp&XXs&XXw&XXx&XXy&XXz&XX{&XX|&XX!O&XX!T&XX!V&XX!X&XX!c&XX!f&XX!o&XX!z&XX#R&XX#S&XX#W&XX#k&XX#l&XX#n&XX#r&XX#x&XX#{&XX$Q&XX$X&XX$Y&XX$Z&XX$[&XX$]&XX$^&XX$_&XX$`&XX$a&XX$b&XX$c&XX$d&XX$e&XX$f&XX$g&XX$h&XX$i&XX$j&XX$k&XX$l&XX$m&XX$n&XX$o&XX$p&XX$q&XX$r&XX$s&XX$t&XX$u&XX$v&XX$w&XX$x&XX$y&XX$z&XX${&XX$|&XX$}&XX%O&XX%P&XX%Q&XX%R&XX%S&XX%T&XX%U&XX%V&XX%W&XX%X&XX%Y&XX%p&XX%y&XX&P&XX&Q&XX&W&XX&Z&XX~Oc&TO~O%p&WO!T#yP~P$3tO!T#|P~P$3tO!O,WO!T&]O!V,XO#k-UO#l-WO~P$+bO!O,WO!T&`O!V,XO#k-UO#l-WO~P$+bO!]&aO~Oh&bO~P!@ROo%{a~PBtOr&eOo%{a~O_&gO!o!cO~OP]OR]OT]OU]O_&jO`]Oa]Ob]OcyOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!fjO!oWO!z+sO#R+sO#S+sO#WYO#nZO%yPO&P+sO&Q+sO&WXO~Oh&lO~P%$wOh&lOr&mO~O_&oO!n&VP~Or&qO!{&TX~O!{&sO~Oh&tO~PcOQ!liS!liV!liW!liX!liY!lip!lis!li!O!li!V!li!_!li!c!li!m!li!t!li!v!li!x!li!z!li!{!li!|!li!}!li#O!li#P!li#f!li#g!li#i!li#k!li#l!li#n!li%q!li%r!li&P!li&W!lih!liv!li!S!li!T!li!Z!li!]!li~O$S&vOP!liR!liT!liU!li_!li`!lia!lib!lic!lid!lie!lif!lin!liw!lix!liy!liz!li{!li|!li!X!li!f!li!o!li#R!li#S!li#W!li#r!li#x!li#{!li$Q!li$X!li$Y!li$Z!li$[!li$]!li$^!li$_!li$`!li$a!li$b!li$c!li$d!li$e!li$f!li$g!li$h!li$i!li$j!li$k!li$l!li$m!li$n!li$o!li$p!li$q!li$r!li$s!li$t!li$u!li$v!li$w!li$x!li$y!li$z!li${!li$|!li$}!li%O!li%P!li%Q!li%R!li%S!li%T!li%U!li%V!li%W!li%X!li%Y!li%n!li%y!li&Q!li&Z!li!h!li!k!li!Q!li~P%(TOQ!UOS!UOp!`O!c!UO!m*rO!t!UO!x!SO#n!_OP!yiR!yiT!yiU!yiV!yiW!yiX!yiY!yi_!yi`!yia!yib!yic!yid!yie!yif!yin!yis!yiw!yix!yiy!yiz!yi{!yi|!yi!O!yi!V!yi!X!yi!_!yi!f!yi!o!yi!v!yi!{!yi!|!yi!}!yi#O!yi#P!yi#R!yi#S!yi#W!yi#f!yi#g!yi#i!yi#k!yi#l!yi#r!yi#x!yi#{!yi$Q!yi$X!yi$Y!yi$Z!yi$[!yi$]!yi$^!yi$_!yi$`!yi$a!yi$b!yi$c!yi$d!yi$e!yi$f!yi$g!yi$h!yi$i!yi$j!yi$k!yi$l!yi$m!yi$n!yi$o!yi$p!yi$q!yi$r!yi$s!yi$t!yi$u!yi$v!yi$w!yi$x!yi$y!yi$z!yi${!yi$|!yi$}!yi%O!yi%P!yi%Q!yi%R!yi%S!yi%T!yi%U!yi%V!yi%W!yi%X!yi%Y!yi%n!yi%q!yi%r!yi%y!yi&Q!yi&W!yi&Z!yih!yiv!yir!yi!S!yi!T!yi!h!yi!k!yi!Q!yi!Z!yi!]!yi~O!z!yi&P!yi~P%0[Op!`O!m*rO!t!UO!x!SO#n!_OP!yiR!yiT!yiU!yiV!yiW!yiX!yiY!yi_!yi`!yia!yib!yic!yid!yie!yif!yin!yis!yiw!yix!yiy!yiz!yi{!yi|!yi!O!yi!V!yi!X!yi!_!yi!f!yi!o!yi!v!yi!{!yi!|!yi!}!yi#O!yi#P!yi#R!yi#S!yi#W!yi#f!yi#g!yi#i!yi#k!yi#l!yi#r!yi#x!yi#{!yi$Q!yi$X!yi$Y!yi$Z!yi$[!yi$]!yi$^!yi$_!yi$`!yi$a!yi$b!yi$c!yi$d!yi$e!yi$f!yi$g!yi$h!yi$i!yi$j!yi$k!yi$l!yi$m!yi$n!yi$o!yi$p!yi$q!yi$r!yi$s!yi$t!yi$u!yi$v!yi$w!yi$x!yi$y!yi$z!yi${!yi$|!yi$}!yi%O!yi%P!yi%Q!yi%R!yi%S!yi%T!yi%U!yi%V!yi%W!yi%X!yi%Y!yi%n!yi%q!yi%r!yi%y!yi&Q!yi&W!yi&Z!yih!yiv!yir!yi!Q!yi!S!yi!T!yi!h!yi!k!yi!Z!yi!]!yi~OQ!yiS!yi!c!yi!z!yi&P!yi~P%8cO!z!TO&P!TO~P%0[OQ!UOS!UOp!`O!c!UO!m*rO!t!UO!x!SO!z!TO#n!_O%q!VO%r!VO&P!TOP!yiR!yiT!yiU!yiV!yiW!yiX!yiY!yi_!yi`!yia!yib!yic!yid!yie!yif!yin!yis!yiw!yix!yiy!yiz!yi{!yi|!yi!O!yi!V!yi!X!yi!_!yi!f!yi!o!yi!{!yi!|!yi!}!yi#O!yi#P!yi#R!yi#S!yi#W!yi#f!yi#g!yi#i!yi#k!yi#l!yi#r!yi#x!yi#{!yi$Q!yi$X!yi$Y!yi$Z!yi$[!yi$]!yi$^!yi$_!yi$`!yi$a!yi$b!yi$c!yi$d!yi$e!yi$f!yi$g!yi$h!yi$i!yi$j!yi$k!yi$l!yi$m!yi$n!yi$o!yi$p!yi$q!yi$r!yi$s!yi$t!yi$u!yi$v!yi$w!yi$x!yi$y!yi$z!yi${!yi$|!yi$}!yi%O!yi%P!yi%Q!yi%R!yi%S!yi%T!yi%U!yi%V!yi%W!yi%X!yi%Y!yi%n!yi%y!yi&Q!yi&W!yi&Z!yih!yiv!yir!yi!Q!yi!S!yi!T!yi!h!yi!k!yi!Z!yi!]!yi~O!v!yi~P%@tO!v!WO~P%@tOQ!UOS!UOp!`O!_!XO!c!UO!m*rO!t!UO!v!WO!x!SO!z!TO!{!XO#f!]O#g!]O#n!_O%q!VO%r!VO&P!TOP!yiR!yiT!yiU!yi_!yi`!yia!yib!yic!yid!yie!yif!yin!yis!yiw!yix!yiy!yiz!yi{!yi|!yi!O!yi!V!yi!X!yi!f!yi!o!yi!}!yi#O!yi#P!yi#R!yi#S!yi#W!yi#i!yi#k!yi#l!yi#r!yi#x!yi#{!yi$Q!yi$X!yi$Y!yi$Z!yi$[!yi$]!yi$^!yi$_!yi$`!yi$a!yi$b!yi$c!yi$d!yi$e!yi$f!yi$g!yi$h!yi$i!yi$j!yi$k!yi$l!yi$m!yi$n!yi$o!yi$p!yi$q!yi$r!yi$s!yi$t!yi$u!yi$v!yi$w!yi$x!yi$y!yi$z!yi${!yi$|!yi$}!yi%O!yi%P!yi%Q!yi%R!yi%S!yi%T!yi%U!yi%V!yi%W!yi%X!yi%Y!yi%n!yi%y!yi&Q!yi&W!yi&Z!yih!yiv!yir!yi!Q!yi!S!yi!T!yi!h!yi!k!yi!Z!yi!]!yi~OV!yiW!yiX!yiY!yi!|!yi~P%ISOV!YOW!YOX!YOY!YO!|!YO~P%ISOp!`O#n!_OV#eiW#eiX#eiY#eis#ei!O#ei!V#ei!|#ei!}#ei#O#ei#P#ei#i#ei#k#ei#l#ei&W#eih#eiv#eir#ei!S#ei!T#ei!Z#ei!]#ei~OQ!UOS!UO!_!XO!c!UO!m*rO!t!UO!v!WO!x!SO!z!TO!{!XO#f!]O#g!]O%q!VO%r!VO&P!TOP#eiR#eiT#eiU#ei_#ei`#eia#eib#eic#eid#eie#eif#ein#eiw#eix#eiy#eiz#ei{#ei|#ei!X#ei!f#ei!o#ei#R#ei#S#ei#W#ei#r#ei#x#ei#{#ei$Q#ei$X#ei$Y#ei$Z#ei$[#ei$]#ei$^#ei$_#ei$`#ei$a#ei$b#ei$c#ei$d#ei$e#ei$f#ei$g#ei$h#ei$i#ei$j#ei$k#ei$l#ei$m#ei$n#ei$o#ei$p#ei$q#ei$r#ei$s#ei$t#ei$u#ei$v#ei$w#ei$x#ei$y#ei$z#ei${#ei$|#ei$}#ei%O#ei%P#ei%Q#ei%R#ei%S#ei%T#ei%U#ei%V#ei%W#ei%X#ei%Y#ei%n#ei%y#ei&Q#ei&Z#ei!Q#ei!h#ei!k#ei~P&#nO%o&wO~P!@ROo&xO~OQ!UOS!UOV!YOW!YOX!YOY!YOp!`O!_!XO!m*rO!t!UO!v!WO!x!SO!{!XO!|!YO!}!ZO#O!ZO#P!ZO#f!]O#g!]O#i!^O%q!VO%r!VOP#jiR#jiT#jiU#ji_#ji`#jia#jib#jic#jid#jie#jif#jin#jis#jiw#jix#jiy#jiz#ji{#ji|#ji!X#ji!f#ji!o#ji#R#ji#S#ji#W#ji#r#ji#x#ji#{#ji$Q#ji$X#ji$Y#ji$Z#ji$[#ji$]#ji$^#ji$_#ji$`#ji$a#ji$b#ji$c#ji$d#ji$e#ji$f#ji$g#ji$h#ji$i#ji$j#ji$k#ji$l#ji$m#ji$n#ji$o#ji$p#ji$q#ji$r#ji$s#ji$t#ji$u#ji$v#ji$w#ji$x#ji$y#ji$z#ji${#ji$|#ji$}#ji%O#ji%P#ji%Q#ji%R#ji%S#ji%T#ji%U#ji%V#ji%W#ji%X#ji%Y#ji%y#ji&Q#ji&W#ji&Z#jiv#ji!S#ji!T#ji!Q#ji!]#ji~O!O!bO!V!bO!c!UO!z!TO#k!bO#l!bO#n!_O&P!TO%n#jih#jir#ji!h#ji!k#ji!Z#ji~P&,ROr&yO!n&OX~O!n&{O~O!h&|OP$RiR$RiT$RiU$Ri_$Ri`$Ria$Rib$Ric$Rid$Rie$Rif$Rin$Riw$Rix$Riy$Riz$Ri{$Ri|$Ri!X$Ri!f$Ri!o$Ri#R$Ri#S$Ri#W$Ri#r$Ri#x$Ri#{$Ri$Q$Ri$X$Ri$Y$Ri$Z$Ri$[$Ri$]$Ri$^$Ri$_$Ri$`$Ri$a$Ri$b$Ri$c$Ri$d$Ri$e$Ri$f$Ri$g$Ri$h$Ri$i$Ri$j$Ri$k$Ri$l$Ri$m$Ri$n$Ri$o$Ri$p$Ri$q$Ri$r$Ri$s$Ri$t$Ri$u$Ri$v$Ri$w$Ri$x$Ri$y$Ri$z$Ri${$Ri$|$Ri$}$Ri%O$Ri%P$Ri%Q$Ri%R$Ri%S$Ri%T$Ri%U$Ri%V$Ri%W$Ri%X$Ri%Y$Ri%n$Ri%y$Ri&Q$Ri&Z$Rih$Ri!T$Ri!Q$Ri!S$Ri!k$Ri!Z$Ri!]$Ri~P#CQO!n&}O~PBtOr'OO!n&}O~O!n#Ua~P!@RO_'PO~O_'QO~O_'RO~O%o'SO&S'TOr#YX!n#YX~Or'UO!n&RX~O!n'WO~OP!raR!raT!raU!ra_!ra`!raa!rab!rac!rad!rae!raf!ran!rar!raw!rax!ray!raz!ra{!ra|!ra!X!ra!f!ra!o!ra#R!ra#S!ra#W!ra#r!ra#x!ra#{!ra$Q!ra$X!ra$Y!ra$Z!ra$[!ra$]!ra$^!ra$_!ra$`!ra$a!ra$b!ra$c!ra$d!ra$e!ra$f!ra$g!ra$h!ra$i!ra$j!ra$k!ra$l!ra$m!ra$n!ra$o!ra$p!ra$q!ra$r!ra$s!ra$t!ra$u!ra$v!ra$w!ra$x!ra$y!ra$z!ra${!ra$|!ra$}!ra%O!ra%P!ra%Q!ra%R!ra%S!ra%T!ra%U!ra%V!ra%W!ra%X!ra%Y!ra%n!ra%y!ra&Q!ra&Z!rah!ra!S!ra!T!ra!h!ra!k!ra!Q!ra!Z!ra!]!ra~P#CQOP!saR!saT!saU!sa_!sa`!saa!sab!sac!sad!sae!saf!san!sar!saw!sax!say!saz!sa{!sa|!sa!X!sa!f!sa!o!sa#R!sa#S!sa#W!sa#r!sa#x!sa#{!sa$Q!sa$X!sa$Y!sa$Z!sa$[!sa$]!sa$^!sa$_!sa$`!sa$a!sa$b!sa$c!sa$d!sa$e!sa$f!sa$g!sa$h!sa$i!sa$j!sa$k!sa$l!sa$m!sa$n!sa$o!sa$p!sa$q!sa$r!sa$s!sa$t!sa$u!sa$v!sa$w!sa$x!sa$y!sa$z!sa${!sa$|!sa$}!sa%O!sa%P!sa%Q!sa%R!sa%S!sa%T!sa%U!sa%V!sa%W!sa%X!sa%Y!sa%n!sa%y!sa&Q!sa&Z!sah!sa!S!sa!T!sa!h!sa!k!sa!Q!sa!Z!sa!]!sa~P#CQOP!uaR!uaT!uaU!ua_!ua`!uaa!uab!uac!uad!uae!uaf!uan!uar!uaw!uax!uay!uaz!ua{!ua|!ua!X!ua!f!ua!o!ua#R!ua#S!ua#W!ua#r!ua#x!ua#{!ua$Q!ua$X!ua$Y!ua$Z!ua$[!ua$]!ua$^!ua$_!ua$`!ua$a!ua$b!ua$c!ua$d!ua$e!ua$f!ua$g!ua$h!ua$i!ua$j!ua$k!ua$l!ua$m!ua$n!ua$o!ua$p!ua$q!ua$r!ua$s!ua$t!ua$u!ua$v!ua$w!ua$x!ua$y!ua$z!ua${!ua$|!ua$}!ua%O!ua%P!ua%Q!ua%R!ua%S!ua%T!ua%U!ua%V!ua%W!ua%X!ua%Y!ua%n!ua%y!ua&Q!ua&Z!uah!ua!S!ua!T!ua!h!ua!k!ua!Q!ua!Z!ua!]!ua~P#CQOr$yOP&YaR&YaT&YaU&Ya_&Ya`&Yaa&Yab&Yac&Yad&Yae&Yaf&Yan&Yap&Yas&Yaw&Yax&Yay&Yaz&Ya{&Ya|&Ya!O&Ya!V&Ya!X&Ya!c&Ya!f&Ya!o&Ya!z&Ya#R&Ya#S&Ya#W&Ya#k&Ya#l&Ya#n&Ya#r&Ya#x&Ya#{&Ya$Q&Ya$X&Ya$Y&Ya$Z&Ya$[&Ya$]&Ya$^&Ya$_&Ya$`&Ya$a&Ya$b&Ya$c&Ya$d&Ya$e&Ya$f&Ya$g&Ya$h&Ya$i&Ya$j&Ya$k&Ya$l&Ya$m&Ya$n&Ya$o&Ya$p&Ya$q&Ya$r&Ya$s&Ya$t&Ya$u&Ya$v&Ya$w&Ya$x&Ya$y&Ya$z&Ya${&Ya$|&Ya$}&Ya%O&Ya%P&Ya%Q&Ya%R&Ya%S&Ya%T&Ya%U&Ya%V&Ya%W&Ya%X&Ya%Y&Ya%n&Ya%y&Ya&P&Ya&Q&Ya&W&Ya&Z&Yah&Ya!S&Ya!T&Ya!h&Ya!k&Ya!Q&Ya!Z&Ya!]&Ya~O!Q%RO!S#RO!T'^O~OP]OR]OT]OU]O`]Oa]Ob]OcyOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!fjO!oWO!zVO#RVO#SVO#WYO#nZO%yPO&PVO&QVO&WXO~O_'aO~P'&hO_'bOc'bO~OP]OR]OT]OU]O_TO`[Oa[Ob[OcUOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!c`O!fjO!oWO!zVO#RVO#SVO#WYO#k-bO#l-eO#nZO#rlO#xmO#{nO$Q-nO$XrO$YrO$ZrO$[rO$]rO$^rO$_rO$`rO$arO$brO$crO$drO$erO$frO$grO$hrO$irO$jrO$krO$lrO$mrO$nrO$orO$prO$qrO$rrO$srO$trO$urO$vrO$wrO$xrO$yrO$zrO${rO$|rO$}rO%OrO%PrO%QrO%RrO%SrO%TrO%UrO%VrO%WrO%XrO%YrO%yPO&PVO&QVO&WXO&ZbO~O!Q%RO!S#RO!T'^O~P')TO!S#RO!T'iO~P$3tO!T'iO~O!T'kO~O!S#RO!T'kO!Z#SO~O!S#RO!T'kO!]#TO~O!T!Ra!k!Ra~P$3tOr'mOP%|XR%|XT%|XU%|X_%|X`%|Xa%|Xb%|Xc%|Xd%|Xe%|Xf%|Xn%|Xw%|Xx%|Xy%|Xz%|X{%|X|%|X!S%|X!T%|X!X%|X!Z%|X!f%|X!o%|X#R%|X#S%|X#W%|X#r%|X#x%|X#{%|X$Q%|X$X%|X$Y%|X$Z%|X$[%|X$]%|X$^%|X$_%|X$`%|X$a%|X$b%|X$c%|X$d%|X$e%|X$f%|X$g%|X$h%|X$i%|X$j%|X$k%|X$l%|X$m%|X$n%|X$o%|X$p%|X$q%|X$r%|X$s%|X$t%|X$u%|X$v%|X$w%|X$x%|X$y%|X$z%|X${%|X$|%|X$}%|X%O%|X%P%|X%Q%|X%R%|X%S%|X%T%|X%U%|X%V%|X%W%|X%X%|X%Y%|X%y%|X&Q%|X&Z%|X~P#CQO!S!Ya!T!Ya!Z!Ya~P$3tO!c'pO~P'pOP]OR]OT]OU]O`[Oa[Ob[OcUOd]Oe]Of]On]OpQOsROw]Ox]Oy]Oz]O{]O|]O!OgO!VhO!XiO!c`O!fjO!oWO!zVO!{!OO#RVO#SVO#WYO#koO#lpO#nZO#rlO#xmO#{nO$QqO$XrO$YrO$ZrO$[rO$]rO$^rO$_rO$`rO$arO$brO$crO$drO$erO$frO$grO$hrO$irO$jrO$krO$lrO$mrO$nrO$orO$prO$qrO$rrO$srO$trO$urO$vrO$wrO$xrO$yrO$zrO${rO$|rO$}rO%OrO%PrO%QrO%RrO%SrO%TrO%UrO%VrO%WrO%XrO%YrO%yPO&PVO&QVO&WXO&ZbO~O_'qOh'rO~P'6gOP]OQ!UOR]OS!UOT]OU]OV!YOW!YOX!YOY!YO_TO`[Oa[Ob[OcUOd]Oe]Of]On]Op!`Ow]Ox]Oy]Oz]O{]O|]O!XiO!_!XO!c%OO!fjO!m*rO!oWO!t!UO!v!WO!x!SO!z$}O!{!XO!|!YO!}!ZO#O!ZO#P!ZO#RVO#SVO#WYO#f!]O#g!]O#i!^O#n%PO#rlO#xmO#{nO$Q-nO$XrO$YrO$ZrO$[rO$]rO$^rO$_rO$`rO$arO$brO$crO$drO$erO$frO$grO$hrO$irO$jrO$krO$lrO$mrO$nrO$orO$prO$qrO$rrO$srO$trO$urO$vrO$wrO$xrO$yrO$zrO${rO$|rO$}rO%OrO%PrO%QrO%RrO%SrO%TrO%UrO%VrO%WrO%XrO%YrO%q!VO%r!VO%yPO&P$}O&QVO&WXO&ZbO~Os+oOv'uO!O-]O!V-SO#k-kO#l-lO!S![a!T![a!]![a~P'TOc(]O~O#n&ROP&XaR&XaT&XaU&Xa_&Xa`&Xaa&Xab&Xac&Xad&Xae&Xaf&Xan&Xap&Xas&Xaw&Xax&Xay&Xaz&Xa{&Xa|&Xa!O&Xa!T&Xa!V&Xa!X&Xa!c&Xa!f&Xa!o&Xa!z&Xa#R&Xa#S&Xa#W&Xa#k&Xa#l&Xa#n&Xa#r&Xa#x&Xa#{&Xa$Q&Xa$X&Xa$Y&Xa$Z&Xa$[&Xa$]&Xa$^&Xa$_&Xa$`&Xa$a&Xa$b&Xa$c&Xa$d&Xa$e&Xa$f&Xa$g&Xa$h&Xa$i&Xa$j&Xa$k&Xa$l&Xa$m&Xa$n&Xa$o&Xa$p&Xa$q&Xa$r&Xa$s&Xa$t&Xa$u&Xa$v&Xa$w&Xa$x&Xa$y&Xa$z&Xa${&Xa$|&Xa$}&Xa%O&Xa%P&Xa%Q&Xa%R&Xa%S&Xa%T&Xa%U&Xa%V&Xa%W&Xa%X&Xa%Y&Xa%p&Xa%y&Xa&P&Xa&Q&Xa&W&Xa&Z&Xa~O!T#yX~P$3tO!T(`O~O!T#|X~P$3tO!T(bO~O!T(cO~P$3tO!T(eO~P!7zO!T(fO~P$3tO!T(hO~P!7zOo%_ar%_a!n%_a~P!@ROo%{i~PBtO!o!cOo!lir!li!n!li%o!li~P%(TOhuirui~P!@ROv#vO~P!@RO!o!cOQ%xXS%xXV%xXW%xXX%xXY%xXp%xXs%xXv%xX!O%xX!V%xX!_%xX!c%xX!m%xX!t%xX!v%xX!x%xX!z%xX!{%xX!|%xX!}%xX#O%xX#P%xX#f%xX#g%xX#i%xX#k%xX#l%xX#n%xX%q%xX%r%xX&P%xX&W%xX~O%o#vO~P(8bOh(jO~P%$wOr(lO!n&VX~O!n(nO~O_#{O!o#zO!{&Ta~Or(pO!{&Ta~O!n&Oa~P#6kOr(tO!n&Oa~O!n(vO~PBtOr#^a!n#^a~PBtO_$lO!c$iO!t$jO!v$kO!n&Ra~Or(zO!n&Ra~Or'mOP$UqR$UqT$UqU$Uq_$Uq`$Uqa$Uqb$Uqc$Uqd$Uqe$Uqf$Uqn$Uqw$Uqx$Uqy$Uqz$Uq{$Uq|$Uq!X$Uq!f$Uq!o$Uq#R$Uq#S$Uq#W$Uq#r$Uq#x$Uq#{$Uq$Q$Uq$X$Uq$Y$Uq$Z$Uq$[$Uq$]$Uq$^$Uq$_$Uq$`$Uq$a$Uq$b$Uq$c$Uq$d$Uq$e$Uq$f$Uq$g$Uq$h$Uq$i$Uq$j$Uq$k$Uq$l$Uq$m$Uq$n$Uq$o$Uq$p$Uq$q$Uq$r$Uq$s$Uq$t$Uq$u$Uq$v$Uq$w$Uq$x$Uq$y$Uq$z$Uq${$Uq$|$Uq$}$Uq%O$Uq%P$Uq%Q$Uq%R$Uq%S$Uq%T$Uq%U$Uq%V$Uq%W$Uq%X$Uq%Y$Uq%n$Uq%y$Uq&Q$Uq&Z$Uqh$Uq!S$Uq!T$Uq!h$Uq!k$Uq!Q$Uq!Z$Uq!]$Uq~P#CQOP!wiR!wiT!wiU!wi_!wi`!wia!wib!wic!wid!wie!wif!win!wir!wiw!wix!wiy!wiz!wi{!wi|!wi!X!wi!f!wi!o!wi#R!wi#S!wi#W!wi#r!wi#x!wi#{!wi$Q!wi$X!wi$Y!wi$Z!wi$[!wi$]!wi$^!wi$_!wi$`!wi$a!wi$b!wi$c!wi$d!wi$e!wi$f!wi$g!wi$h!wi$i!wi$j!wi$k!wi$l!wi$m!wi$n!wi$o!wi$p!wi$q!wi$r!wi$s!wi$t!wi$u!wi$v!wi$w!wi$x!wi$y!wi$z!wi${!wi$|!wi$}!wi%O!wi%P!wi%Q!wi%R!wi%S!wi%T!wi%U!wi%V!wi%W!wi%X!wi%Y!wi%n!wi%y!wi&Q!wi&Z!wih!wi!S!wi!T!wi!h!wi!k!wi!Q!wi!Z!wi!]!wi~P#CQO!T(}O~Ov!yi~P#9[OP%xXR%xXT%xXU%xX_%xX`%xXa%xXb%xXc%xXd%xXe%xXf%xXn%xXr$Vaw%xXx%xXy%xXz%xX{%xX|%xX!Q%xX!S%xX!T%xX!X%xX!f%xX#R%xX#S%xX#W%xX#r%xX#x%xX#{%xX$Q%xX$X%xX$Y%xX$Z%xX$[%xX$]%xX$^%xX$_%xX$`%xX$a%xX$b%xX$c%xX$d%xX$e%xX$f%xX$g%xX$h%xX$i%xX$j%xX$k%xX$l%xX$m%xX$n%xX$o%xX$p%xX$q%xX$r%xX$s%xX$t%xX$u%xX$v%xX$w%xX$x%xX$y%xX$z%xX${%xX$|%xX$}%xX%O%xX%P%xX%Q%xX%R%xX%S%xX%T%xX%U%xX%V%xX%W%xX%X%xX%Y%xX%y%xX&Q%xX&Z%xX!]%xX~P(8bOP#miQ#miR#miS#miT#miU#miV#miW#miX#miY#mi_#mi`#mia#mib#mic#mid#mie#mif#min#mip#mis#miw#mix#miy#miz#mi{#mi|#mi!O#mi!Q#mi!S#mi!T#mi!V#mi!X#mi!_#mi!c#mi!f#mi!m#mi!o#mi!t#mi!v#mi!x#mi!z#mi!{#mi!|#mi!}#mi#O#mi#P#mi#R#mi#S#mi#W#mi#f#mi#g#mi#i#mi#k#mi#l#mi#n#mi#r#mi#x#mi#{#mi$Q#mi$S#ma$X#mi$Y#mi$Z#mi$[#mi$]#mi$^#mi$_#mi$`#mi$a#mi$b#mi$c#mi$d#mi$e#mi$f#mi$g#mi$h#mi$i#mi$j#mi$k#mi$l#mi$m#mi$n#mi$o#mi$p#mi$q#mi$r#mi$s#mi$t#mi$u#mi$v#mi$w#mi$x#mi$y#mi$z#mi${#mi$|#mi$}#mi%O#mi%P#mi%Q#mi%R#mi%S#mi%T#mi%U#mi%V#mi%W#mi%X#mi%Y#mi%q#mi%r#mi%y#mi&P#mi&Q#mi&W#mi&Z#miv#mi!]#mi~O!Q%RO!S#RO!T(}O~O!Q!Pa!S!Pa!T!Pa~P$#sOQ!UOS!UOV!YOW!YOX!YOY!YOp!`O!O%SO!V%VO!_!XO!c%OO!m*rO!t!UO!v!WO!x!SO!z$}O!{!XO!|!YO!}!ZO#O!ZO#P!ZO#f!]O#g!]O#i!^O#k%WO#l%XO#n%PO%q!VO%r!VO&P$}OP#jiR#jiT#jiU#ji_#ji`#jia#jib#jic#jid#jie#jif#jin#jis#jiw#jix#jiy#jiz#ji{#ji|#ji!S#ji!T#ji!X#ji!f#ji!o#ji#R#ji#S#ji#W#ji#r#ji#x#ji#{#ji$Q#ji$X#ji$Y#ji$Z#ji$[#ji$]#ji$^#ji$_#ji$`#ji$a#ji$b#ji$c#ji$d#ji$e#ji$f#ji$g#ji$h#ji$i#ji$j#ji$k#ji$l#ji$m#ji$n#ji$o#ji$p#ji$q#ji$r#ji$s#ji$t#ji$u#ji$v#ji$w#ji$x#ji$y#ji$z#ji${#ji$|#ji$}#ji%O#ji%P#ji%Q#ji%R#ji%S#ji%T#ji%U#ji%V#ji%W#ji%X#ji%Y#ji%y#ji&Q#ji&W#ji&Z#ji~O!Q#ji~P)(yOQ!UOS!UOV!YOW!YOX!YOY!YOp!`O!O%SO!V%VO!_!XO!c%OO!m*rO!t!UO!v!WO!x!SO!{!XO!|!YO!}!ZO#O!ZO#P!ZO#f!]O#g!]O#i!^O#k%WO#l%XO#n%PO%q!VO%r!VOP#jiR#jiT#jiU#ji_#ji`#jia#jib#jic#jid#jie#jif#jin#jis#jiw#jix#jiy#jiz#ji{#ji|#ji!Q#ji!S#ji!T#ji!X#ji!f#ji!o#ji#R#ji#S#ji#W#ji#r#ji#x#ji#{#ji$Q#ji$X#ji$Y#ji$Z#ji$[#ji$]#ji$^#ji$_#ji$`#ji$a#ji$b#ji$c#ji$d#ji$e#ji$f#ji$g#ji$h#ji$i#ji$j#ji$k#ji$l#ji$m#ji$n#ji$o#ji$p#ji$q#ji$r#ji$s#ji$t#ji$u#ji$v#ji$w#ji$x#ji$y#ji$z#ji${#ji$|#ji$}#ji%O#ji%P#ji%Q#ji%R#ji%S#ji%T#ji%U#ji%V#ji%W#ji%X#ji%Y#ji%y#ji&Q#ji&W#ji&Z#ji~O!z,SO&P,SO~P)0hO!z,TO&P,TO~P)0hO!T)QO~O!T)RO~Or'mOP%|aR%|aT%|aU%|a_%|a`%|aa%|ab%|ac%|ad%|ae%|af%|an%|ap%|as%|aw%|ax%|ay%|az%|a{%|a|%|a!O%|a!S%|a!T%|a!V%|a!X%|a!Z%|a!c%|a!f%|a!o%|a!z%|a#R%|a#S%|a#W%|a#k%|a#l%|a#n%|a#r%|a#x%|a#{%|a$Q%|a$X%|a$Y%|a$Z%|a$[%|a$]%|a$^%|a$_%|a$`%|a$a%|a$b%|a$c%|a$d%|a$e%|a$f%|a$g%|a$h%|a$i%|a$j%|a$k%|a$l%|a$m%|a$n%|a$o%|a$p%|a$q%|a$r%|a$s%|a$t%|a$u%|a$v%|a$w%|a$x%|a$y%|a$z%|a${%|a$|%|a$}%|a%O%|a%P%|a%Q%|a%R%|a%S%|a%T%|a%U%|a%V%|a%W%|a%X%|a%Y%|a%y%|a&P%|a&Q%|a&W%|a&Z%|a~O!S!Yi!T!Yi!Z!Yi~P$3tO_)VOo)UOr)SO~O%o)WO~P!KPOP!`aR!`aT!`aU!`a_!`a`!`aa!`ab!`ac!`ad!`ae!`af!`an!`ap!`as!`aw!`ax!`ay!`az!`a{!`a|!`a!O!`a!S!`a!T!`a!V!`a!X!`a!]!`a!c!`a!f!`a!o!`a!z!`a#R!`a#S!`a#W!`a#k!`a#l!`a#n!`a#r!`a#x!`a#{!`a$Q!`a$X!`a$Y!`a$Z!`a$[!`a$]!`a$^!`a$_!`a$`!`a$a!`a$b!`a$c!`a$d!`a$e!`a$f!`a$g!`a$h!`a$i!`a$j!`a$k!`a$l!`a$m!`a$n!`a$o!`a$p!`a$q!`a$r!`a$s!`a$t!`a$u!`a$v!`a$w!`a$x!`a$y!`a$z!`a${!`a$|!`a$}!`a%O!`a%P!`a%Q!`a%R!`a%S!`a%T!`a%U!`a%V!`a%W!`a%X!`a%Y!`a%y!`a&P!`a&Q!`a&W!`a&Z!`a~P#$tOh)ZOr)XO~OP!^aR!^aT!^aU!^a_!^a`!^aa!^ab!^ac!^ad!^ae!^af!^an!^aw!^ax!^ay!^az!^a{!^a|!^a!S!^a!T!^a!X!^a!]!^a!f!^a!o!^a#R!^a#S!^a#W!^a#r!^a#x!^a#{!^a$Q!^a$X!^a$Y!^a$Z!^a$[!^a$]!^a$^!^a$_!^a$`!^a$a!^a$b!^a$c!^a$d!^a$e!^a$f!^a$g!^a$h!^a$i!^a$j!^a$k!^a$l!^a$m!^a$n!^a$o!^a$p!^a$q!^a$r!^a$s!^a$t!^a$u!^a$v!^a$w!^a$x!^a$y!^a$z!^a${!^a$|!^a$}!^a%O!^a%P!^a%Q!^a%R!^a%S!^a%T!^a%U!^a%V!^a%W!^a%X!^a%Y!^a%y!^a&Q!^a&Z!^a~P#CQO_)[O~O!S![i!T![i!]![i~P'DbO!T)]O~O!T)]O!k#[O~Oc)_O~Or'zOv)aOP!iaR!iaT!iaU!ia_!ia`!iaa!iab!iac!iad!iae!iaf!ian!iap!ias!iaw!iax!iay!iaz!ia{!ia|!ia!O!ia!S!ia!T!ia!V!ia!X!ia!c!ia!f!ia!h!ia!k!ia!o!ia!z!ia#R!ia#S!ia#W!ia#k!ia#l!ia#n!ia#r!ia#x!ia#{!ia$Q!ia$X!ia$Y!ia$Z!ia$[!ia$]!ia$^!ia$_!ia$`!ia$a!ia$b!ia$c!ia$d!ia$e!ia$f!ia$g!ia$h!ia$i!ia$j!ia$k!ia$l!ia$m!ia$n!ia$o!ia$p!ia$q!ia$r!ia$s!ia$t!ia$u!ia$v!ia$w!ia$x!ia$y!ia$z!ia${!ia$|!ia$}!ia%O!ia%P!ia%Q!ia%R!ia%S!ia%T!ia%U!ia%V!ia%W!ia%X!ia%Y!ia%y!ia&P!ia&Q!ia&W!ia&Z!ia~O_)bO~Oc,uO!S!gi!T!gi!h!gi!k!gi~P$=PO!k#[O!T#sa~O!o!cOQ%xXS%xXV%xXW%xXX%xXY%xXp%xXr%xXs%xX!O%xX!V%xX!_%xX!c%xX!m%xX!n%xX!t%xX!v%xX!x%xX!z%xX!{%xX!|%xX!}%xX#O%xX#P%xX#f%xX#g%xX#i%xX#k%xX#l%xX#n%xX%q%xX%r%xX&P%xX&W%xX~O%o'SO&S'TOr#YX!n#YX~P*%ZO_)dO~P(,eO!S#RO!h#ZO!k#[O!T#sa~O!T)fO~O#n&ROP&XiR&XiT&XiU&Xi_&Xi`&Xia&Xib&Xic&Xid&Xie&Xif&Xin&Xip&Xis&Xiw&Xix&Xiy&Xiz&Xi{&Xi|&Xi!O&Xi!T&Xi!V&Xi!X&Xi!c&Xi!f&Xi!o&Xi!z&Xi#R&Xi#S&Xi#W&Xi#k&Xi#l&Xi#n&Xi#r&Xi#x&Xi#{&Xi$Q&Xi$X&Xi$Y&Xi$Z&Xi$[&Xi$]&Xi$^&Xi$_&Xi$`&Xi$a&Xi$b&Xi$c&Xi$d&Xi$e&Xi$f&Xi$g&Xi$h&Xi$i&Xi$j&Xi$k&Xi$l&Xi$m&Xi$n&Xi$o&Xi$p&Xi$q&Xi$r&Xi$s&Xi$t&Xi$u&Xi$v&Xi$w&Xi$x&Xi$y&Xi$z&Xi${&Xi$|&Xi$}&Xi%O&Xi%P&Xi%Q&Xi%R&Xi%S&Xi%T&Xi%U&Xi%V&Xi%W&Xi%X&Xi%Y&Xi%p&Xi%y&Xi&P&Xi&Q&Xi&W&Xi&Z&Xi~O!T)lO~P$3tOP#}qQ#caR#}qS#caT#}qU#}qV#caW#caX#caY#ca_#}q`#}qa#}qb#}qc#}qd#}qe#}qf#}qn#}qp#}qs#}qw#}qx#}qy#}qz#}q{#}q|#}q!O#}q!V#}q!X#}q!_#ca!c#}q!f#}q!m#ca!o#}q!t#ca!v#ca!x#ca!z#}q!{#ca!|#ca!}#ca#O#ca#P#ca#R#}q#S#}q#W#}q#f#ca#g#ca#i#ca#k#}q#l#}q#n#}q#r#}q#x#}q#{#}q$Q#}q$X#}q$Y#}q$Z#}q$[#}q$]#}q$^#}q$_#}q$`#}q$a#}q$b#}q$c#}q$d#}q$e#}q$f#}q$g#}q$h#}q$i#}q$j#}q$k#}q$l#}q$m#}q$n#}q$o#}q$p#}q$q#}q$r#}q$s#}q$t#}q$u#}q$v#}q$w#}q$x#}q$y#}q$z#}q${#}q$|#}q$}#}q%O#}q%P#}q%Q#}q%R#}q%S#}q%T#}q%U#}q%V#}q%W#}q%X#}q%Y#}q%q#ca%r#ca%y#}q&P#}q&Q#}q&W#}q&Z#}q~O!T#ca%n#}qh#}q~P*.uO!T)mO~P$3tOP$OqQ#caR$OqS#caT$OqU$OqV#caW#caX#caY#ca_$Oq`$Oqa$Oqb$Oqc$Oqd$Oqe$Oqf$Oqn$Oqp$Oqs$Oqw$Oqx$Oqy$Oqz$Oq{$Oq|$Oq!O$Oq!V$Oq!X$Oq!_#ca!c$Oq!f$Oq!m#ca!o$Oq!t#ca!v#ca!x#ca!z$Oq!{#ca!|#ca!}#ca#O#ca#P#ca#R$Oq#S$Oq#W$Oq#f#ca#g#ca#i#ca#k$Oq#l$Oq#n$Oq#r$Oq#x$Oq#{$Oq$Q$Oq$X$Oq$Y$Oq$Z$Oq$[$Oq$]$Oq$^$Oq$_$Oq$`$Oq$a$Oq$b$Oq$c$Oq$d$Oq$e$Oq$f$Oq$g$Oq$h$Oq$i$Oq$j$Oq$k$Oq$l$Oq$m$Oq$n$Oq$o$Oq$p$Oq$q$Oq$r$Oq$s$Oq$t$Oq$u$Oq$v$Oq$w$Oq$x$Oq$y$Oq$z$Oq${$Oq$|$Oq$}$Oq%O$Oq%P$Oq%Q$Oq%R$Oq%S$Oq%T$Oq%U$Oq%V$Oq%W$Oq%X$Oq%Y$Oq%q#ca%r#ca%y$Oq&P$Oq&Q$Oq&W$Oq&Z$Oq~O!T#ca%n$Oqh$Oq~P*6kO!O,WO!T)pO!V,XO#k-UO#l-WO~P$+bO_)qO!n&Va~Or)rO!n&Va~O_#{O!o#zO!{&Ti~OQ!UOS!UOV!YOW!YOX!YOY!YO!_!XO!m*rO!t!UO!v!WO!x!SO!{!XO!|!YO!}!ZO#O!ZO#P!ZO#f!]O#g!]O#i!^O%q!VO%r!VO~OP$RyR$RyT$RyU$Ry_$Ry`$Rya$Ryb$Ryc$Ryd$Rye$Ryf$Ryn$Ryp$Rys$Ryw$Ryx$Ryy$Ryz$Ry{$Ry|$Ry!O$Ry!V$Ry!X$Ry!c$Ry!f$Ry!o$Ry!z$Ry#R$Ry#S$Ry#W$Ry#k$Ry#l$Ry#n$Ry#r$Ry#x$Ry#{$Ry$Q$Ry$X$Ry$Y$Ry$Z$Ry$[$Ry$]$Ry$^$Ry$_$Ry$`$Ry$a$Ry$b$Ry$c$Ry$d$Ry$e$Ry$f$Ry$g$Ry$h$Ry$i$Ry$j$Ry$k$Ry$l$Ry$m$Ry$n$Ry$o$Ry$p$Ry$q$Ry$r$Ry$s$Ry$t$Ry$u$Ry$v$Ry$w$Ry$x$Ry$y$Ry$z$Ry${$Ry$|$Ry$}$Ry%O$Ry%P$Ry%Q$Ry%R$Ry%S$Ry%T$Ry%U$Ry%V$Ry%W$Ry%X$Ry%Y$Ry%n$Ry%y$Ry&P$Ry&Q$Ry&W$Ry&Z$Ryh$Ry!S$Ry!T$Ry!h$Ry!k$Ry!Q$Ry!Z$Ry!]$Ry~P*?YOp!`O!c!UO!z!TO#n!_O&P!TOP#hyR#hyT#hyU#hy_#hy`#hya#hyb#hyc#hyd#hye#hyf#hyn#hys#hyw#hyx#hyy#hyz#hy{#hy|#hy!O#hy!V#hy!X#hy!f#hy!o#hy#R#hy#S#hy#W#hy#k#hy#l#hy#r#hy#x#hy#{#hy$Q#hy$X#hy$Y#hy$Z#hy$[#hy$]#hy$^#hy$_#hy$`#hy$a#hy$b#hy$c#hy$d#hy$e#hy$f#hy$g#hy$h#hy$i#hy$j#hy$k#hy$l#hy$m#hy$n#hy$o#hy$p#hy$q#hy$r#hy$s#hy$t#hy$u#hy$v#hy$w#hy$x#hy$y#hy$z#hy${#hy$|#hy$}#hy%O#hy%P#hy%Q#hy%R#hy%S#hy%T#hy%U#hy%V#hy%W#hy%X#hy%Y#hy%n#hy%y#hy&Q#hy&W#hy&Z#hyh#hyv#hyr#hy!Q#hy!S#hy!T#hy!h#hy!k#hy!Z#hy!]#hy~P*?YO!n&Oi~P#6kOP$TiR$TiT$TiU$Ti_$Ti`$Tia$Tib$Tic$Tid$Tie$Tif$Tin$Tiw$Tix$Tiy$Tiz$Ti{$Ti|$Ti!X$Ti!f$Ti!o$Ti#R$Ti#S$Ti#W$Ti#r$Ti#x$Ti#{$Ti$Q$Ti$X$Ti$Y$Ti$Z$Ti$[$Ti$]$Ti$^$Ti$_$Ti$`$Ti$a$Ti$b$Ti$c$Ti$d$Ti$e$Ti$f$Ti$g$Ti$h$Ti$i$Ti$j$Ti$k$Ti$l$Ti$m$Ti$n$Ti$o$Ti$p$Ti$q$Ti$r$Ti$s$Ti$t$Ti$u$Ti$v$Ti$w$Ti$x$Ti$y$Ti$z$Ti${$Ti$|$Ti$}$Ti%O$Ti%P$Ti%Q$Ti%R$Ti%S$Ti%T$Ti%U$Ti%V$Ti%W$Ti%X$Ti%Y$Ti%n$Ti%y$Ti&Q$Ti&Z$Tih$Ti!S$Ti!T$Ti!h$Ti!k$Ti!Q$Ti!Z$Ti!]$Ti~P#CQOr#^i!n#^i~P!@ROr#_i!n#_i~P!@RO_$lO!c$iO!t$jO!v$kO!n&Ri~Or'mOP$UyR$UyT$UyU$Uy_$Uy`$Uya$Uyb$Uyc$Uyd$Uye$Uyf$Uyn$Uyp$Uys$Uyw$Uyx$Uyy$Uyz$Uy{$Uy|$Uy!O$Uy!V$Uy!X$Uy!c$Uy!f$Uy!o$Uy!z$Uy#R$Uy#S$Uy#W$Uy#k$Uy#l$Uy#n$Uy#r$Uy#x$Uy#{$Uy$Q$Uy$X$Uy$Y$Uy$Z$Uy$[$Uy$]$Uy$^$Uy$_$Uy$`$Uy$a$Uy$b$Uy$c$Uy$d$Uy$e$Uy$f$Uy$g$Uy$h$Uy$i$Uy$j$Uy$k$Uy$l$Uy$m$Uy$n$Uy$o$Uy$p$Uy$q$Uy$r$Uy$s$Uy$t$Uy$u$Uy$v$Uy$w$Uy$x$Uy$y$Uy$z$Uy${$Uy$|$Uy$}$Uy%O$Uy%P$Uy%Q$Uy%R$Uy%S$Uy%T$Uy%U$Uy%V$Uy%W$Uy%X$Uy%Y$Uy%n$Uy%y$Uy&P$Uy&Q$Uy&W$Uy&Z$Uyh$Uy!S$Uy!T$Uy!h$Uy!k$Uy!Q$Uy!Z$Uy!]$Uy~O!T)vO~O!Q!Pi!S!Pi!T!Pi~P')TO!c)wO~PBtOo){Or)SO~Oh!aar!aa~PBtO_*OOh*QO~Oh*QOr*RO~O!T*TO~O_*UO~O!o!cOQ%xXS%xXV%xXW%xXX%xXY%xXp%xXs%xX!O%xX!V%xX!_%xX!c%xX!m%xX!n%xX!t%xX!v%xX!x%xX!z%xX!{%xX!|%xX!}%xX#O%xX#P%xX#f%xX#g%xX#i%xX#k%xX#l%xX#n%xX%q%xX%r%xX&P%xX&W%xX~Or#]a!n#]a~P+.|O!k#[O!T#si~OP#qyR#qyT#qyU#qy_#qy`#qya#qyb#qyc#qyd#qye#qyf#qyn#qyw#qyx#qyy#qyz#qy{#qy|#qy!X#qy!f#qy!o#qy#R#qy#S#qy#W#qy#r#qy#x#qy#{#qy$Q#qy$X#qy$Y#qy$Z#qy$[#qy$]#qy$^#qy$_#qy$`#qy$a#qy$b#qy$c#qy$d#qy$e#qy$f#qy$g#qy$h#qy$i#qy$j#qy$k#qy$l#qy$m#qy$n#qy$o#qy$p#qy$q#qy$r#qy$s#qy$t#qy$u#qy$v#qy$w#qy$x#qy$y#qy$z#qy${#qy$|#qy$}#qy%O#qy%P#qy%Q#qy%R#qy%S#qy%T#qy%U#qy%V#qy%W#qy%X#qy%Y#qy%n#qy%y#qy&Q#qy&Z#qyh#qy!S#qy!T#qy!h#qy!k#qy!Q#qy!Z#qy!]#qy~P#CQO!T*WO~O&S*YO!T#sP~P!1kO!T*ZO~OP#}yQ#ciR#}yS#ciT#}yU#}yV#ciW#ciX#ciY#ci_#}y`#}ya#}yb#}yc#}yd#}ye#}yf#}yn#}yp#}ys#}yw#}yx#}yy#}yz#}y{#}y|#}y!O#}y!V#}y!X#}y!_#ci!c#}y!f#}y!m#ci!o#}y!t#ci!v#ci!x#ci!z#}y!{#ci!|#ci!}#ci#O#ci#P#ci#R#}y#S#}y#W#}y#f#ci#g#ci#i#ci#k#}y#l#}y#n#}y#r#}y#x#}y#{#}y$Q#}y$X#}y$Y#}y$Z#}y$[#}y$]#}y$^#}y$_#}y$`#}y$a#}y$b#}y$c#}y$d#}y$e#}y$f#}y$g#}y$h#}y$i#}y$j#}y$k#}y$l#}y$m#}y$n#}y$o#}y$p#}y$q#}y$r#}y$s#}y$t#}y$u#}y$v#}y$w#}y$x#}y$y#}y$z#}y${#}y$|#}y$}#}y%O#}y%P#}y%Q#}y%R#}y%S#}y%T#}y%U#}y%V#}y%W#}y%X#}y%Y#}y%q#ci%r#ci%y#}y&P#}y&Q#}y&W#}y&Z#}y~O!T#ci%n#}yh#}y~P+7{OP$OyQ#ciR$OyS#ciT$OyU$OyV#ciW#ciX#ciY#ci_$Oy`$Oya$Oyb$Oyc$Oyd$Oye$Oyf$Oyn$Oyp$Oys$Oyw$Oyx$Oyy$Oyz$Oy{$Oy|$Oy!O$Oy!V$Oy!X$Oy!_#ci!c$Oy!f$Oy!m#ci!o$Oy!t#ci!v#ci!x#ci!z$Oy!{#ci!|#ci!}#ci#O#ci#P#ci#R$Oy#S$Oy#W$Oy#f#ci#g#ci#i#ci#k$Oy#l$Oy#n$Oy#r$Oy#x$Oy#{$Oy$Q$Oy$X$Oy$Y$Oy$Z$Oy$[$Oy$]$Oy$^$Oy$_$Oy$`$Oy$a$Oy$b$Oy$c$Oy$d$Oy$e$Oy$f$Oy$g$Oy$h$Oy$i$Oy$j$Oy$k$Oy$l$Oy$m$Oy$n$Oy$o$Oy$p$Oy$q$Oy$r$Oy$s$Oy$t$Oy$u$Oy$v$Oy$w$Oy$x$Oy$y$Oy$z$Oy${$Oy$|$Oy$}$Oy%O$Oy%P$Oy%Q$Oy%R$Oy%S$Oy%T$Oy%U$Oy%V$Oy%W$Oy%X$Oy%Y$Oy%q#ci%r#ci%y$Oy&P$Oy&Q$Oy&W$Oy&Z$Oy~O!T#ci%n$Oyh$Oy~P+?jO!T*[O~P$3tO!T*^O~P!7zO_)qO!n&Vi~O_#{O!o#zO~O_$lO!c$iO!t$jO!v$kO~O_*`Oo%}Xr%}X~Oo%}Xr%}X~P!@ROo*aOr)SO~Ov*bOhuih!airuir!ai~P!@RO%o*cO~O_*OOh*dO~O!T*fO~O!T*hO~P$3tOP$P!RQ#caR$P!RS#caT$P!RU$P!RV#caW#caX#caY#ca_$P!R`$P!Ra$P!Rb$P!Rc$P!Rd$P!Re$P!Rf$P!Rn$P!Rp$P!Rs$P!Rw$P!Rx$P!Ry$P!Rz$P!R{$P!R|$P!R!O$P!R!V$P!R!X$P!R!_#ca!c$P!R!f$P!R!m#ca!o$P!R!t#ca!v#ca!x#ca!z$P!R!{#ca!|#ca!}#ca#O#ca#P#ca#R$P!R#S$P!R#W$P!R#f#ca#g#ca#i#ca#k$P!R#l$P!R#n$P!R#r$P!R#x$P!R#{$P!R$Q$P!R$X$P!R$Y$P!R$Z$P!R$[$P!R$]$P!R$^$P!R$_$P!R$`$P!R$a$P!R$b$P!R$c$P!R$d$P!R$e$P!R$f$P!R$g$P!R$h$P!R$i$P!R$j$P!R$k$P!R$l$P!R$m$P!R$n$P!R$o$P!R$p$P!R$q$P!R$r$P!R$s$P!R$t$P!R$u$P!R$v$P!R$w$P!R$x$P!R$y$P!R$z$P!R${$P!R$|$P!R$}$P!R%O$P!R%P$P!R%Q$P!R%R$P!R%S$P!R%T$P!R%U$P!R%V$P!R%W$P!R%X$P!R%Y$P!R%q#ca%r#ca%y$P!R&P$P!R&Q$P!R&W$P!R&Z$P!R~O!T#ca%n$P!Rh$P!R~P+IrO_)qO~O_*iO~O_*OO~OP#q!ZR#q!ZT#q!ZU#q!Z_#q!Z`#q!Za#q!Zb#q!Zc#q!Zd#q!Ze#q!Zf#q!Zn#q!Zw#q!Zx#q!Zy#q!Zz#q!Z{#q!Z|#q!Z!X#q!Z!f#q!Z!o#q!Z#R#q!Z#S#q!Z#W#q!Z#r#q!Z#x#q!Z#{#q!Z$Q#q!Z$X#q!Z$Y#q!Z$Z#q!Z$[#q!Z$]#q!Z$^#q!Z$_#q!Z$`#q!Z$a#q!Z$b#q!Z$c#q!Z$d#q!Z$e#q!Z$f#q!Z$g#q!Z$h#q!Z$i#q!Z$j#q!Z$k#q!Z$l#q!Z$m#q!Z$n#q!Z$o#q!Z$p#q!Z$q#q!Z$r#q!Z$s#q!Z$t#q!Z$u#q!Z$v#q!Z$w#q!Z$x#q!Z$y#q!Z$z#q!Z${#q!Z$|#q!Z$}#q!Z%O#q!Z%P#q!Z%Q#q!Z%R#q!Z%S#q!Z%T#q!Z%U#q!Z%V#q!Z%W#q!Z%X#q!Z%Y#q!Z%n#q!Z%y#q!Z&Q#q!Z&Z#q!Zh#q!Z!S#q!Z!T#q!Z!h#q!Z!k#q!Z!Q#q!Z!Z#q!Z!]#q!Z~P#CQOP$P!ZQ#ciR$P!ZS#ciT$P!ZU$P!ZV#ciW#ciX#ciY#ci_$P!Z`$P!Za$P!Zb$P!Zc$P!Zd$P!Ze$P!Zf$P!Zn$P!Zp$P!Zs$P!Zw$P!Zx$P!Zy$P!Zz$P!Z{$P!Z|$P!Z!O$P!Z!V$P!Z!X$P!Z!_#ci!c$P!Z!f$P!Z!m#ci!o$P!Z!t#ci!v#ci!x#ci!z$P!Z!{#ci!|#ci!}#ci#O#ci#P#ci#R$P!Z#S$P!Z#W$P!Z#f#ci#g#ci#i#ci#k$P!Z#l$P!Z#n$P!Z#r$P!Z#x$P!Z#{$P!Z$Q$P!Z$X$P!Z$Y$P!Z$Z$P!Z$[$P!Z$]$P!Z$^$P!Z$_$P!Z$`$P!Z$a$P!Z$b$P!Z$c$P!Z$d$P!Z$e$P!Z$f$P!Z$g$P!Z$h$P!Z$i$P!Z$j$P!Z$k$P!Z$l$P!Z$m$P!Z$n$P!Z$o$P!Z$p$P!Z$q$P!Z$r$P!Z$s$P!Z$t$P!Z$u$P!Z$v$P!Z$w$P!Z$x$P!Z$y$P!Z$z$P!Z${$P!Z$|$P!Z$}$P!Z%O$P!Z%P$P!Z%Q$P!Z%R$P!Z%S$P!Z%T$P!Z%U$P!Z%V$P!Z%W$P!Z%X$P!Z%Y$P!Z%q#ci%r#ci%y$P!Z&P$P!Z&Q$P!Z&W$P!Z&Z$P!Z~O!T#ci%n$P!Zh$P!Z~P,)kOv*bOh!air!ai~P!@ROPtaP#`aQtaQ#`aRtaR#`aStaS#`aTtaT#`aUtaU#`aVtaV#`aWtaW#`aXtaX#`aYtaY#`a_ta_#`a`ta`#`aataa#`abtab#`actac#`adtad#`aetae#`aftaf#`antan#`aptap#`astas#`av#`awtaw#`axtax#`aytay#`aztaz#`a{ta{#`a|ta|#`a!Ota!O#`a!Sta!S#`a!Tta!T#`a!Vta!V#`a!Xta!X#`a!]#`a!_ta!_#`a!cta!c#`a!fta!f#`a!mta!m#`a!ota!o#`a!tta!t#`a!vta!v#`a!xta!x#`a!zta!z#`a!{ta!{#`a!|ta!|#`a!}ta!}#`a#Ota#O#`a#Pta#P#`a#Rta#R#`a#Sta#S#`a#Wta#W#`a#fta#f#`a#gta#g#`a#ita#i#`a#kta#k#`a#lta#l#`a#nta#n#`a#rta#r#`a#xta#x#`a#{ta#{#`a$Qta$Q#`a$Xta$X#`a$Yta$Y#`a$Zta$Z#`a$[ta$[#`a$]ta$]#`a$^ta$^#`a$_ta$_#`a$`ta$`#`a$ata$a#`a$bta$b#`a$cta$c#`a$dta$d#`a$eta$e#`a$fta$f#`a$gta$g#`a$hta$h#`a$ita$i#`a$jta$j#`a$kta$k#`a$lta$l#`a$mta$m#`a$nta$n#`a$ota$o#`a$pta$p#`a$qta$q#`a$rta$r#`a$sta$s#`a$tta$t#`a$uta$u#`a$vta$v#`a$wta$w#`a$xta$x#`a$yta$y#`a$zta$z#`a${ta${#`a$|ta$|#`a$}ta$}#`a%Ota%O#`a%Pta%P#`a%Qta%Q#`a%Rta%R#`a%Sta%S#`a%Tta%T#`a%Uta%U#`a%Vta%V#`a%Wta%W#`a%Xta%X#`a%Yta%Y#`a%qta%q#`a%rta%r#`a%yta%y#`a&Pta&P#`a&Qta&Q#`a&Wta&W#`a&Zta&Z#`a!Q#`a~O!]ta~P,1gOPtaP#`aQtaQ#`aRtaR#`aStaS#`aTtaT#`aUtaU#`aVtaV#`aWtaW#`aXtaX#`aYtaY#`a_ta_#`a`ta`#`aataa#`abtab#`actac#`adtad#`aetae#`aftaf#`antan#`aptap#`astas#`awtaw#`axtax#`aytay#`aztaz#`a{ta{#`a|ta|#`a!Ota!O#`a!Q#`a!S#`a!Tta!T#`a!Vta!V#`a!Xta!X#`a!_ta!_#`a!cta!c#`a!fta!f#`a!mta!m#`a!ota!o#`a!tta!t#`a!vta!v#`a!xta!x#`a!zta!z#`a!{ta!{#`a!|ta!|#`a!}ta!}#`a#Ota#O#`a#Pta#P#`a#Rta#R#`a#Sta#S#`a#Wta#W#`a#fta#f#`a#gta#g#`a#ita#i#`a#kta#k#`a#lta#l#`a#nta#n#`a#rta#r#`a#xta#x#`a#{ta#{#`a$Qta$Q#`a$Xta$X#`a$Yta$Y#`a$Zta$Z#`a$[ta$[#`a$]ta$]#`a$^ta$^#`a$_ta$_#`a$`ta$`#`a$ata$a#`a$bta$b#`a$cta$c#`a$dta$d#`a$eta$e#`a$fta$f#`a$gta$g#`a$hta$h#`a$ita$i#`a$jta$j#`a$kta$k#`a$lta$l#`a$mta$m#`a$nta$n#`a$ota$o#`a$pta$p#`a$qta$q#`a$rta$r#`a$sta$s#`a$tta$t#`a$uta$u#`a$vta$v#`a$wta$w#`a$xta$x#`a$yta$y#`a$zta$z#`a${ta${#`a$|ta$|#`a$}ta$}#`a%Ota%O#`a%Pta%P#`a%Qta%Q#`a%Rta%R#`a%Sta%S#`a%Tta%T#`a%Uta%U#`a%Vta%V#`a%Wta%W#`a%Xta%X#`a%Yta%Y#`a%qta%q#`a%rta%r#`a%yta%y#`a&Pta&P#`a&Qta&Q#`a&Wta&W#`a&Zta&Z#`av#`a!]#`a~O!Qta~P,1gO_&gO~Op!`O#n!_OQ#QaS#QaV#QaW#QaX#QaY#Qas#Qa!O#Qa!V#Qa!_#Qa!c#Qa!t#Qa!v#Qa!z#Qa!{#Qa!|#Qa!}#Qa#O#Qa#P#Qa#f#Qa#g#Qa#i#Qa#k#Qa#l#Qa%q#Qa%r#Qa&P#Qa&W#Qa!S#Qa!T#Qa~O!m#tO!x*oOo#Qar#Qa!n#Qa!Z#Qa!]#Qah#Qa%o#Qav#Qa~P-!ROr!qX!n!qX~P!@RO_$RO!o!cO~OQ+uOS+uOp!`O!c+uO!m#tO!t+uO!x*oO#n!_OV!yiW!yiX!yiY!yio!yir!yis!yi!O!yi!V!yi!_!yi!v!yi!{!yi!|!yi!}!yi#O!yi#P!yi#f!yi#g!yi#i!yi#k!yi#l!yi%q!yi%r!yi&W!yi!n!yi!S!yi!T!yi!Z!yi!]!yih!yi%o!yiv!yi~O!z!yi&P!yi~P-%_Op!`O!m#tO!t+uO!x*oO#n!_OV!yiW!yiX!yiY!yio!yir!yis!yi!O!yi!V!yi!_!yi!v!yi!{!yi!|!yi!}!yi#O!yi#P!yi#f!yi#g!yi#i!yi#k!yi#l!yi%q!yi%r!yi&W!yi!n!yi!S!yi!T!yi!Z!yi!]!yih!yi%o!yiv!yi~OQ!yiS!yi!c!yi!z!yi&P!yi~P-(XO!z+tO&P+tO~P-%_OQ+uOS+uOp!`O!c+uO!m#tO!t+uO!x*oO!z+tO#n!_O%q+vO%r+vO&P+tOV!yiW!yiX!yiY!yio!yir!yis!yi!O!yi!V!yi!_!yi!{!yi!|!yi!}!yi#O!yi#P!yi#f!yi#g!yi#i!yi#k!yi#l!yi&W!yi!n!yi!S!yi!T!yi!Z!yi!]!yih!yi%o!yiv!yi~O!v!yi~P-+]O!v+wO~P-+]OQ+uOS+uOp!`O!_+xO!c+uO!m#tO!t+uO!v+wO!x*oO!z+tO!{+xO#f+{O#g+{O#n!_O%q+vO%r+vO&P+tOo!yir!yis!yi!O!yi!V!yi!}!yi#O!yi#P!yi#i!yi#k!yi#l!yi&W!yi!n!yi!S!yi!T!yi!Z!yi!]!yih!yi%o!yiv!yi~OV!yiW!yiX!yiY!yi!|!yi~P-.^OV+yOW+yOX+yOY+yO!|+yO~P-.^OQ+uOS+uO!_+xO!c+uO!m#tO!t+uO!v+wO!x*oO!z+tO!{+xO#f+{O#g+{O%q+vO%r+vO&P+tOo#ei!n#ei%o#ei~P&#nOQ+uOS+uOV+yOW+yOX+yOY+yOp!`O!O+|O!V+|O!_+xO!c+uO!m#tO!t+uO!v+wO!x*oO!z+tO!{+xO!|+yO!}+zO#O+zO#P+zO#f+{O#g+{O#i-fO#k+|O#l+|O#n!_O%q+vO%r+vO&P+tO~Oo#jir#jis#ji&W#ji!n#ji!S#ji!T#ji!Z#ji!]#jih#ji%o#jiv#ji~P-2wO!h&|OP$RiR$RiT$RiU$Ri_$Ri`$Ria$Rib$Ric$Rid$Rie$Rif$Rin$Riw$Rix$Riy$Riz$Ri{$Ri|$Ri!S$Ri!T$Ri!X$Ri!f$Ri!h$Ri!k$Ri!o$Ri#R$Ri#S$Ri#W$Ri#r$Ri#x$Ri#{$Ri$Q$Ri$X$Ri$Y$Ri$Z$Ri$[$Ri$]$Ri$^$Ri$_$Ri$`$Ri$a$Ri$b$Ri$c$Ri$d$Ri$e$Ri$f$Ri$g$Ri$h$Ri$i$Ri$j$Ri$k$Ri$l$Ri$m$Ri$n$Ri$o$Ri$p$Ri$q$Ri$r$Ri$s$Ri$t$Ri$u$Ri$v$Ri$w$Ri$x$Ri$y$Ri$z$Ri${$Ri$|$Ri$}$Ri%O$Ri%P$Ri%Q$Ri%R$Ri%S$Ri%T$Ri%U$Ri%V$Ri%W$Ri%X$Ri%Y$Ri%y$Ri&Q$Ri&Z$Ri~P#CQOr!ra!n!ra~P!@ROr!sa!n!sa~P!@ROr!ua!n!ua~P!@ROP%_aR%_aT%_aU%_a_%_a`%_aa%_ab%_ac%_ad%_ae%_af%_an%_ar%_aw%_ax%_ay%_az%_a{%_a|%_a!S%_a!T%_a!X%_a!Z%_a!f%_a!o%_a#R%_a#S%_a#W%_a#r%_a#x%_a#{%_a$Q%_a$X%_a$Y%_a$Z%_a$[%_a$]%_a$^%_a$_%_a$`%_a$a%_a$b%_a$c%_a$d%_a$e%_a$f%_a$g%_a$h%_a$i%_a$j%_a$k%_a$l%_a$m%_a$n%_a$o%_a$p%_a$q%_a$r%_a$s%_a$t%_a$u%_a$v%_a$w%_a$x%_a$y%_a$z%_a${%_a$|%_a$}%_a%O%_a%P%_a%Q%_a%R%_a%S%_a%T%_a%U%_a%V%_a%W%_a%X%_a%Y%_a%y%_a&Q%_a&Z%_a%n%_ah%_a!h%_a!k%_a!Q%_a!]%_a~P#CQOr!wi!n!wi~P!@RO!m*rO!x!SOP#QaR#QaT#QaU#Qa_#Qa`#Qaa#Qab#Qac#Qad#Qae#Qaf#Qan#Qaw#Qax#Qay#Qaz#Qa{#Qa|#Qa!Q!yi!X#Qa!f#Qa!o#Qa#R#Qa#S#Qa#W#Qa#r#Qa#x#Qa#{#Qa$Q#Qa$X#Qa$Y#Qa$Z#Qa$[#Qa$]#Qa$^#Qa$_#Qa$`#Qa$a#Qa$b#Qa$c#Qa$d#Qa$e#Qa$f#Qa$g#Qa$h#Qa$i#Qa$j#Qa$k#Qa$l#Qa$m#Qa$n#Qa$o#Qa$p#Qa$q#Qa$r#Qa$s#Qa$t#Qa$u#Qa$v#Qa$w#Qa$x#Qa$y#Qa$z#Qa${#Qa$|#Qa$}#Qa%O#Qa%P#Qa%Q#Qa%R#Qa%S#Qa%T#Qa%U#Qa%V#Qa%W#Qa%X#Qa%Y#Qa%y#Qa&Q#Qa&Z#Qav!yi!]!yi~P-!ROp!`O!m*rO!x!SO#n!_OP#QaQ#QaR#QaS#QaT#QaU#QaV#QaW#QaX#QaY#Qa_#Qa`#Qaa#Qab#Qac#Qad#Qae#Qaf#Qan#Qas#Qaw#Qax#Qay#Qaz#Qa{#Qa|#Qa!O#Qa!T#Qa!V#Qa!X#Qa!_#Qa!c#Qa!f#Qa!o#Qa!t#Qa!v#Qa!z#Qa!{#Qa!|#Qa!}#Qa#O#Qa#P#Qa#R#Qa#S#Qa#W#Qa#f#Qa#g#Qa#i#Qa#k#Qa#l#Qa#r#Qa#x#Qa#{#Qa$Q#Qa$X#Qa$Y#Qa$Z#Qa$[#Qa$]#Qa$^#Qa$_#Qa$`#Qa$a#Qa$b#Qa$c#Qa$d#Qa$e#Qa$f#Qa$g#Qa$h#Qa$i#Qa$j#Qa$k#Qa$l#Qa$m#Qa$n#Qa$o#Qa$p#Qa$q#Qa$r#Qa$s#Qa$t#Qa$u#Qa$v#Qa$w#Qa$x#Qa$y#Qa$z#Qa${#Qa$|#Qa$}#Qa%O#Qa%P#Qa%Q#Qa%R#Qa%S#Qa%T#Qa%U#Qa%V#Qa%W#Qa%X#Qa%Y#Qa%q#Qa%r#Qa%y#Qa&P#Qa&Q#Qa&W#Qa&Z#Qav!yi!]!yi~O!Q!yi!S!yi~P-GuO!Q#Qa!S#Qa~P-GuO!Q%RO~P)(yOp!`O!O%SO!Q%RO!S#RO!V%VO!c%OO!z$}O#k%WO#l%XO#n%PO&P$}OP#jiR#jiT#jiU#ji_#ji`#jia#jib#jic#jid#jie#jif#jin#jis#jiw#jix#jiy#jiz#ji{#ji|#ji!T#ji!X#ji!f#ji!o#ji#R#ji#S#ji#W#ji#r#ji#x#ji#{#ji$Q#ji$X#ji$Y#ji$Z#ji$[#ji$]#ji$^#ji$_#ji$`#ji$a#ji$b#ji$c#ji$d#ji$e#ji$f#ji$g#ji$h#ji$i#ji$j#ji$k#ji$l#ji$m#ji$n#ji$o#ji$p#ji$q#ji$r#ji$s#ji$t#ji$u#ji$v#ji$w#ji$x#ji$y#ji$z#ji${#ji$|#ji$}#ji%O#ji%P#ji%Q#ji%R#ji%S#ji%T#ji%U#ji%V#ji%W#ji%X#ji%Y#ji%y#ji&Q#ji&W#ji&Z#ji~P*?YOp!`O!O,VO!S#RO!V-RO!c%OO!z$}O#k-TO#l-VO#n%PO&P$}OP#jiR#jiT#jiU#ji_#ji`#jia#jib#jic#jid#jie#jif#jin#jis#jiw#jix#jiy#jiz#ji{#ji|#ji!T#ji!X#ji!f#ji!o#ji#R#ji#S#ji#W#ji#r#ji#x#ji#{#ji$Q#ji$X#ji$Y#ji$Z#ji$[#ji$]#ji$^#ji$_#ji$`#ji$a#ji$b#ji$c#ji$d#ji$e#ji$f#ji$g#ji$h#ji$i#ji$j#ji$k#ji$l#ji$m#ji$n#ji$o#ji$p#ji$q#ji$r#ji$s#ji$t#ji$u#ji$v#ji$w#ji$x#ji$y#ji$z#ji${#ji$|#ji$}#ji%O#ji%P#ji%Q#ji%R#ji%S#ji%T#ji%U#ji%V#ji%W#ji%X#ji%Y#ji%y#ji&Q#ji&W#ji&Z#ji~P*?YO!S#}q!T#}q!h#}q!k#}q!Z#}q!Q#cav#ca!]#ca~P*.uO!Q#ca!S#ca!T#}qv#ca!]#ca~P*.uO!Q#}q!S#}q!T#}qv#ca!]#ca~P*.uOv#ca!S#}q!T#}q!]#}q~P*.uO!S$Oq!T$Oq!h$Oq!k$Oq!Z$Oq!Q#cav#ca!]#ca~P*6kO!Q#ca!S#ca!T$Oqv#ca!]#ca~P*6kO!Q$Oq!S$Oq!T$Oqv#ca!]#ca~P*6kOv#ca!S$Oq!T$Oq!]$Oq~P*6kOQ+uOS+uOV+yOW+yOX+yOY+yOp!`O!_+xO!c+uO!m#tO!t+uO!v+wO!x*oO!z+tO!{+xO!|+yO!}+zO#O+zO#P+zO#f+{O#g+{O#i-fO#n!_O%q+vO%r+vO&P+tO~Oo#hyr#hys#hy!O#hy!V#hy#k#hy#l#hy&W#hy!n#hy!S#hy!T#hy!Z#hy!]#hyh#hy%o#hyv#hy~P.1xO!S#}y!T#}y!h#}y!k#}y!Z#}y!Q#civ#ci!]#ci~P+7{O!Q#ci!S#ci!T#}yv#ci!]#ci~P+7{O!Q#}y!S#}y!T#}yv#ci!]#ci~P+7{Ov#ci!S#}y!T#}y!]#}y~P+7{O!S$Oy!T$Oy!h$Oy!k$Oy!Z$Oy!Q#civ#ci!]#ci~P+?jO!Q#ci!S#ci!T$Oyv#ci!]#ci~P+?jO!Q$Oy!S$Oy!T$Oyv#ci!]#ci~P+?jOv#ci!S$Oy!T$Oy!]$Oy~P+?jO!S$P!R!T$P!R!h$P!R!k$P!R!Q$P!R!Z$P!R!]$P!R~P+IrO!S$P!Z!T$P!Z!h$P!Z!k$P!Z!Q$P!Z!Z$P!Z!]$P!Z~P,)kOh*kO~P*SOh*lO~P*SOh*mO~P*SOh*nO~P*SO!T+[O~P!7zO!T+]O~P!7zO!T+^O~P!7zO!T+_O~P!7zO!T+`O~P!7zO!T+aO~P!7zO!T+bO~P!7zO!T+cO~P!7zO!O-QO!V-gO!c%OO!z,UO#k-hO#l-iO#n%PO&P,UO~P&,ROp!`O!O,VO!V-RO!c%OO!z$}O#k-TO#l-VO#n%PO&P$}OP#jiR#jiT#jiU#ji_#ji`#jia#jib#jic#jid#jie#jif#jin#jis#jiw#jix#jiy#jiz#ji{#ji|#ji!S#ji!T#ji!X#ji!f#ji!o#ji#R#ji#S#ji#W#ji#r#ji#x#ji#{#ji$Q#ji$X#ji$Y#ji$Z#ji$[#ji$]#ji$^#ji$_#ji$`#ji$a#ji$b#ji$c#ji$d#ji$e#ji$f#ji$g#ji$h#ji$i#ji$j#ji$k#ji$l#ji$m#ji$n#ji$o#ji$p#ji$q#ji$r#ji$s#ji$t#ji$u#ji$v#ji$w#ji$x#ji$y#ji$z#ji${#ji$|#ji$}#ji%O#ji%P#ji%Q#ji%R#ji%S#ji%T#ji%U#ji%V#ji%W#ji%X#ji%Y#ji%y#ji&Q#ji&W#ji&Z#ji~P*?YOp!`O!O-]O!V-SO!c%OO!z,SO#k-kO#l-lO#n%PO&P,SOP#jiR#jiT#jiU#ji_#ji`#jia#jib#jic#jid#jie#jif#jin#jis#jiv#jiw#jix#jiy#jiz#ji{#ji|#ji!S#ji!T#ji!X#ji!]#ji!f#ji!o#ji#R#ji#S#ji#W#ji#r#ji#x#ji#{#ji$Q#ji$X#ji$Y#ji$Z#ji$[#ji$]#ji$^#ji$_#ji$`#ji$a#ji$b#ji$c#ji$d#ji$e#ji$f#ji$g#ji$h#ji$i#ji$j#ji$k#ji$l#ji$m#ji$n#ji$o#ji$p#ji$q#ji$r#ji$s#ji$t#ji$u#ji$v#ji$w#ji$x#ji$y#ji$z#ji${#ji$|#ji$}#ji%O#ji%P#ji%Q#ji%R#ji%S#ji%T#ji%U#ji%V#ji%W#ji%X#ji%Y#ji%y#ji&Q#ji&W#ji&Z#ji~P*?YOp!`O!O,VO!V-RO!c%OO!z,TO#k-TO#l-VO#n%PO&P,TOP#jiR#jiT#jiU#ji_#ji`#jia#jib#jic#jid#jie#jif#jin#jis#jiw#jix#jiy#jiz#ji{#ji|#ji!S#ji!T#ji!X#ji!f#ji!o#ji#R#ji#S#ji#W#ji#r#ji#x#ji#{#ji$Q#ji$X#ji$Y#ji$Z#ji$[#ji$]#ji$^#ji$_#ji$`#ji$a#ji$b#ji$c#ji$d#ji$e#ji$f#ji$g#ji$h#ji$i#ji$j#ji$k#ji$l#ji$m#ji$n#ji$o#ji$p#ji$q#ji$r#ji$s#ji$t#ji$u#ji$v#ji$w#ji$x#ji$y#ji$z#ji${#ji$|#ji$}#ji%O#ji%P#ji%Q#ji%R#ji%S#ji%T#ji%U#ji%V#ji%W#ji%X#ji%Y#ji%y#ji&Q#ji&W#ji&Z#ji~P*?YOp!`O!O,WO!V,XO!c%OO!z$}O#k-UO#l-WO#n%PO&P$}OP#jiR#jiT#jiU#ji_#ji`#jia#jib#jic#jid#jie#jif#jin#jis#jiw#jix#jiy#jiz#ji{#ji|#ji!T#ji!X#ji!f#ji!o#ji#R#ji#S#ji#W#ji#r#ji#x#ji#{#ji$Q#ji$X#ji$Y#ji$Z#ji$[#ji$]#ji$^#ji$_#ji$`#ji$a#ji$b#ji$c#ji$d#ji$e#ji$f#ji$g#ji$h#ji$i#ji$j#ji$k#ji$l#ji$m#ji$n#ji$o#ji$p#ji$q#ji$r#ji$s#ji$t#ji$u#ji$v#ji$w#ji$x#ji$y#ji$z#ji${#ji$|#ji$}#ji%O#ji%P#ji%Q#ji%R#ji%S#ji%T#ji%U#ji%V#ji%W#ji%X#ji%Y#ji%y#ji&Q#ji&W#ji&Z#ji~P*?YO!T+eO~P$3tO!T+fO~P$3tO!T+gO~P$3tO!T+hO~P$3tO!T+iO~P$3tO!T+jO~P$3tO!T+kO~P$3tO!T+lO~P$3tO!T+mO~P!7zO!T+nO~P$3tOp!`O!O-QO!Q%RO!V-gO!c%OO!z,UO#k-hO#l-iO#n%PO&P,UOP#jiR#jiT#jiU#ji_#ji`#jia#jib#jic#jid#jie#jif#jin#jis#jiv#jiw#jix#jiy#jiz#ji{#ji|#ji!S#ji!T#ji!X#ji!]#ji!f#ji!o#ji#R#ji#S#ji#W#ji#r#ji#x#ji#{#ji$Q#ji$X#ji$Y#ji$Z#ji$[#ji$]#ji$^#ji$_#ji$`#ji$a#ji$b#ji$c#ji$d#ji$e#ji$f#ji$g#ji$h#ji$i#ji$j#ji$k#ji$l#ji$m#ji$n#ji$o#ji$p#ji$q#ji$r#ji$s#ji$t#ji$u#ji$v#ji$w#ji$x#ji$y#ji$z#ji${#ji$|#ji$}#ji%O#ji%P#ji%Q#ji%R#ji%S#ji%T#ji%U#ji%V#ji%W#ji%X#ji%Y#ji%y#ji&Q#ji&W#ji&Z#ji~P*?YO$S+}OP%xXQ%xXR%xXS%xXT%xXU%xXV%xXW%xXX%xXY%xX_%xX`%xXa%xXb%xXc%xXd%xXe%xXf%xXn%xXp%xXs%xXw%xXx%xXy%xXz%xX{%xX|%xX!O%xX!S%xX!T%xX!V%xX!X%xX!_%xX!c%xX!f%xX!h%xX!k%xX!m%xX!o%xX!t%xX!v%xX!x%xX!z%xX!{%xX!|%xX!}%xX#O%xX#P%xX#R%xX#S%xX#W%xX#f%xX#g%xX#i%xX#k%xX#l%xX#n%xX#r%xX#x%xX#{%xX$Q%xX$X%xX$Y%xX$Z%xX$[%xX$]%xX$^%xX$_%xX$`%xX$a%xX$b%xX$c%xX$d%xX$e%xX$f%xX$g%xX$h%xX$i%xX$j%xX$k%xX$l%xX$m%xX$n%xX$o%xX$p%xX$q%xX$r%xX$s%xX$t%xX$u%xX$v%xX$w%xX$x%xX$y%xX$z%xX${%xX$|%xX$}%xX%O%xX%P%xX%Q%xX%R%xX%S%xX%T%xX%U%xX%V%xX%W%xX%X%xX%Y%xX%q%xX%r%xX%y%xX&P%xX&Q%xX&W%xX&Z%xX~Or$VX~P/.aO%o,RO~P*%ZO%o,bO~P!@RO!O-QO!V-gO!c%OO!z,SO#k-hO#l-iO#n%PO&P,SO~P&,RO!O-QO!V-gO!c%OO!z,TO#k-hO#l-iO#n%PO&P,TO~P&,ROp!`O!O-]O!V-SO!c%OO!z,TO#k-kO#l-lO#n%PO&P,TOP#jiR#jiT#jiU#ji_#ji`#jia#jib#jic#jid#jie#jif#jin#jis#jiv#jiw#jix#jiy#jiz#ji{#ji|#ji!S#ji!T#ji!X#ji!]#ji!f#ji!o#ji#R#ji#S#ji#W#ji#r#ji#x#ji#{#ji$Q#ji$X#ji$Y#ji$Z#ji$[#ji$]#ji$^#ji$_#ji$`#ji$a#ji$b#ji$c#ji$d#ji$e#ji$f#ji$g#ji$h#ji$i#ji$j#ji$k#ji$l#ji$m#ji$n#ji$o#ji$p#ji$q#ji$r#ji$s#ji$t#ji$u#ji$v#ji$w#ji$x#ji$y#ji$z#ji${#ji$|#ji$}#ji%O#ji%P#ji%Q#ji%R#ji%S#ji%T#ji%U#ji%V#ji%W#ji%X#ji%Y#ji%y#ji&Q#ji&W#ji&Z#ji~P*?YO!]-jO~O_-mO~O[Zed`abc_n!|#nv#W$S!z#S#v#u#g#f!x!m!t!c!v#W~", + goto: "!=_&ZPPPPPPPPPPPPPP&[PPPPPPPP(mP,}P-RPPPPP-UPP(m1zPPPPPPP2XP7PP7YPP2XP8dPh?P?^?^P?^P?^P-UPPPPPP-UPP(m?g(mP?k?}@W@W@W@W@W@_EmFV@_F]-UPP-UP-UPPKyPKy-U!!sP!$p!%PPP!!sP!%V!!sP!%]&[&[!!sP&[P!%`&[!%d!!sPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP!!s!'x!)u!-l!-r!.U!.[!.i!.s!.}!/T!/_!/w!/}!0X!0_!0e!0k!0uPPPPPPPPP!0{!3^PP!<[! nil true false self return yield IfStatement if ElsifClause elsif ElseClause else end UnlessStatement unless CaseStatement case WhenClause when InClause in PinExpression ^ HashPattern HashPatternPair FindPattern * PatternBinding BeginBlock begin RescueClause rescue ExceptionList EnsureClause ensure MethodCall . ) ( ArgList Arg SplatArg DoubleSplatArg ** BlockArg & KeywordArg &. BinaryExpression ArithOp | CompareOp LogicOp and or UnaryExpression not ~ ParenExpression BlockPassExpression Lambda -> ParamList Param SplatParam DoubleSplatParam BlockParam KeywordParam DefaultParam Block BlockParams DestructuredParam DoBlock do Range .. ... TernaryExpression ? ConditionalModifier while until ScopeResolution :: SubscriptExpression BlockCall MethodDef def MethodBody OperatorMethodName [] []= ClassDef class ClassBody ModuleDef module ModuleBody WhileStatement UntilStatement ForStatement for Assignment AssignOp InlineRescue MultipleAssignment AssignmentTarget BareMethodCall puts print p warn fail require require_relative load autoload include extend prepend attr_reader attr_writer attr_accessor public private protected module_function alias alias_method using throw catch gem source group validates validate has_many has_one belongs_to before_action after_action around_action before_create before_save after_create after_save render redirect_to delegate scope enum task desc namespace raise Super super", + maxTerm: 241, nodeProps: [ ["isolate", 23,""], - ["openedBy", 24,"{",27,"InterpolationStart",31,"[",72,"("], - ["closedBy", 26,"InterpolationEnd",32,"]",35,"}",73,")"] + ["openedBy", 24,"{",27,"InterpolationStart",31,"[",76,"("], + ["closedBy", 26,"InterpolationEnd",32,"]",35,"}",77,")"] ], skippedNodes: [0,11,12], - repeatNodeCount: 15, - tokenData: "5i~RvXY#iYZ#i]^#ipq#iqr#zrs$[st$atu${uv&tvw'Pwx'lxy)Yyz)_z{)d{|)w|}*P}!O*U!O!P*f!P!Q&t!Q![*{![!]+r!]!^+}!^!_,S!_!`,c!`!a0V!a!b0]!b!c1p!c!}3P!}#O3b#O#P3w#P#Q4S#Q#R4X#R#S4a#T#o4a#o#p4}#p#q5S#q#r5_#r#s5d~#nS%o~XY#iYZ#i]^#ipq#i~$PQ%z~!_!`$V#r#s$V~$[O!y~~$aO%t~~$fTZ~OY$aZ]$a^;'S$a;'S;=`$u<%lO$a~$xP;=`<%l$a~%Odqr&^tu&^vw&^z{&^|}&^!O!P&^!P!Q&^!Q![&c![!]&^!]!^&^!^!_&^!`!a&^!a!b&^!b!c&^!c!}&c#O#P&^#R#S&c#S#T&^#T#o&c#r#s&^~&cOb~~&hSb~!Q![&c!c!}&c#R#S&c#T#o&cQ&wP!_!`&zQ'PO$PQ~'UR!s~vw'_!O!P'g!_!`&z~'dP!z~!_!`&z~'lO!u~~'oVOw'lwx(Ux#O'l#O#P(Z#P;'S'l;'S;=`)S<%lO'l~(ZOf~~(^RO;'S'l;'S;=`(g;=`O'l~(jWOw'lwx(Ux#O'l#O#P(Z#P;'S'l;'S;=`)S;=`<%l'l<%lO'l~)VP;=`<%l'l~)_O!k~~)dO!j~~)iQ!o~z{)o!_!`&z~)tP!q~!_!`&z~)|P!w~!_!`&z~*UOr~~*ZQ%y~!_!`&z!`!a*a~*fO#T~~*kP!i~!O!P*n~*sP#c~!O!P*v~*{O#d~~+QRd~!O!P+Z!Q![*{#R#S+l~+^P!Q![+a~+fQe~!Q![+a#R#S+Z~+oP!Q![*{~+uP![!]+x~+}O#k~~,SO%p~~,VQ!^!_&t!_!`,]~,`P!`!a$V~,jS%|[$PQ!_!`,v!`!a-O#U#V-T#r#s$V~,{P!y~!_!`$VQ-TOvQ~-WP#X#Y-Z~-^P#Z#[-a~-dP#]#^-g~-jP#b#c-m~-pTO!_-m!_!`.P!`;'S-m;'S;=`0P<%lO-m~.SVO!_-m!_!`.P!`#X-m#X#Y.i#Y;'S-m;'S;=`0P<%lO-m~.lVO!_-m!_!`.P!`#b-m#b#c/R#c;'S-m;'S;=`0P<%lO-m~/UVO!_-m!_!`.P!`#W-m#W#X/k#X;'S-m;'S;=`0P<%lO-m~/pT[~O!_-m!_!`.P!`;'S-m;'S;=`0P<%lO-m~0SP;=`<%l-mQ0YP!`!a&t~0bX#f~OX0}Z]0}^p0}qt0}u#O0}#O#P1S#P;'S0};'S;=`1j<%lO0}~1SOn~~1XRn~O;'S0};'S;=`1b;=`O0}~1gPn~;=`<%l0}~1mP;=`<%l0}~1sS!b!c2P!c!}2n#R#S2n#T#o2n~2SR!c!}2]#R#S2]#T#o2]~2bSa~!Q![2]!c!}2]#R#S2]#T#o2]~2sS`~!Q![2n!c!}2n#R#S2n#T#o2n~3USc~!Q![3P!c!}3P#R#S3P#T#o3P^3gPpY#P#Q3jS3oP#rS!_!`3rS3wO#sS~3zPYZ3}~4SO%q~~4XOo~~4^P!_~!_!`&z~4fU_~qr4x!Q![4a!a!b4x!c!}4a#R#S4a#T#o4a~4}O_~~5SOs~~5XQ!x~!_!`&z#p#q'_~5dOh~~5iO#P~", - tokenizers: [1, 2, 3, regexTokenizer, percentLiteralTokenizer, symbolTokenizer, lessThanTokenizer, greaterThanTokenizer, new LocalTokenGroup("!W~RRrs[sta#O#Pl~aO%u~~dP#o#pg~lOj~~oRO;'Sx;'S;=`};=`Ox~}Ol~~!SPl~;=`<%lx~", 53, 29)], + repeatNodeCount: 17, + tokenData: "5i~RvXY#iYZ#i]^#ipq#iqr#zrs$[st$atu${uv&tvw'Pwx'lxy)Yyz)_z{)d{|)w|}*P}!O*U!O!P*f!P!Q&t!Q![*{![!]+r!]!^+}!^!_,S!_!`,c!`!a0V!a!b0]!b!c1p!c!}3P!}#O3b#O#P3w#P#Q4S#Q#R4X#R#S4a#T#o4a#o#p4}#p#q5S#q#r5_#r#s5d~#nS%t~XY#iYZ#i]^#ipq#i~$PQ&Q~!_!`$V#r#s$V~$[O!|~~$aO%y~~$fTZ~OY$aZ]$a^;'S$a;'S;=`$u<%lO$a~$xP;=`<%l$a~%Odqr&^tu&^vw&^z{&^|}&^!O!P&^!P!Q&^!Q![&c![!]&^!]!^&^!^!_&^!`!a&^!a!b&^!b!c&^!c!}&c#O#P&^#R#S&c#S#T&^#T#o&c#r#s&^~&cOb~~&hSb~!Q![&c!c!}&c#R#S&c#T#o&cQ&wP!_!`&zQ'PO$SQ~'UR!v~vw'_!O!P'g!_!`&z~'dP!}~!_!`&z~'lO!x~~'oVOw'lwx(Ux#O'l#O#P(Z#P;'S'l;'S;=`)S<%lO'l~(ZOf~~(^RO;'S'l;'S;=`(g;=`O'l~(jWOw'lwx(Ux#O'l#O#P(Z#P;'S'l;'S;=`)S;=`<%l'l<%lO'l~)VP;=`<%l'l~)_O!o~~)dO!n~~)iQ!c~z{)o!_!`&z~)tP!t~!_!`&z~)|P!z~!_!`&z~*UOr~~*ZQ&P~!_!`&z!`!a*a~*fO#W~~*kP!m~!O!P*n~*sP#f~!O!P*v~*{O#g~~+QRd~!O!P+Z!Q![*{#R#S+l~+^P!Q![+a~+fQe~!Q![+a#R#S+Z~+oP!Q![*{~+uP![!]+x~+}O#n~~,SO%u~~,VQ!^!_&t!_!`,]~,`P!`!a$V~,jS&S[$SQ!_!`,v!`!a-O#U#V-T#r#s$V~,{P!|~!_!`$VQ-TOvQ~-WP#X#Y-Z~-^P#Z#[-a~-dP#]#^-g~-jP#b#c-m~-pTO!_-m!_!`.P!`;'S-m;'S;=`0P<%lO-m~.SVO!_-m!_!`.P!`#X-m#X#Y.i#Y;'S-m;'S;=`0P<%lO-m~.lVO!_-m!_!`.P!`#b-m#b#c/R#c;'S-m;'S;=`0P<%lO-m~/UVO!_-m!_!`.P!`#W-m#W#X/k#X;'S-m;'S;=`0P<%lO-m~/pT[~O!_-m!_!`.P!`;'S-m;'S;=`0P<%lO-m~0SP;=`<%l-mQ0YP!`!a&t~0bX#i~OX0}Z]0}^p0}qt0}u#O0}#O#P1S#P;'S0};'S;=`1j<%lO0}~1SOn~~1XRn~O;'S0};'S;=`1b;=`O0}~1gPn~;=`<%l0}~1mP;=`<%l0}~1sS!b!c2P!c!}2n#R#S2n#T#o2n~2SR!c!}2]#R#S2]#T#o2]~2bSa~!Q![2]!c!}2]#R#S2]#T#o2]~2sS`~!Q![2n!c!}2n#R#S2n#T#o2n~3USc~!Q![3P!c!}3P#R#S3P#T#o3P^3gPpY#P#Q3jS3oP#uS!_!`3rS3wO#vS~3zPYZ3}~4SO%v~~4XOo~~4^P!_~!_!`&z~4fU_~qr4x!Q![4a!a!b4x!c!}4a#R#S4a#T#o4a~4}O_~~5SOs~~5XQ!{~!_!`&z#p#q'_~5dOh~~5iO#S~", + tokenizers: [1, 2, 3, regexTokenizer, percentLiteralTokenizer, symbolTokenizer, lessThanTokenizer, greaterThanTokenizer, new LocalTokenGroup("!W~RRrs[sta#O#Pl~aO%z~~dP#o#pg~lOj~~oRO;'Sx;'S;=`};=`Ox~}Ol~~!SPl~;=`<%lx~", 53, 29)], topRules: {"Program":[0,13]}, specialized: [{term: 15, get: (value) => spec_Identifier[value] || -1}], - tokenPrec: 28662 + tokenPrec: 30968 }); const rubyHighlighting = styleTags({ @@ -27865,19 +27865,35 @@ function opensBlock(text) { return (INDENT_AFTER.test(text) || INDENT_ASSIGN.test(text) || INDENT_END.test(text)) && !SINGLE_LINE.test(text); } + // Get the text of a line from an IndentContext (respects simulateBreak) + function lineText(cx, lineFrom) { + const line = cx.lineAt(lineFrom); + return line.text; + } + // Find the previous line's start position, or -1 if at the first line. + // Uses cx.lineAt() which respects simulateBreak. + function prevLineFrom(cx, lineFrom) { + if (lineFrom <= 0) + return -1; + const prevLine = cx.lineAt(lineFrom - 1); + return prevLine.from; + } function rubyIndentService(cx, pos) { - const doc = cx.state.doc; - const line = doc.lineAt(pos); + const line = cx.lineAt(pos); const text = line.text; - const lineNum = line.number; + const lineFrom = line.from; // Current line starts with a deindent keyword → find the right level if (DEINDENT_ON.test(text)) { const isEnd = /^\s*end\b/.test(text); // Scan backwards to find the matching opening keyword at the right nesting level let depth = 0; let braceDepth = 0; - for (let i = lineNum - 1; i >= 1; i--) { - const prev = doc.line(i).text; + let scanFrom = lineFrom; + while (true) { + scanFrom = prevLineFrom(cx, scanFrom); + if (scanFrom < 0) + break; + const prev = lineText(cx, scanFrom); // Track } closers for brace-style blocks if (/^\s*\}/.test(prev)) braceDepth++; @@ -27885,7 +27901,7 @@ depth++; else if (INDENT_AFTER.test(prev) || INDENT_ASSIGN.test(prev)) { if (depth === 0) - return cx.lineIndent(doc.line(i).from); + return cx.lineIndent(scanFrom); depth--; } else if (INDENT_END.test(prev)) { @@ -27898,7 +27914,7 @@ else if (!isEnd) { // Non-end keywords (else, rescue, etc.) can match brace openers if (depth === 0) - return cx.lineIndent(doc.line(i).from); + return cx.lineIndent(scanFrom); depth--; } // `end` never closes a `{`, so skip this opener @@ -27906,7 +27922,7 @@ else { // do-style opener if (depth === 0) - return cx.lineIndent(doc.line(i).from); + return cx.lineIndent(scanFrom); depth--; } } @@ -27918,14 +27934,18 @@ const closeChar = text.trim()[0]; const openChar = closeChar === "}" ? "{" : closeChar === "]" ? "[" : "("; let depth = 0; - for (let i = lineNum - 1; i >= 1; i--) { - const prev = doc.line(i).text; + let scanFrom = lineFrom; + while (true) { + scanFrom = prevLineFrom(cx, scanFrom); + if (scanFrom < 0) + break; + const prev = lineText(cx, scanFrom); for (let j = prev.length - 1; j >= 0; j--) { if (prev[j] === closeChar) depth++; else if (prev[j] === openChar) { if (depth === 0) - return cx.lineIndent(doc.line(i).from); + return cx.lineIndent(scanFrom); depth--; } } @@ -27933,16 +27953,16 @@ return 0; } // For blank/new lines: determine indent from previous non-blank line - if (lineNum > 1) { + if (lineFrom > 0) { // Find the previous non-blank line - let prevNum = lineNum - 1; - while (prevNum >= 1 && doc.line(prevNum).text.trim() === "") - prevNum--; - if (prevNum < 1) + let prevFrom = prevLineFrom(cx, lineFrom); + while (prevFrom >= 0 && lineText(cx, prevFrom).trim() === "") { + prevFrom = prevLineFrom(cx, prevFrom); + } + if (prevFrom < 0) return 0; - const prevLine = doc.line(prevNum); - const prevText = prevLine.text; - const prevIndent = cx.lineIndent(prevLine.from); + const prevText = lineText(cx, prevFrom); + const prevIndent = cx.lineIndent(prevFrom); // Previous line opens a block → indent if (opensBlock(prevText)) { return prevIndent + cx.unit; @@ -27966,32 +27986,34 @@ // Previous line starts with dot but current doesn't → chain ended, deindent if (LEADING_DOT.test(prevText)) { // Walk back to find the line that started the chain - let chainStart = prevNum; - while (chainStart > 1) { - let checkNum = chainStart - 1; - while (checkNum >= 1 && doc.line(checkNum).text.trim() === "") - checkNum--; - if (checkNum < 1) + let chainFrom = prevFrom; + while (true) { + let checkFrom = prevLineFrom(cx, chainFrom); + while (checkFrom >= 0 && lineText(cx, checkFrom).trim() === "") { + checkFrom = prevLineFrom(cx, checkFrom); + } + if (checkFrom < 0) break; - if (LEADING_DOT.test(doc.line(checkNum).text)) { - chainStart = checkNum; + if (LEADING_DOT.test(lineText(cx, checkFrom))) { + chainFrom = checkFrom; } else { - chainStart = checkNum; + chainFrom = checkFrom; break; } } - return cx.lineIndent(doc.line(chainStart).from); + return cx.lineIndent(chainFrom); } // Previous line ends with continuation (trailing operator, comma, backslash) if (CONTINUATION.test(prevText)) { // Check if the line before that was also a continuation — if so, stay at same level - if (prevNum > 1) { - let prev2Num = prevNum - 1; - while (prev2Num >= 1 && doc.line(prev2Num).text.trim() === "") - prev2Num--; - if (prev2Num >= 1) { - const prev2Text = doc.line(prev2Num).text; + if (prevFrom > 0) { + let prev2From = prevLineFrom(cx, prevFrom); + while (prev2From >= 0 && lineText(cx, prev2From).trim() === "") { + prev2From = prevLineFrom(cx, prev2From); + } + if (prev2From >= 0) { + const prev2Text = lineText(cx, prev2From); if (CONTINUATION.test(prev2Text) || LEADING_DOT.test(prev2Text)) { return prevIndent; } @@ -28000,32 +28022,34 @@ return prevIndent + cx.unit; } // Previous line is NOT a continuation, but the one before it was → deindent back - if (prevNum > 1) { - let prev2Num = prevNum - 1; - while (prev2Num >= 1 && doc.line(prev2Num).text.trim() === "") - prev2Num--; - if (prev2Num >= 1) { - const prev2Text = doc.line(prev2Num).text; + if (prevFrom > 0) { + let prev2From = prevLineFrom(cx, prevFrom); + while (prev2From >= 0 && lineText(cx, prev2From).trim() === "") { + prev2From = prevLineFrom(cx, prev2From); + } + if (prev2From >= 0) { + const prev2Text = lineText(cx, prev2From); if ((CONTINUATION.test(prev2Text) || LEADING_DOT.test(prev2Text)) && !opensBlock(prev2Text)) { // The continuation chain ended — go back to the original indent level // Walk back to find the start of the chain - let chainStart = prev2Num; - while (chainStart > 1) { - let checkNum = chainStart - 1; - while (checkNum >= 1 && doc.line(checkNum).text.trim() === "") - checkNum--; - if (checkNum < 1) + let chainFrom = prev2From; + while (true) { + let checkFrom = prevLineFrom(cx, chainFrom); + while (checkFrom >= 0 && lineText(cx, checkFrom).trim() === "") { + checkFrom = prevLineFrom(cx, checkFrom); + } + if (checkFrom < 0) break; - const checkText = doc.line(checkNum).text; + const checkText = lineText(cx, checkFrom); if (CONTINUATION.test(checkText) || LEADING_DOT.test(checkText)) { - chainStart = checkNum; + chainFrom = checkFrom; } else { - chainStart = checkNum; + chainFrom = checkFrom; break; } } - return cx.lineIndent(doc.line(chainStart).from); + return cx.lineIndent(chainFrom); } } } diff --git a/package.json b/package.json index 02d2da3..09ea610 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codemirror-lang-ruby", - "version": "0.3.0", + "version": "0.4.0", "description": "Ruby language support for CodeMirror 6, built on a Lezer grammar", "type": "module", "main": "dist/index.cjs", diff --git a/src/index.ts b/src/index.ts index 9d2df65..5240f4b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -73,11 +73,24 @@ function opensBlock(text: string): boolean { return (INDENT_AFTER.test(text) || INDENT_ASSIGN.test(text) || INDENT_END.test(text)) && !SINGLE_LINE.test(text) } +// Get the text of a line from an IndentContext (respects simulateBreak) +function lineText(cx: IndentContext, lineFrom: number): string { + const line = cx.lineAt(lineFrom) + return line.text +} + +// Find the previous line's start position, or -1 if at the first line. +// Uses cx.lineAt() which respects simulateBreak. +function prevLineFrom(cx: IndentContext, lineFrom: number): number { + if (lineFrom <= 0) return -1 + const prevLine = cx.lineAt(lineFrom - 1) + return prevLine.from +} + function rubyIndentService(cx: IndentContext, pos: number): number | undefined { - const doc = cx.state.doc - const line = doc.lineAt(pos) + const line = cx.lineAt(pos) const text = line.text - const lineNum = line.number + const lineFrom = line.from // Current line starts with a deindent keyword → find the right level if (DEINDENT_ON.test(text)) { @@ -85,13 +98,16 @@ function rubyIndentService(cx: IndentContext, pos: number): number | undefined { // Scan backwards to find the matching opening keyword at the right nesting level let depth = 0 let braceDepth = 0 - for (let i = lineNum - 1; i >= 1; i--) { - const prev = doc.line(i).text + let scanFrom = lineFrom + while (true) { + scanFrom = prevLineFrom(cx, scanFrom) + if (scanFrom < 0) break + const prev = lineText(cx, scanFrom) // Track } closers for brace-style blocks if (/^\s*\}/.test(prev)) braceDepth++ if (/^\s*end\b/.test(prev)) depth++ else if (INDENT_AFTER.test(prev) || INDENT_ASSIGN.test(prev)) { - if (depth === 0) return cx.lineIndent(doc.line(i).from) + if (depth === 0) return cx.lineIndent(scanFrom) depth-- } else if (INDENT_END.test(prev)) { // Distinguish brace-style ({) from do-style openers @@ -101,13 +117,13 @@ function rubyIndentService(cx: IndentContext, pos: number): number | undefined { braceDepth-- } else if (!isEnd) { // Non-end keywords (else, rescue, etc.) can match brace openers - if (depth === 0) return cx.lineIndent(doc.line(i).from) + if (depth === 0) return cx.lineIndent(scanFrom) depth-- } // `end` never closes a `{`, so skip this opener } else { // do-style opener - if (depth === 0) return cx.lineIndent(doc.line(i).from) + if (depth === 0) return cx.lineIndent(scanFrom) depth-- } } @@ -120,12 +136,15 @@ function rubyIndentService(cx: IndentContext, pos: number): number | undefined { const closeChar = text.trim()[0] const openChar = closeChar === "}" ? "{" : closeChar === "]" ? "[" : "(" let depth = 0 - for (let i = lineNum - 1; i >= 1; i--) { - const prev = doc.line(i).text + let scanFrom = lineFrom + while (true) { + scanFrom = prevLineFrom(cx, scanFrom) + if (scanFrom < 0) break + const prev = lineText(cx, scanFrom) for (let j = prev.length - 1; j >= 0; j--) { if (prev[j] === closeChar) depth++ else if (prev[j] === openChar) { - if (depth === 0) return cx.lineIndent(doc.line(i).from) + if (depth === 0) return cx.lineIndent(scanFrom) depth-- } } @@ -134,15 +153,16 @@ function rubyIndentService(cx: IndentContext, pos: number): number | undefined { } // For blank/new lines: determine indent from previous non-blank line - if (lineNum > 1) { + if (lineFrom > 0) { // Find the previous non-blank line - let prevNum = lineNum - 1 - while (prevNum >= 1 && doc.line(prevNum).text.trim() === "") prevNum-- - if (prevNum < 1) return 0 + let prevFrom = prevLineFrom(cx, lineFrom) + while (prevFrom >= 0 && lineText(cx, prevFrom).trim() === "") { + prevFrom = prevLineFrom(cx, prevFrom) + } + if (prevFrom < 0) return 0 - const prevLine = doc.line(prevNum) - const prevText = prevLine.text - const prevIndent = cx.lineIndent(prevLine.from) + const prevText = lineText(cx, prevFrom) + const prevIndent = cx.lineIndent(prevFrom) // Previous line opens a block → indent if (opensBlock(prevText)) { @@ -172,29 +192,33 @@ function rubyIndentService(cx: IndentContext, pos: number): number | undefined { // Previous line starts with dot but current doesn't → chain ended, deindent if (LEADING_DOT.test(prevText)) { // Walk back to find the line that started the chain - let chainStart = prevNum - while (chainStart > 1) { - let checkNum = chainStart - 1 - while (checkNum >= 1 && doc.line(checkNum).text.trim() === "") checkNum-- - if (checkNum < 1) break - if (LEADING_DOT.test(doc.line(checkNum).text)) { - chainStart = checkNum + let chainFrom = prevFrom + while (true) { + let checkFrom = prevLineFrom(cx, chainFrom) + while (checkFrom >= 0 && lineText(cx, checkFrom).trim() === "") { + checkFrom = prevLineFrom(cx, checkFrom) + } + if (checkFrom < 0) break + if (LEADING_DOT.test(lineText(cx, checkFrom))) { + chainFrom = checkFrom } else { - chainStart = checkNum + chainFrom = checkFrom break } } - return cx.lineIndent(doc.line(chainStart).from) + return cx.lineIndent(chainFrom) } // Previous line ends with continuation (trailing operator, comma, backslash) if (CONTINUATION.test(prevText)) { // Check if the line before that was also a continuation — if so, stay at same level - if (prevNum > 1) { - let prev2Num = prevNum - 1 - while (prev2Num >= 1 && doc.line(prev2Num).text.trim() === "") prev2Num-- - if (prev2Num >= 1) { - const prev2Text = doc.line(prev2Num).text + if (prevFrom > 0) { + let prev2From = prevLineFrom(cx, prevFrom) + while (prev2From >= 0 && lineText(cx, prev2From).trim() === "") { + prev2From = prevLineFrom(cx, prev2From) + } + if (prev2From >= 0) { + const prev2Text = lineText(cx, prev2From) if (CONTINUATION.test(prev2Text) || LEADING_DOT.test(prev2Text)) { return prevIndent } @@ -204,28 +228,32 @@ function rubyIndentService(cx: IndentContext, pos: number): number | undefined { } // Previous line is NOT a continuation, but the one before it was → deindent back - if (prevNum > 1) { - let prev2Num = prevNum - 1 - while (prev2Num >= 1 && doc.line(prev2Num).text.trim() === "") prev2Num-- - if (prev2Num >= 1) { - const prev2Text = doc.line(prev2Num).text + if (prevFrom > 0) { + let prev2From = prevLineFrom(cx, prevFrom) + while (prev2From >= 0 && lineText(cx, prev2From).trim() === "") { + prev2From = prevLineFrom(cx, prev2From) + } + if (prev2From >= 0) { + const prev2Text = lineText(cx, prev2From) if ((CONTINUATION.test(prev2Text) || LEADING_DOT.test(prev2Text)) && !opensBlock(prev2Text)) { // The continuation chain ended — go back to the original indent level // Walk back to find the start of the chain - let chainStart = prev2Num - while (chainStart > 1) { - let checkNum = chainStart - 1 - while (checkNum >= 1 && doc.line(checkNum).text.trim() === "") checkNum-- - if (checkNum < 1) break - const checkText = doc.line(checkNum).text + let chainFrom = prev2From + while (true) { + let checkFrom = prevLineFrom(cx, chainFrom) + while (checkFrom >= 0 && lineText(cx, checkFrom).trim() === "") { + checkFrom = prevLineFrom(cx, checkFrom) + } + if (checkFrom < 0) break + const checkText = lineText(cx, checkFrom) if (CONTINUATION.test(checkText) || LEADING_DOT.test(checkText)) { - chainStart = checkNum + chainFrom = checkFrom } else { - chainStart = checkNum + chainFrom = checkFrom break } } - return cx.lineIndent(doc.line(chainStart).from) + return cx.lineIndent(chainFrom) } } }