From 5d376c75af68f4fdbe1ca12d85596a8c0d404a18 Mon Sep 17 00:00:00 2001 From: Torgeir Helgevold Date: Mon, 9 May 2016 00:34:00 -0400 Subject: [PATCH] docs(cookbook - jquery plugins) tweak ignore fix array core shim e2e Jesus' edits s s --- .../_examples/cb-jquery-plugin/e2e-spec.ts | 34 ++++++ .../_examples/cb-jquery-plugin/ts/.gitignore | 1 + .../cb-jquery-plugin/ts/app/app.component.ts | 33 ++++++ .../cb-jquery-plugin/ts/app/app.module.ts | 13 +++ .../ts/app/hero-assignment.component.html | 7 ++ .../ts/app/hero-assignment.component.ts | 26 +++++ .../ts/app/hero.component.html | 5 + .../cb-jquery-plugin/ts/app/hero.component.ts | 25 +++++ .../_examples/cb-jquery-plugin/ts/app/main.ts | 5 + .../cb-jquery-plugin/ts/example-config.json | 0 .../_examples/cb-jquery-plugin/ts/index.html | 34 ++++++ .../_examples/cb-jquery-plugin/ts/plnkr.json | 9 ++ .../_examples/cb-jquery-plugin/ts/sample.css | 30 +++++ public/docs/ts/latest/cookbook/_data.json | 4 + .../ts/latest/cookbook/jquery-plugin.jade | 104 ++++++++++++++++++ .../jquery-plugin/hero-assignments.png | Bin 0 -> 34393 bytes 16 files changed, 330 insertions(+) create mode 100644 public/docs/_examples/cb-jquery-plugin/e2e-spec.ts create mode 100644 public/docs/_examples/cb-jquery-plugin/ts/.gitignore create mode 100644 public/docs/_examples/cb-jquery-plugin/ts/app/app.component.ts create mode 100644 public/docs/_examples/cb-jquery-plugin/ts/app/app.module.ts create mode 100644 public/docs/_examples/cb-jquery-plugin/ts/app/hero-assignment.component.html create mode 100644 public/docs/_examples/cb-jquery-plugin/ts/app/hero-assignment.component.ts create mode 100644 public/docs/_examples/cb-jquery-plugin/ts/app/hero.component.html create mode 100644 public/docs/_examples/cb-jquery-plugin/ts/app/hero.component.ts create mode 100644 public/docs/_examples/cb-jquery-plugin/ts/app/main.ts create mode 100644 public/docs/_examples/cb-jquery-plugin/ts/example-config.json create mode 100644 public/docs/_examples/cb-jquery-plugin/ts/index.html create mode 100644 public/docs/_examples/cb-jquery-plugin/ts/plnkr.json create mode 100644 public/docs/_examples/cb-jquery-plugin/ts/sample.css create mode 100644 public/docs/ts/latest/cookbook/jquery-plugin.jade create mode 100644 public/resources/images/cookbooks/jquery-plugin/hero-assignments.png diff --git a/public/docs/_examples/cb-jquery-plugin/e2e-spec.ts b/public/docs/_examples/cb-jquery-plugin/e2e-spec.ts new file mode 100644 index 0000000000..77584edcb8 --- /dev/null +++ b/public/docs/_examples/cb-jquery-plugin/e2e-spec.ts @@ -0,0 +1,34 @@ +'use strict'; + +import { browser, element, by } from 'protractor'; + +/* tslint:disable:quotemark */ +describe('Drag and Drop', function () { + + beforeAll(function () { + browser.get(''); + }); + + it('should drag hero to assignment', function () { + + let assignment1 = element.all(by.css('.assignment')).get(0); + + let hero1 = element.all(by.css('.hero')).get(0); + + browser.actions() + .dragAndDrop(hero1 as any as webdriver.WebElement, + assignment1 as any as webdriver.WebElement) + .perform(); + + let heroAssignment = element.all(by.xpath('//div[text()="Help Granny cross the street"]/following-sibling::ul/li[text()="Mr. Nice"]')); + expect(heroAssignment.count()).toBe(1); + + let doneButton = element(by.xpath('//div[@data-hero="Mr. Nice"]/div/button')); + + // Remove Mr. Nice + doneButton.click().then(function(){ + let remainingHeroes = element.all(by.css('.hero')); + expect(remainingHeroes.count()).toBe(3); + }); + }); +}); diff --git a/public/docs/_examples/cb-jquery-plugin/ts/.gitignore b/public/docs/_examples/cb-jquery-plugin/ts/.gitignore new file mode 100644 index 0000000000..cf44e148ba --- /dev/null +++ b/public/docs/_examples/cb-jquery-plugin/ts/.gitignore @@ -0,0 +1 @@ +**/*.js \ No newline at end of file diff --git a/public/docs/_examples/cb-jquery-plugin/ts/app/app.component.ts b/public/docs/_examples/cb-jquery-plugin/ts/app/app.component.ts new file mode 100644 index 0000000000..45b5ad354b --- /dev/null +++ b/public/docs/_examples/cb-jquery-plugin/ts/app/app.component.ts @@ -0,0 +1,33 @@ +// #docregion +import { Component } from '@angular/core'; + +@Component({ + selector: 'my-app', + template: ` +
+

Hero Assignments

+
+ +
+
+
+ +
+
+
+ ` +}) +export class AppComponent { + heroes = ['Mr. Nice', + 'Bombasto', + 'Celeritas', + 'Tornado']; + + assignments = ['Help Granny cross the street', + 'Rescue village from dragon(s)', + 'Rescue princess from tower']; + + removeHero(heroToRemove: string): void { + this.heroes = this.heroes.filter(hero => hero !== heroToRemove); + } +} diff --git a/public/docs/_examples/cb-jquery-plugin/ts/app/app.module.ts b/public/docs/_examples/cb-jquery-plugin/ts/app/app.module.ts new file mode 100644 index 0000000000..462169b5ea --- /dev/null +++ b/public/docs/_examples/cb-jquery-plugin/ts/app/app.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; + +import { AppComponent } from './app.component'; +import { HeroAssignmentComponent } from './hero-assignment.component'; +import { HeroComponent } from './hero.component'; + +@NgModule({ + imports: [ BrowserModule ], + declarations: [ AppComponent, HeroAssignmentComponent, HeroComponent ], + bootstrap: [ AppComponent ] +}) +export class AppModule {} diff --git a/public/docs/_examples/cb-jquery-plugin/ts/app/hero-assignment.component.html b/public/docs/_examples/cb-jquery-plugin/ts/app/hero-assignment.component.html new file mode 100644 index 0000000000..ca7d47cab9 --- /dev/null +++ b/public/docs/_examples/cb-jquery-plugin/ts/app/hero-assignment.component.html @@ -0,0 +1,7 @@ + +
+
{{title}}
+ +
diff --git a/public/docs/_examples/cb-jquery-plugin/ts/app/hero-assignment.component.ts b/public/docs/_examples/cb-jquery-plugin/ts/app/hero-assignment.component.ts new file mode 100644 index 0000000000..085df48f3c --- /dev/null +++ b/public/docs/_examples/cb-jquery-plugin/ts/app/hero-assignment.component.ts @@ -0,0 +1,26 @@ +// #docregion +import { Component, Input, AfterViewInit, ViewChild, ElementRef } from '@angular/core'; + +declare var jQuery: any; + +@Component({ + selector: 'cb-assignment', + templateUrl: 'app/hero-assignment.component.html' +}) +export class HeroAssignmentComponent implements AfterViewInit { + @Input() title: string; + @ViewChild('assignment') assignment: ElementRef; + + assignedHeroes: string[] = []; + + // #docregion add-plugin + ngAfterViewInit(): void { + jQuery(this.assignment.nativeElement).droppable({drop : (event: any, ui: any) => { + let heroName = ui.draggable.data('hero'); + if (this.assignedHeroes.indexOf(heroName) === -1) { + this.assignedHeroes = [...this.assignedHeroes, heroName]; + } + }}); + } + // #enddocregion add-plugin +} diff --git a/public/docs/_examples/cb-jquery-plugin/ts/app/hero.component.html b/public/docs/_examples/cb-jquery-plugin/ts/app/hero.component.html new file mode 100644 index 0000000000..e7ee941c44 --- /dev/null +++ b/public/docs/_examples/cb-jquery-plugin/ts/app/hero.component.html @@ -0,0 +1,5 @@ + +
+ {{name}} +
+
diff --git a/public/docs/_examples/cb-jquery-plugin/ts/app/hero.component.ts b/public/docs/_examples/cb-jquery-plugin/ts/app/hero.component.ts new file mode 100644 index 0000000000..ce787b0a3e --- /dev/null +++ b/public/docs/_examples/cb-jquery-plugin/ts/app/hero.component.ts @@ -0,0 +1,25 @@ +// #docregion +import { Component, Input, Output, AfterViewInit, ViewChild, ElementRef, EventEmitter } from '@angular/core'; + +// #docregion declare-jquery +declare var jQuery: any; +// #enddocregion declare-jquery +@Component({ + selector: 'cb-hero', + templateUrl: 'app/hero.component.html' +}) +export class HeroComponent implements AfterViewInit { + @Input() name: string; + @Output() remove = new EventEmitter(); + @ViewChild('hero') hero: ElementRef; + + // #docregion add-plugin + ngAfterViewInit(): void { + jQuery(this.hero.nativeElement).draggable({revert: 'invalid'}); + } + // #enddocregion add-plugin + + done(): void { + this.remove.emit(this.name); + } +} diff --git a/public/docs/_examples/cb-jquery-plugin/ts/app/main.ts b/public/docs/_examples/cb-jquery-plugin/ts/app/main.ts new file mode 100644 index 0000000000..9be7775f4d --- /dev/null +++ b/public/docs/_examples/cb-jquery-plugin/ts/app/main.ts @@ -0,0 +1,5 @@ +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app.module'; + +platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/public/docs/_examples/cb-jquery-plugin/ts/example-config.json b/public/docs/_examples/cb-jquery-plugin/ts/example-config.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/cb-jquery-plugin/ts/index.html b/public/docs/_examples/cb-jquery-plugin/ts/index.html new file mode 100644 index 0000000000..15225ec140 --- /dev/null +++ b/public/docs/_examples/cb-jquery-plugin/ts/index.html @@ -0,0 +1,34 @@ + + + + JQuery Plugin + + + + + + + + + + + + + + + + + + + + + + + + + Loading app... + + + diff --git a/public/docs/_examples/cb-jquery-plugin/ts/plnkr.json b/public/docs/_examples/cb-jquery-plugin/ts/plnkr.json new file mode 100644 index 0000000000..f88a446b78 --- /dev/null +++ b/public/docs/_examples/cb-jquery-plugin/ts/plnkr.json @@ -0,0 +1,9 @@ +{ + "description": "jQuery Plugin", + "files":[ + "!**/*.d.ts", + "!**/*.js", + "!**/*.[1].*" + ], + "tags":["cookbook"] +} diff --git a/public/docs/_examples/cb-jquery-plugin/ts/sample.css b/public/docs/_examples/cb-jquery-plugin/ts/sample.css new file mode 100644 index 0000000000..28504dc555 --- /dev/null +++ b/public/docs/_examples/cb-jquery-plugin/ts/sample.css @@ -0,0 +1,30 @@ +.hero{ + background: lightblue; + border: 1px solid black; + width: 100px; + color:black; + height: 50px; + margin-bottom: 20px; + text-align: center; + padding-top: 30px; +} + +.assignment{ + background: darkblue; + width: 250px; + height: 150px; + color:white; + margin-right: 20px; + text-align: center; + padding-top: 10px; + float: left; + margin-bottom: 30px; +} + +.assignment li{ + text-align: left; +} + +.heroList{ + clear:both; +} \ No newline at end of file diff --git a/public/docs/ts/latest/cookbook/_data.json b/public/docs/ts/latest/cookbook/_data.json index 78b159e40c..60f95be92c 100644 --- a/public/docs/ts/latest/cookbook/_data.json +++ b/public/docs/ts/latest/cookbook/_data.json @@ -51,6 +51,10 @@ "intro": "Translate the app's template text into multiple languages" }, + "jquery-plugin": { + "title": "jQuery Plugin Integration", + "intro": "Integrate with jQuery plugins" + }, "set-document-title": { "title": "Set the Document Title", "intro": "Setting the document or window title using the Title service." diff --git a/public/docs/ts/latest/cookbook/jquery-plugin.jade b/public/docs/ts/latest/cookbook/jquery-plugin.jade new file mode 100644 index 0000000000..46a10d7945 --- /dev/null +++ b/public/docs/ts/latest/cookbook/jquery-plugin.jade @@ -0,0 +1,104 @@ +include ../_util-fns + +:marked + Using jQuery for direct DOM access is not recommended in Angular projects, but we do see value in supporting integration with third party jQuery plugins. + + In this cookbook we show how to integrate `draggable` and `droppable` from jQuery UI to make it easier for our admins to assign new adventures to our brave heroes. + + Before a hero can set out on a new quest, one of our admins will give the hero a new assignment by dragging and dropping the hero's name on top of the assignment. +:marked + **See the [live example](/resources/live-examples/cb-jquery-plugin/ts/plnkr.html)**. + + +:marked + ## Table of contents + + [Add jQuery](#jquery-add) + + [Drag](#drag) + + [Drop](#drop) + +.l-main-section + +:marked + ## Add jQuery + + Before we can start we have to add the necessary script references to load the jQuery library and the two plugins, `draggable` and `droppable`, from jQuery UI. + ++makeExample('cb-jquery-plugin/ts/index.html', 'jquery', 'index.html (add jquery scripts)')(format=".") + +:marked + jQuery declares a global `jQuery` variable, but this variable is not know to TypeScript. In order to reference `jQuery` from TypeScript we have to declare a corresponding TypeScript variable as well. + + In this case we don't need to access the jQuery api, so it's unnecessary to add additional typings for jQuery. Instead we will just declare `jQuery` as an `any` variable. + + If we don't declare `jQuery`, the TypeScript compiler will give us an error. + ++makeExample('cb-jquery-plugin/ts/app/hero.component.ts', 'declare-jquery', 'app/hero.component.ts (declare jquery)')(format=".") + +.l-main-section + +:marked + ## Drag + + `draggable` is a jQuery plugin that allows us to move an element on the screen. In the UI our admins will "drag" heroes and drop them on assignments. + + `HeroComponent` is created to represent "draggable" hero elements. + ++makeTabs( + `cb-jquery-plugin/ts/app/hero.component.ts, + cb-jquery-plugin/ts/app/hero.component.html`, + null, + `hero.component.ts, + hero.component.html` +) + +:marked + We want to be careful not to access the DOM directly, so we are using `@ViewChild` to access the target element for the `draggable` plugin. + + `@ViewChild('hero')` declares a reference to an element in the template with a matching `#hero` variable reference. + +:marked + Now, we can go ahead and apply the draggable plugin to `this.hero.nativeElement` using familiar `jQuery` syntax. ++makeExample('cb-jquery-plugin/ts/app/hero.component.ts', 'add-plugin', 'app/hero.component.ts (add plugin)')(format=".") + +:marked + We apply the plugin in the `AfterViewInit` lifecycle hook since we know the component view has been fully initialized at this point. + +.l-main-section + +:marked + ## Drop + + `droppable` is used in tandem with `draggable` to create a drop-zone for dragged elements. + + `HeroAssignmentComponent` represents an assignment that we can assign one or more heroes to using drag and drop. + ++makeTabs( + `cb-jquery-plugin/ts/app/hero-assignment.component.ts, + cb-jquery-plugin/ts/app/hero-assignment.component.html`, + null, + `hero-assignment.component.ts, + hero-assignment.component.html` +) + +:marked + Same as with `draggable`, we are applying the `droppable` plugin in `AfterViewInit`. + + `droppable` lets us specify a callback that executes when a hero is dropped on the assignment. We use this callback to manage an array of assigned heroes whenever a new hero is assigned. + ++makeExample('cb-jquery-plugin/ts/app/hero-assignment.component.ts', 'add-plugin', 'app/hero-assignment.component.ts (add plugin)')(format=".") + +:marked + The final UI looks like this. + + Admins can assign any given hero to multiple assignments by dragging and dropping. +figure.image-display + img(src="/resources/images/cookbooks/jquery-plugin/hero-assignments.png" alt="Hero Assignments") + +:marked + [Back to top](#top) + + + \ No newline at end of file diff --git a/public/resources/images/cookbooks/jquery-plugin/hero-assignments.png b/public/resources/images/cookbooks/jquery-plugin/hero-assignments.png new file mode 100644 index 0000000000000000000000000000000000000000..32d1cd8592c925a3da67a8ec5bffcc2f85acaba5 GIT binary patch literal 34393 zcmb@uXH-+&w>OHQpdx~TARXx_MOx@hdI?o}lNuoO-a-*kl-?m!=?DQSp*KZp=p`7c z3WO2@QbI46=bZC@^xQk{81IKSANEM*UbC*X*P3gt-_Cn&O=Xh1G`l#-@09H-a7I<+WAi<(afS-RvEm?eOq86K!6-daBCJ*>7d_>Q(>n zGp@Uye!5XnF}klhySs+Fx|zPc>S4;wFf;q{nCwS)7TQ@tK*meyMB|dOVkxlmS9+PQfTM^zj=^M7u z6gTK^+b-RxnS8QE%H;bnWB41s0r|s~d$#I$D12422EwSE`&Oo5-v_AQbICRk_47v2 zc7;uLD}I^p(w#{RYgHv|7At-(A^Wi>8A?TS&y$D@@!bD;({s+}8G?_W8wsonh^7@8 zq=Zq3uTj0Ev?~FnaEju~1N6U$$u#EIv%*!BzXi$}{avrhhq}7vBgoXDydp)zJ_ToUszV?Igdtx@up)y6TJ$KO|V*lD&_|>gV_)2KP`6ulorPPtsrf`m2kbw-uAWi?gejxW5$hf3*<5{{9b{ zkD2Mens|eyn2mtiO!97?c1*&&LcGtJrSCE^F-dyb+KcNdDE$xn^)D%A2XAk8aXvmj zKR;eSL0&gc5Ffvom>A!40X_i%p6eDoUIDJ&R{lJ$UM&AD0j{e?R|ir=7p!A5E@a|KrxRgM9zo;p69h&iAkEYgWmBsN&j={&vnr z3XU#zu3pzVq(z^LO8!^-|IeL28vo)n{=+FO#Q!(vUw8h8QkL(PvCHC_4UEClA=*e@OCIHSX1pL1-C_sa5nEkd&(64_Q~E4iOV!RM z+IGbPzd_1rS_fUas#4eAG-YA>p8iqH?th|zhyRq!kYsQpEf5v7PH-Z7bszrCU1EVb zNM_7YMwGSHT9b~YTKYF`;OLWW7B7M*$OlF0l3oiV3aWXD^>moA;OQ&23aWXcl_h(Y zYZmbPa@h0KdNljw$-fc*#ztls#w`E#TWY3oqUNUN!qtvWUK+OAmDKo99%Grx^2COB z`m*o5!5b)6R!@gs`pr7Pi*wr@1(s94GbFr!?p6AN(bln=mqic@&qxj6FY{)2zV zACpyhG(*17Oy?6e1Y#utvdU-_mN=t6u*ujDd_w zP+bQF_MA~@50ivwTU`EBE1#zg2s#hMYFtJrgA@q`!^Ql5Z%4g+*)q)`qH+kVv+aK~ zt!u9Y`CYIjDW+wwNK7#+yr9QcE3IZssFlG}{0yE9ac|)TGX7RUnDbOiLa8}hY1+yN z^{w{l&!;5=0xeoAjf{&YL-a%1uwt3cRf}_&V)yNbBuzrcCMWgT7S%aB-3Eg{?s%;> zPxlC*LSq>+t_=6n`hh&Dx(!lO!7Dh@!Dq!Mo~P~UtKpAa!`3Lgej64Soo{^haqa-8 z!A8^i_vg&rK!K2E>1u_L-($chnChRaFHUl+vcAkvscvl98(Z_3GR3Y744d!SKxDfW zz_w>!?q-_SOFx%WPhD9kVQ>u4#SO|s{aV|O_DJm%SF5^&wp+iD7nOMz&p)c2nCA;n z{C6(+ZNk(c%_-+448M_cKPPxed$(x5lU2>#TEH3gjExjM7`>Ad1BFa){`m1tL*PY+ zs2U$n{JC03swsuAD8C*SX2R8cBssSl!cvN9j1FpsrUj*E1nr@YMghi~zcbrTmD(== zD_5!kyK|&UB$|~kX9q%57n3J`bV8Pkr|K5BdM;n9O@!gihf+)B_~;bN+OdFU8A;I^fpgiJ zT~hg(o{hkOy@sT!5G)nkU zp=$;Qd3KHRvu7{(>V3{P-ij1`>d9qtIb5#oaLUq8bJ54Jjap`q+IqnjhC3=Iv$8Kz zsSlkiuO#v;p9C$8I(pgRDjL27wyQ91#Kq&BoIVd)q<(VIx1K0&o(ydOHZa~Z%YHW^ z17xslx0rNJ#<2yMxIGZhn2lExE;H#gu|FoRo!RWR(L(W>=9w^W8$2QRTS*0vj zr|^r1)21;lt&I)(YO0I4%jU|Zw#lnpkv}u06vx;qUh(Rf1*!uQ)E6357|Fpbfv`B_ zQ{3LnQ`@Z^80k5@J(a{}ed zAJ8~3^M+^@zQ&OB-lW3%tq!?c(%Prc%2?>u&pPa=8d0j?2!$M9pke2Pi#lMB*ClBs zSj4t=US_U+V)0pOj;*N8qBHf{!OzD6*4dH=2a~>^pBq&tjb`70W?nQ@Or8mj)k=3R zy#H|UHR$45PtwMDZ(q|;>k1qff5w459>(b&nv~BA>6|q>Fy2pg^?7e<%IYal+XPK@ zv^M137XZrSJrUS0dAC9&IDcE#RLhaPUe^UGtVW^~gGkxAViNH@9ER@|(B{Mpr4H^X z+tup%CZjiIkY^De->qJQy?go8l-OVEQhKY63P99@lT4>Mz-$BaWX$KBOdy#3XmBfD`DA6b!_ki*GGG`#fJr8 z^V^26xHhxom0{ri1hj%qZVAOYsh}KtJTZyIe6Suz2Jxya({kL-F|NpYfi5HDj5f>8 z_JZt6aVz1F^qgwi)4Og^0EBQZPr(|Xd1}qi9G$C$7zq(?Fd+49^Zk_) zTJ}>u?^bchlt8QD%&FaMQ@?s}vVAtvbDhsc3FxW>rAdf-;`4es8`k|Y=aMWMY5xXP zp4Y7mrz3HGG-tRX=K6rmLn)YD*~HsQ9_i&DXFu^o;3uKE#f8Uk)7uA`o}I|^%6U7( z9{Pz#4PPxB1w6mvJkt+l20JzgVIJ?FiLk%;cTrK%&c_IIdJH}PRm(rv<5-GPXg&tE zF1kFVR1x$4wmR}o-m@$sWDNVH5kcT65$yMEZAaM}xc>!!Rkk`6`5u}&_nI#l9uc4d zI`P4t45yrMcT-uLJB7~Fq4eOJ*uYdr&lKK09?y_6c{?3 zan|lQ(iDQb+bnYgFm4qLtdsXMv3T%rp569f-IGME(Z0ek?J^p1XEqVi<4pgPaoM&! zz2dT8X{W1?zi?EuHHYQEHS}PRp#5eXM`_p4Vo>4ND=T*>awx_-g6YZuD?d>nvW^um zNOQ?5{;9Jz-fo}tfP8g)%_315CnB|pSxU}n4gNLPF|%|}{onyUTO^Q&G2{~uz8DQUKb#tQCFfSl;5-N_EZv=i@&fE6+vQLw8#s4 zDU(m3r>#6VTrGHwclX3;RXcj_i>j^Zz{5;^9Q0st$II8uy+iIl-Nq{x9!;L_0DQNh z`pSF)Q@yHqk*EmUD63v5?~M8=Q(qb$K9}`T&|{w^>d;-~EU+H2@>%);x|M~*JRopJ zuKYXtaD8m)UchQ|R0s9Qz17&Sb6ZOa;~;JQE$6gSQ1Rdf3(1~^e1uSaunr}9i8WJX z!SzDw6oPdK`D_q!+@87@-i*F*uBMxa#@yj(1wbmJm(3+e2jr9G&q6YY$am%+nPHZB z<#synGpsH>txq|%$#EsZBT&z2{^X(3;S7$y9*JSz3(P^X z4G@3;WWbQ?Z|`CF=%$-VW!m&Jb=!eW*}CE%j$fCwnjGJTPMuD>DFDzD9A>Gh&GGNm zlCugLi1t8FIQ$Gw7y~3ceQo=8yHc3z7_%`~O%+4Aeix@Z1B26cr$!48$1~V$9}9b= zN$)~Ftz?z)oOX7Nitj*mT^3vW~wsVqJ&aYl|IJ^hk zh_-p0n90|?EuVXTgY+h42Pet!p0{XK&bPt+n zFX&T~&N|t^jU60Bq(}rUm>6gHivU59RLK|oIGsn4Jo|NUgE>Rn8dtzh)I#REw^#dR z?=ZoyrKju^16v9A_slKBbX;G09*_ihU^HREV$AXfiG$nh^?s{IE331FYj-TLv-9AJ zl;eoiM1F$#s`My|KdHx0e5r|V&t@UpPssP}d=`UhizceZzw0-=@J)@RQqJ=eZdKU6 z>-1^06GJan9yi|Cb=jnFxM*oD!YJ{QZK<{MspsGquj2DF5yd!ChRHTP3t!V08$0i9 zwPL3I?6OzZN;deW=cdW|s+YL@q;mMYhzwDk!v(`l1|d6_Kg5og)>6@P7g|DHn-d36 zd7*fZeKkA9?nb*}To7m80N~CYA^~wrcPrNLC%uLDzjg|salvF)%6}7fiovv)G$zM*vSoIJyF4B`w zqLS;pRvBNyxTPA|_e215R=rW(Ec4i@qJ-3GZ9g?YQ@H2Hz@FmOr+X$^Pl~-|6t1LC z&#^)g%FUz{kEsv3B1ZPfAwzB_rqzSXmw>SCgG2BvE?{qYa7Ll^_$Hwrb%A8yEVL|Q zhhr_&(jFZ1@UcmeTqy0@+h2Kun|)p^A*DUJyg<+NbE84Vf^x&ISik>_7}?P~tmb1M z*J^h}*CvORx7aQ0A6`svd;HXL*c5f_TUt-9i*w)z29H@PXaVU{f0!S|fgYV@O-@t} zr_P&1TyOeemijxQ=7yzyUbT$8?k1sJkk`Hm@wU$C={uRvQhCJNFTdMOgGo_v5!bzr zgHOPpaY977R8mi;&(+$GZaK?9W{vqyV;VnG-*iitSBgoR(s8X{hKTk5=|Lvl{2Ba| z{(|Qvrue5!VL|opQ{KzieqG)(IB838o+a&g;uW3U;61~a*r?`4dXh`}ALp)jKnHB$ zO;CSaF}_~f^Y91c_`_-UrT9oCakbMYXZ?v0x~998Lw*tDz_f~ZY5RZIOETGfK4R^N ziS!xGY&!`UoV8glT&3RD(aUh~S&xXq*$0omRZ!o+Pm!*B`j9*7vg}pQsQ{|&f*=$W z3Soy9L449yc!rYa1eZ@X5H}IBp8w8UH*P+pV3JiOOIZ0!6w{9!JcxE%9V^FQ?Z{NL z!|>STWRqC_t?n>|h56y%-F;gNA-;lerYRj{@piTtGjcTET8qZ%HL*_{niY_>yc3R{F5)q;)UP5bzA%4O;)kL z&GF}u4f~bDCibT)#S|v{`r7V0_(^nso6|H|!C6i^6yN>G38>(@Co3nU_ zEZ-lbs`+=w67sJrfv>|@mH(3m{3B)Ox)k_-IgH_QHMMGLCiLKk9m;s&A-wKCzdqDT z4_kg)nr-`5Hjm;*(>RAAapa49E#hxM^ZA6uTGdK--~F+^tLq_?EVU6PtN2g#LiW1x zb+vP2TK?x>zCSj)ju8PEQdj?%p9hZrjI#DXPP)HBOrRcyXZH%`mPYv}oZ-?uvSAaY zhNO}5eC_Ud)(K0!r>jpCVvgV)B3J_Y4es2 z-KHTS;}oAreP~GuL9LClCD-HCe;%6C5?S<+YEr7S$}BWaeKn38QkQT6f0>!QlE|It zlO-L~d^0mZk5xSmQKE*F)8J-rvb|-$8Iq72YysVrPNB!8Z&_RD5+kp(ZrZ~~h)Cj| zS~k89n4tjA!>wJK-Y@#7h%ij&pcNUZxeS)( z(L!|B+Bup~d0J1rxw+?>3OUCZabP8HsM z9h3yRLVUAWQm?$2-J1In3L2GWCxKIeAqTY!L)i(-R{bGAWDL*;o=>o->T;eW@g;gB zf8AFRElS*b-AKxU$~rHt^&-gDq>z}I-@BCbrF9v0UxTi%c8vqQAI^$46GuvDUM-28 zssFBF{oP??633HP>oCJg5H%3W183U>moM67vBLX4^cY%I{oE$A^f{kNmNMA>42Cjf zX~~Q>%@9zi9-90Xkmz3d_VnG*h;a?KynwDy9w4@bRwk{tS8oEzo|Nrbyi(m_x@aao zi}{*t`KF82@p}fFu}MVgcF5WZVA-B-SzpVEHo6aE{u5!Nu|7OQOXHfHUCEyW-2{eQ z0H{EaMtFlNcq|Xj$IhXybm-%GJnVSkyZei;38Jy@c6llCMU2&Vo_M5uZbuNLD%a2+ zUk}Jh>TOA$n8FSP@_uv`zwk7wbA$SD&$k}}Q4jhaQaqYcueg_VQn4NTEdMTGPw)y)a0NTG_U@pOZMQ?|g3YWYg;_0En>T6=!7nk}M|S5ki|>z5f5opK zL(#v|i`_N|XyIX- zOCgZW%cZn5Ta^z3#l~8npL}^w9q@uuBgAs+*ZtIcf@%cNZcsG5e4u^86UjSM;|Huu zR-IK?vl7F^2--;pHK;6_EgNKtuS&FOI~_f`H3%x<@_{CZ1u!nAbDY&fC(O6&`Y6@P zrw>3$Z57L-xe%kl7f^h$WgiqHzg>&~_k{SCjfrb$t~mCs@|MX*;T@-DABG)(sH^K` zv}@|yd`~m&E5F8@XJ94BSOlO&d{=!J~f{GnzyZNO{;2-(=V?05kl~V(!S?j8lq;j z-_ynCG`m6KbuV2uw=NWts*x88IfM4zO?e6o5%njPUiSn7vhb$p<__CiMI9{pCfFO2 zD|hDY1Sg%>>*TE{%eyQw)?7whQ&o!E} z#c~+m68sj*d7t|nFNCU%MD(77Q*p^a$Ds-kewGV$v&Ir-#t#vrmWEE38rhoc{k&HI zV+kDbM$f*vzForYFZ9B^lK1wWm3%mdu^g0B;@^A7?F%OSGE~ zXsLmeA#C^Bb@y>@?ac8SsT=HWCog^H6z`t60Y+jY9Sxf2pjxVR9y+D3_c|Lt!S!@` z4NLh2q`Hln+VN6o;aUlR#=+;(E}-+v$$htdks2=8aPs-ap@0Z@KMo0i@y@K8t_s>c zx_%;6p1`*br%NROqObIKHf&gp8wvD$`7gyp2Bkqnf`~QKL%Vk3k{oYSEfi+Kq~pw1 z{eVR|rWUeI`88y^C<{K>y{GXvqqoFDS=Y^m~>AJ z`h9-^PqZECoF94pIQ9sfIi)dl57lrBPfH*6&TGoAeaiFhyp8h3j*cHDyRDx`#LFRT zP(pb;ouf;^0L63^-CS)6M)9q^bKJ**zOi$CKOP z5k2m$L^@`ILDS7{aTV+!jylSPy~TP};@d|~x}}k3Ycj|;YYQc-IaRAbq?evk3naX? z_@mL?x?$1w9Xn(2gNaF7{hYZN&N#2|#ovROu6GyMJK(Ns{_Xy|3(S)~Rzo#o+@@J+ z!cx!VKjq+@c`WVPg=kt+D(sBMdaByD2u?zOi}m>SPtuazqCV_cm_L6nEPxKlKWnX) z>|R_NIw>h1Hn}oBY3y$;-UfEI^}8^!00+TaFyt1?K%lcKsR{kzVYP5l`Ju{WBVw!0 zUZVEM*u0pXwA~-esZz7wWR|6hk%rlU>j&+ttz<$93m5bT$x1TTnZEWKxc0So-hnw-AfxGmw#{A>E*CF%Xtaino3p zo^h2?xM)HS@HEB@A9eW{@j6)Fv}BU7w5PGrrTh{B!K?oL>aH`I5VzD zojI6R(!GVTq4y0{y;65FVsLTh#&IdB3!7JS+P-!4<$zW}X+B{DKvnlJOSefUoogXR zh7FN~96TQ28|b&H$O*vo0N>{Hns@YWHrjpfr}BoXpkqBRZj_Oyo* zO?vNM!##2Sbwh3+7)arjhAMJ&OQxA8SM;gI%a-Zl$sO3Hm38sFM=uu^kq1Eo6CNd7 zU`XKjM|sap_X`;lgGb*HhK;*ao2N-tM{r%Ei<*#9;fHK~S*k2=H4%#@&z4Jf8XJV` z&byUd6F7Wt);dh!(oQyf#)3Ml;pWyL8sL|COe7VejBIZ6W6DNbd~e zKlmV5M-}G*P7!uRjpSko^(|*8`8|%fkhtBm4b{o95Z9ie6ndixJ zTQZ(Eza*9dKp{9PT@by|e6WpM>2}ICCT_JFq2ebqjuz~$gdn&44#~c2-A71`oYOwb z7Jy#(H=^Qm&~>iN5cr|kFoI62lGufQrloa6%)Y~gsMOQA|Kw|)*;(9hBd_ROk)-KS z@vfafW&ZeV`o-kU_B$!N`5Kex2>UYrJ`2qG$G!(3Qx$;U%znX2PUn)ebZY?bT@5{* z&$D8@1|O;iww4SB1xkH|(9N$(2(#^(+wpd93HxZ&puN=YPWM>=&axd`gKt?U7V3hA zwIb3_AQ;|q#1w7y0JWZc92Z*CGjdykvM%@RE^Hr2cNT8(*#uLKErWE7gOgu7on<6S zn;(H7U5XzcndPQCEu?LE71k}3Shz^B_GhDqess*{y}rcsG%qw(00H({*zt~%GFKsy z^{OO0ooW#N#&C0ROD-`77?ox`_jwy+wf6PL{>5o>cs<&D3oFhQ6M}1O%X#{7nXhdFXSEbm_HSYYsFVge{A`u$1WmHu3?)zD-61eyog$ZOKn}MOgjn#-z~Rkh$Jfi9;*Z*kYX&pbkorx zSkWp**um(Os`-25X9rfxCKcPh5)D{0zq*IgCn~zzBRv6m&NBz=Z=0WrxR+$<{Z6aQ zlzHjvcCPJt@Se*4d;6vj=BryDJFJGQk)ZLzSD2=>cs0kR;-@t##JRVZ9}_daizvALr4qUyVsZtRza&mZ2*dC@F${K-|ErKg3Y2t#i@ zP9Bg3K_chWEz>?d<;e)YvZQdK6wsfhF~C=_u?-LxZz^I5%`h!Sv}h(2v8OtO-) zmex~4R3Ux5ijnhByita|gMuz@r3wp*bTI1)UB)r%k!^sbLN>$BuI zK~m(TbfTcLg&*(J;p`)Xy${-xC6C$UP3yiper-6*$G{uDI*#x&cR;)ggBD(*Sb?;i zmB0&`H2AiMcVjtheT!Z8yKrm}_x6gBe@C0D39czSi680oKB!>enEKlEf~z+}ye;Ce@8_Ni$fe#8YvhU*|( zf1H#!;n|R&f9btk>7FT7pvYUjmntUeM| z++1PH^;BS&VG{PKJHQt;X6)iu6)>HIEd#R_*MD11DzI<9(s;{l3da9=|NgECi4}Hq z7<5j>!(K@LsIPdKM7yOmr?)OoXimg&$gSuNgJ!`kTC}RV4yB+&yYdOZ`em{>A*ri2 zx#UQowar*m%6VrpyvGu0?C zQ{R^{?;s{WD}8s1=oBv+K3#|lc7yJ23{PwXCTm=MP`7uC)hMoZz>}-nUCHYCp73h<-?}O588%yNIcjg+}=W_I;~=B>crtZ-F1{d{}c_ zZ_nInHunOgppo-C3ZzzF^0ky`rc$GPI`;d$){0OnDa(Z?LvarR3nm`~h^VJpWY=Tk z7SF#xEl4{ig$XCvhcBP3bQvvio}glBHsaI2274tSTjK)P_!Q?9s(CJQhD;bRXUC+^ zFY(`Wj!THOTy455<@FxA>8?>~Q;D~Lg+IeiW&(ac^w;}3fqhD~$*rHvIb0ILC+_z3bW?x(t z(3V*|H=?ZjaV}BVsPE1iL_yXjey5Gjb+)TwW5~?tqYJ7OtX(}ETA3xX>I#&5)nc@> zSc&WiwC5P3z1sn`IgL6f)E&=Y7pBdLh|e7!x^&)N#B6Vo>I&r0K1DM3*75W`RZ(7& zfZrIHoniC8L^pxyK^iD=wYlkCO(k?ml0%-9UsTSO5UT9r`;h(2r|=ZFBM--^*4S87 z<6v)aYe2SX|I2o=+ap08`WWj`uI_*j+Mj&JX)`)S30(uMJH#>E!7ZoICDn#YyA_Sp z;P!F=&BIs`C7!MIlcsoDYh^&;!g00Zno1RJ7qQql3GvnncN*eV1JbH9f2IDK(_O5Y*=;`Lp> zh-s72*IzGYE!ngWy``$*P9#?65$#u58w<|MTC|Ws3hX4Ai+lR+)br9d{z1#}_sgGr zQk~{&>Q1EBCs<893gY&i8DpVAF^L`w#Lt3Dg`Q7KbC^hg<5YpO(^fWvoFv)@j$Vif z818%1+#=z;&+KN!7+b^t*7O<%Eo-x zHynRWmVO-S^ab~ucPJ0;9q7cr9l0qm{;tirReZcYhanVZ`pHqZ(vP~*dz+F%DqyB> zGl$4>Um^B0yu01UYOlt5Yn?wu;=TiUP5G%eH}+lKOY=&5$JsAH3DoFJYa?t{vsS#| zCI@UbY)&AeMH%YcLp@KdoC*r%zw{YW|mnd+3K7ztL}opq-W`!7X{4m*!PkIiIp|ah->C%QkOZvxIY8 z3aP%$_*+P%I5E~HWhn}231)ycs8$?0OAHe4g8Ve6H+_!^4ibM=z--jAgnfehKGA>F zCo)hgKhGgFqz;^*eulD-ajmF8qAYu^EWz4(!&7T^%LnP_!jtOo*cP#^`pi%h!THKF zl|VHpZr!-mExluuwB9AnzhO1%qJKyv?xXI`52&n$giH0rNQ755M93`y*kWa=v&njt<||sC#${VC`G&nPncv*P^lNaOg6Xn$ zfKnEl5~GHUrBtr|Y+qd)Pbg>y1j|#)VegO2EmOByn4O7B8$aTESBzDHXe)B8x(zn# zKNa@~wnbQTZLXYg^LY5-Q;Z&t^S&2bxVtP#Y2cJR=1HQh3v(r%Rc<+zN2Mec&sD^! zH^#Gec%HEb!U1bTA~$LY`BJk&uqjUU(!gD5jEEJDUYxor6=Ie)`6y9yZcs9YNYq4H`Yq~Xg){|>f+fh?ZJVSW`Ff}qMEr@>b zt?@h2t#Gmv!q5OBwIP2^hI92*mH-30$v!wluBG#VB2IVI&SLDj$xF82CmPbnv*= z4zYk-{ss({5G(@g*%%*r)rfO}>#}}{OCg2U3u7=#9SN-6==7T(M)~m+r z9~MUAKHf$an(rTYTpXdkyeCX&8x=AJRtXVtH8kk#JAjV@zdVhp0=M6B%&`=XCl1sc z^KluOV;AL*aD%nei|Hx19mj+0WhSG81&;@>c(#d8zt4eU?Ams48LJ|4MxeO(-s6sC zaPIB6ga;N|g&}!U36+Jxw>wM3D3@xqvwqA_(+M`69kz6buW`b26Fk>!b;=>}S>ClP z2fL?Hr|)3PuThJ&uvw^Ht%t{zDB(d!*ss^L2S(j3Gi;U-6qCN+C0hUzraSH%2ID2z z?YnE83{decULDh{0B)Est4Lyr^sQoRROhT;>kGXT87${4Hwr;hJnqEkz`*q>zF0#f zzHLgiei5$8D3>kl9I?>cpZ9b<_A+d_cj54kD2s&r-WrA_s^|PeIdv&Veww<+;^U0Vx>6zylUF3>Jb&^&4ni`i}0Ys*h3n63ZX zaa&l6ad0HB>{8BB!YvC(^juIB16jyU7g9Mf;-D|0dT0{2aaec&6)MQyL0*36I=`|> z1M(62N?;ZB>Pw#X1$4B?5Uc?uueUl-r@TX==K-5api}wbdwCD??95$b_opN-ino#^ zaIg6fua74Jk&;8cu2oz>p7-t8>>0F_k0h|#E^|P&fl;U zsK?PtdK6V#eYQ5U6-tFoAUoD|s~Vzqn|04xPLjqqVl2+i-8v{IhCbcHGH`hWYwUjx zcByrm4H4M}^gS9@n+wUh`{7pd%x2A^MclzXb3&I%7coq22D=p+JyMzICN7s0P+2NQ z>X=Zt_K^m1`@I-1^vP_&+gxI4iaejl0^udQ!;|i*AFJs?;+WH?QtYj3O?szOeXwvQ ztvu#b8#J}|1Dny*t3>?S00;~cF(J8Iw)sG+@|$>`!*6X}E5>S|UWapCtRp$Mmy7OJ zHmz451~66zMolHH2MPf5=1gRe_WfBn_BXC9E!Xeo(59i3h6`ah@$O~|cZ8_&ei?tj zdge^FC3e4ITkw>%O^n~kWbRTEMHF;duPf1d$ciPlj^5sE2s%j<+ zsG0Ud^Th&<3UhPtva)V-VWGWTvTYtfY%pm#2{ye{&K~P3jsf`a2M%c@E6!HUNXjpn zMR`kha?%NM46p=xj3EPc0nPN=g&ODq&c+tYIe+`um^z-4R_DMX6pS~Vq^<7Z2K{$M z8(fRAR#z)&6yf0mdGrvM0r>~Ou%8~qj?t2`eFl2~`j>3pD@r@x2gyWA>n%awEd1zG zg`dMNcnwejJ~<`*s;KdwzH8{mqir_8!eOz!B$)I~oVlrcBbi4#lrdw^bDg*^)~GMa z2!oQOwi{<@$;l!fc9;u5vr6$gm~J;D2Wr&ttrt@FK2@$4vWTr)qlcY4o=N}%OWWb9 zS@|tm{S!+{<$*?kkxtz_gF|~JmCtv{!4kmyZwumtK5ikI0fA-{#C^!#K&iOCtao)= z<8g_n>obH)6pj@E97XbhsmO#Otr>LK$?2vucTr|4xUMt-~b7diKj&&v)B1)0eUyG_8fTa0W9%-o>AjeJroPyb`LkX> z*RY2S+()q!Iv>J0$#y&nkFxx6zh}ph{3U>cBnEqQ5m=ByLi7Plii=gWxoAd&_?_%8 zd`2fhN^Jcn>S71W55M$9Hs$fQeiZ41PNn@|)wIHzenxHz+MYhrOtq^x(8))-QDiWN zW7?=avb~}*oaMp;1`7^>rdc4V8$8ypKR-~%-FQeXUZt5w=r^!fL~Lp=O?Z=c7m?TX zdT%?4{BzKmxo7k$@7TN3GE-~>Q=Zub5t=@_aqv?Erv7jxrqbkGGu~jKrM8VZO!kVh z%(AMpvP}}0R+U-M$z}t^TjxtjpBXG+a8~=?*;A0dcy5C8beU)=kqxy}%R<)!7}NJS z4iDx%j3NrM?beE)FPk0UN5;A!iAqv1q-aVV7D{%(=h9VAr#kpHW-FhSmH+HA@=UAk zBsTj6Y&$*M{CIxbj4s^2!fcs`1laZ~)mr@KX*FJ7>}BgVrx<=a+jUHrliYqyn?4IW z`3sI0COdPD$7^v_y89RMj%@wOH6D-QHJj=GBDP#(9%qJC!vDYv@$jWsuW^6!pKbrV z_;(HUGpAyb-Dsia`U_qtoB!?_9T|8#&G~PfXg=l|bZ9QZa_cX6;q8NjYdxf2l6d|m zdYgyg6=Up+{zA**g)>}(8#kU9)&7NT#0#&w1~+;y#QX(Mzs)ozf2~LArh3C)m_w#9 zpKB+pvJ&zCz!-1b3{<(+^X}EaU)aVQH(PkGo%9jZ{a^2vlU{=x56HMt|F2-4hK333 z8#p$9R^ZL(Op6o{{2*uVn0wK#S?AVW#Hsg9%n2Z~klMoNtuRx)?k z2RiCZO6rJvP9KYj+58mQvl$gx7q5zao8Mq9=#~a~hut#*BENRVo7`3UE2{1rx6Qfa)b(#3yYBc$2Z_;*=&8mB5G;nSVu7NNr#oXHW_(^dvN@p zaV{%ExsJnQlaK%&Voe>UpVCR6f3~&T=m~6mJKD1*QOp&Q6|lgKq7MAB6s+OfNJzvP zPA#P0$)l>8s;h1EOai}9A~ZeN0v)r&2ebdA2@Q0-ZB2rPJ1@Uf9iO>AP*$J#EI=)D zd5f!(fAx_|nr~qxR~~cu={4@6Gvw+u4swkR=qVcR|9{&1uBfP*XibtL0umL;C^;)p zaw9=l+g-&zCO2OpcZA@J|@6EciHQ<03sY>=M;l zy&IV&_Fb9VJi)+f#}h}iy4WmOia;fQ{;Z(s^JeN&xwcTUppmae64td#$7iS6vg!$K z3MvYeg_>LeSvK+)7I3h)cZ>>SEc0sNNe&wx)v#LijxX2UXgEq;AjF-eN`U^Hl9wNTn`XZC^?i9kN~Q>1W7Haq=BLN`LAtyRJVrH@Z{e3XO3{l*ftp&Jo6yle&7PLJW7B4d3>92 zXo@q9!+U3DpHuVf#iWAXik@#0+vU0Sd`{bfn_VFYtvSiZ1*V=uE^d#@8|0P#r9OW(%%2E4$ zhEq>OUEM{ok5!#_uoTEIZoj@WNZePGU$q{^Ypx}uxlE#N2G ztk2jU;*ZS|>3tfT7epk|lIxf=D#Rn0r#2I4GPpOXmbKbWZ@fz;>?9W!?;;IpRA`g&>>n{#&uE;LGo22D*UP=8N%MUV3j9q{#c$}K}6<-tHl1azYwFGLwY zQR)HqGuZfq4@i07r*tD(|VC0q`s!1LFxo z-5#{X*?f!x1DPXKa^Oq8+af0X;L82=U8Uork8iod(@AH(-ossAe`_-h;gQI5Y5^AEQE z-+~ynm1mc-7S+xGW-vtZ+&je;E~YLp-nRMwPL0&=`jcr2C~_k&5MXNGiU%Wj@F4)1 z)9LZ-|E%io96B!pAUsX?-~jss_?rL-H%oHf0fX>zA%NDBvubC&jAKF6H_+-4wv-=0on0wZ%yIxwE87wl&s{E0B&dbIFLfx@-l(*_s?k~<>c@oZTG z&WyjoW01dw7vcuE8D2Eew&3y1v;gkWVd4Dif0pofAUg$Qt^O6{f7rP#>w9`-0txZ) z541lYwy*&Sp`q3({M8`2<~W>taGuBhpi(kuxVnJtP>5tQ^Jbmqkmya&PQs`Jb6I2T zwDomBt8_jX4X{C5&wpT!!5rPF=#6jo??E6?j@uXg9t_&>wD}1VaouL&6Ko=vq-;}^?CK1G9AggIWqP+@I6CiC0Vk{Qx=}mmaFTgPR~S>xBosE^ zG^^(-zb{a{28GF8J5eYcX=gD%Xy!l)z|?~db!ty5(HmmI-)42k^X-uKutr=%K=tW% zMmi!$&Kj=i46FKqINU%VA{Zy8lV?Oy7tJh8gbtRdT+tZ;F&x{)zOL@Euj zt?qY&9bF0qzVZY(e?xagcmr@zMVTMH+6ap z4}#Psowf*Mz*E`U-z+JB?9VjpGdS3l!oHDZ57c z)^P1BJwYe+_FV~*C~n3bXl!~-Ww?xOvRg7PUdBj4o);>;ExGgTJYIt^MyEBKg1gMt5)MDtXDJUoLft#?CB-BiuL^^q>-qT>-5?oUda4ZN0#b;p)`&oh{t^ zZkQYVbY7jjZvL8?6;8pnImtfP*0s?ji_eP7$p7*D#L&~m!>GP2P$krmAP$d51hg&h z;qHFXWCNFW>>XXpl1lipziC$6t@e70xQ}1nDRPAmx^Kiy&TzX%WpTy`BHwTp5EmFF zT&j~E(~X;eJ3XTj<>*fKbf+7@W)TSK$YySbvb#%okE@TYt`0R zwJ$6V9*avp9qzbV(va$15eh3y}Q{=*aYUIk6obBjDQV_0}3)N(=>0G z(@v^m?>8*XI-6~k-?96m>uh&WBcr0FjTo(F&sr8gs?-wv!du#v*z&m|ZnjY3dcY0* z+cn#LUR-S?EJC<=18ioG z-KN;L)qQtO$MvqO=;H)j-cQDPbO|h}6FbYo|LA){wH^FKz>Zn;YgaW!*rx$!`#td% zdvC8}

(0ch9)mB~CMMRW1(u>_>Aryu<+8ZRb>o-Z*awmnqO6mUhu@$D zX5ySiSnfcx1OzJ#Q#G7gKg)J7dI~b8_aLNu4{3y5jrWUZF}-h(m#wlf={(2VLo}6L zEbEdFUY@jyerYt$E~%y4c?%!Cw4G3ZX~^y}QO%AYPdX+N$mBX{VErb3e0&G9>bP9? z((a?Wt@JP0Va92_ioyIxd6G45_`o9yT&WgwrU1_E*;^D=Bj_N(xnXG}Y|tF%iSAs$ zJ?t&n7$q){gO%i41X@|Y$=i&M!!<5%&OcrkgYM@$QTsFnpf$~9Y_jwUvwyvz>*D9$ zBe6lH3P-SJUDs`?(Yg|JNRzpVa_ZkrE8`8+E^559F@(Nx=B(x&1bLpve0BDq?T3M# zP|wu;aNEFL7m?N3&iPd{A1FD!oKoHCBGhim7iZ17=^~CD3@cLG@N}t(dF6l8J?s7D zBP&`N$&+G>PvQb2?6Bu)R%SzXlR`s5yNRc7NwmCD4k#+W*)TAr&hkef=3C|JzafM6 z-mRhI#5FejH!jDO5YIcn_kn_n=*PX2wL4Ipp#X00ZPJde4om!_nA3XJ@_3iB@yxLJ z6N-AxshA+n39)QmpblUMH|&}&%qdmYsA^CFwdY5%5V>;O!g-7rn-Y*GkeC*cwx<^s44{o@X5`PWZ9J zeF{qrEE7{ynFn*Hgr+lj-tnw$9RkuID7f$yh{ve8X%oQl7z9bW*TrT1HbFQ+cm+jw zp1X@}op8wH)tdtxKkR7F)5!_fTzMt#G3cHCN}^-S;0MnVicQEi=w7qGI_16z^FHp5 zAmYV5NYYpP*Lew%7wTV1dt&t#@Jty8Ume0l4kc|6e<;}-H-3L8K2Mw)<9an$d*CWK zqGWp%f~6zpXzj^b>Q6rDdeZvd7VO1R072Fsn~)i}kPl=O@M0Sm+lRr>-~XH-aD&%+ zTgYX|9jj8uD$Oi{P8!upl4%uJdig4Hfec(a>oM)wVCOj)5(|No>nZodut&#!fNBjeB+#Pg=sFQUt}V?M$sByc zVfWk@6rcxjrzOYQ=r6n{cW5iKq%Ag5;)JqU_PSO#aVjsf<+xZ~B0a}m!{7KFP6|Pp zysYK-FqS^2C!JT2?_CPJrcj7H2`)#QS@1&333{mSE7E7lE3QE~q=cJF>JhBtm2rM3 zYmUPJn<}OWxK)t%mchO(w}UQo0@Y}5f;$Q=-mtdEYKzQ;tGP@Wlk3PQRibu-0~`jJ z(4SckzpZXEtvkVXKqd+=ge^pq4?-d^>LeAUG5^a+virxZ5~tl$VjZTFoG zE8^DR%=};ANA){N{OkHK?6={J0HIetuF25TLLF>gb|1^JFS)~+C7yXeviFnAI!-xT zf_aegrwILHGh0(Ctj(s+7vc4Gk$~4szSWIueCnEv{MpW4kBtyU(ms(Vo5pqvx>2(*wATTV2L-6(#!7t zTS^~xm*kTUkirSGq-Rp>dEocj@~`c6HhgBkmq<{4?SVI`Sogz@~A@H6KHBvYhwO? z#ZkY*)10Mq$Cj`y8it${VnS#_Kx*XG436h}ybl7sZ`8_h-Ewl`hOCsXz6M#HJ>d{} zx}2->H2EnC=Ry5Z0u`PDE5b(G<{ZwPxUiW5$2F$U56?`j6qr~G0@(u!av}duAN)(Cu*k72}?GKpMU;m z-GL%w02jugrFI@X?U^Kid;0s}Z+GOsDV{bQYMQyz*oY;72{%<=P+zB~5lgMvMd@c2 zNBu~%@f#_lDKXi#&!!AqmkbECY2!_7>E}eKrtS&wuSLBhNujzL9)Im>oIb%@waz*1 z6!FqJ8x>6=GCJ}C$Vy9aGg9iXuEjNXeX3=><<+j7`bxu+{E`$BEqgiu&03No4oNw8 zf#)X8U3}0cxbRgoIG9>k{nx)GS^=yC9=zLB`swGkm&uDw8a9ug9Z^JOAf0j*JU(&yD|`9A8KSxfa0hxk~>k!Bz4c!4S_h-olv?+3XMt~IJ zmP&B&Tw+#UCaCQr1ZaDvvv>t$8a%@B@Y{LiRAj(yAwb)?%pO6ouxJ5c{T1N;%Fx~axXJ9*O zMY4yXt%TG{2$(vJiy3PkV$EpoTq3J?uPf~JQ|{*KHEFL}65q|0^scWjE$lpOs)?(v zt@iP8DR8=I)eL2=%iW(_0|h`ccSGb^6{R-)O^nVrdGxwa&2p3}*oMDpzR?@7RWe)p zrr3CJiCAKVQxtDV>X`Qhs9uPEKs%tMOes-Cn5 zZ%UITSd#jfzjqgI0L58WPvf+oJ~nHR%C$_Vd*c{`bkAmz_0{q>P6i5pS+I!jGZ{?G z^qvdc8*$$oTee5Nw`zLZ7(l__t48JIrnOxK9`e{ z#9a~{&#hj4*XbI= z*7B3RlNiZ#{ZxDLfMzB4vWbDmFH7Xz4YwXt^YzeH6S!z3kCsv`nzW$fd~=S?;EXX& z?fGU0AG(mI#s)1=M_ii8UPskMaa*I6FmF&nfSJfAKH=m@ygADNeg<0^q#p_q9D%$y~us}Oq)T;ZU!^)n?$d*>L zkcId>&RDp$3X*E?JD$XKr8q@_}nX`;@t7A9I@43D;12i=yH@V&)&99 zs>04hp~gO=eQ4yxOo^cnb4{Dh@ zrx#w9=6*+-%j~bLg7AM*U8g{s=Hr8&q?5)aL5o}t$8rn$g`76lMXL=?%B~2UzS8J@ zn)V?SHBjk{eDP}*3YO=xaZU`OMq|~c=Ff&5Z5}U7ytiDHG;=X`Q!%Hu_a}X~wx+R)ngjxtLzM`EYffF%=yBo%kw+`Brr51_Iv5Y< z&7os-_{Ga_0&~!_`jJu=3WnQ(W{u9FX8_h_y9BkjVOA|S; zS5+Ins@I=xr%OZ19Jzt|X|b5@@t`oh*Q_A^90ku(-z=g_x~TRr5MG{FMj&@^On+I@ z{4GDO|4vigc+6dEg(Y1Eizemg;~G_1{yd*3|K2XzLf3gVe|yLK7Iaz`gH&Eke7i$D zXwmH;5tO&2jSl5Mn6e#iZ~a=1`|vp`&HMPZ*}F<7^G5r)iygE)4&NYF6;gcJQVe7% z#ZY^VG4s_G>qQ19GpWWVkH(_3D3yGV$;ZnARYH&?_a`KnI=ebGk=(7S9rho zYH_l$``v|*DL!HT0o{lo>L8+R&jT5~K~)`-;?ydmTKhM=^+w-Y-DnXISy+v&bJ*%%!mTT}Ru$m}{UD|KRcDV*{c1 z`Z`6Dah)Y&o&1D(Uz&ZbSNru7bu;5nWUJX?tE{}9r`KCr#k*z0pA<_76~B)$6Al#^ z+cG~|vB(YGm_5Al67GItr*QX2K+jFx9R_y-_3xiXYvo~>=viQ^^t_~%C-YKz6lA5@w$@X=H}R*rL8Z5$Kqb!nnJYhl&fJik25j8 zzS?rc!6z#BtE$%cYqLMc(8PUhb!8b^p;4sPepOcE_XNQoPZUkGsk?f9b zeXquodz^EQUQKbcU!{l4Nr$#gix_av>wHR{6N2RYQ7>n6H0L8_s)g!5H*$VEoLMB4 zdQTUXdC%Ae!jP}J+l^h?m(+C!ZtRNYWZx;aC)cWSTY8RKwjJ`$q_EZ<;TjYIy~D&A z>xJKbk^7vPAaYQ{ty|Fv$GKWmqWB_leuK~ak6z7ChUBNuB{>j;57kl8_qkLLMLG%p z>$(QZ5XB4S*rrpF6uDx04aLqNz-y~EKPR>W|7d^mu4Wys4N1*V(De55@bC-h9u@zo z^bgE3kA^Krc}c|yG*HTAm5_Y@a1-6lTI@{vIBf22(;VUMMKPBSBD)$H#F=wCkMLj{ zLPV{LqK&L6h5X%oeCI(GSQPg7(Am}BJy^pb$}?O6>^tLyT)^)H%!wQm+I% z*BFDem`Q^ZzN^gIP?7deFLwle(k3=S$NEBx@^;0u;xzI5FVcPi{|)d%#m*9a7n&ZK zFo?5AGn3U;GN@dEUf%q*wO#3&C9`u;+_&S2s?Bw5_4_|;TQJ0(bkf*GPegU{Z9k)W z#me%AoHTvUP){d|$@X)bJ-hv&q)~BtWN?M$(OnE&#vn#+C-|;VX5!{o6>-D$o3r`q zG!fZ)D?b$mgAL@@Wp`BEPYlkGpvo5}jqwZCTZOt{ijAcn@sCBD5iH{B=P(5c;>I)Y zRSkE<{46U(UPccshvX_bAWhl1N4@8kgIavwYtZ!;@pDI~-}-XqYDXaF%nYw}W?0%U z-IUjHc{PcBAM$>7Pb<;Dd-&c&ilHq^H0aA_zj%JP9qgJ}`?Tn&(=B;=X2;4?dTd^qcV29YpgN_pKZtxBBxYwOWT@x)YMF?a|CN%b84UFuSIoreqg>@bnCww}T%}G@` z90#g_U_(wPC|o8woKJR{{V3ioPtZ47I|P!I8-9RafFUx)G|yp~$KiH1%N`ohEE$NQ zHuK1%s6Rd^1bX3#TS|E;sh=#%dYRmiQQXHMNltFLiv4qGJy$i%UpC7{J{Tp?zG$th z|I)09y4U9$ib;Dr1<}`wG?JXUVt~m2GeUVpPmdh@^U~-}yj$o8TIz0oPtToT;q)Pd4 z(?Qg~HGRR*vzt+aT7??py_yc>crI_oi-OR7IWQ#Of+DDoh<5c;o8JoWFBI~v;V$h5 z+o`ev7XFM33TnOh+89T=KZ;-dTk%Z;jMY8_{Q!Lk(q=`VF4^8~bvg+qNiQg0q}01E z{^Ja#`2uL8Mj+cku^oi%E)ZiEf0F;VBVaW+41GYq zHfV9!o`wu>=*&{gZv0O~&>UwQZRHd7yAsO;5|bMpCbgKPF^$zB z7tfm@v*rc^{-Pq$%Wm4LY+Hq{hZRj&(8j%E6!gF)Mwm~cQz*p-A5%Y??j`3@J0Qjz z>(!g52*S+CE5JWt@Z42gVKwa6FfB^ng;$2>ne6k6io`WrJl&CqdILIY^kBTe(aDhb znkwv`%&fjTGh#6K%Ji6_FMWI{+b$Jc>FPF%IXK24&E>^=v(MTY9yi|J+%zxet6p5#ALnGSjb=rOX!4JwIN23$#EUB! zdql5{Q`EF6UE#&bLPJ6q&b@u0YZD6 zuFOx8_R?Z=Nx6$X|4?G8gnQ$3Dn_p5gZ&%%v`4Ck6mcSJo<&Yk?$xRe;@u1(+o5zQ z;W4APyf!@ybeOw`mDt>%mi-il9>-ob_e>wNS>@6i@5Ad&ZoOtXp9N#m`gcNw(nUTE zovf|Kz!s6_*3zG>DHRH~WR6!dip)oI_G+ShXwbxeY#eas_p(|vueGF8A>1cB&}$`L z?-t2r`U)rEvMOIjp_hdZ#8Y+Iv&#WT&JVu%N7iD8Mc?2sl zS`!M`)MIh$SX{L<^Wk~|k}i$VK52W@@CPTi{9fjW^iYS^=wR5v{gdphx)1AQ2VjuP z;Sb4YR_to_Oq|-F`Z6x5Alglq?)BsGOS88e%ylx=v=`Y0J9`s8U9Z~}KdBjre0g*| zI@Cu=QFSEYtC$)4%UbAF6tXdZr;{g5!l#jp_{_HxAcN64mRN*28MMN4_D28UPLAKH zN2lPAAiKcMN*S1&Y$0@F*0xFmfh|LAV)QIrkjpqkVQN*JV&Uze)eoPk(lIHsTT71P zSM|>|fwbaxT$@kM^ZaG1%9i~^^`WWqQ2N3|<1ltI$crOSjl$oKg5W=3x2a7RActrfk9>7N==Q-E0-5ipX%o% zOPK1kzMRh(LLnAiObU!N8-D3Zu5R2kFpL*=l_1@Lj+CZ}+?B53k>wOP9sV%=@a=bM za470ZO*e)`G1Qh)?E%lhjD6XxhAMI!oh!uZDu*K)PlJQJhFhd!&Hy-#?pog`Q4 ze7w67>qm-T6uH}J_YZ0#S73DIBgf}*^=U4b4+A|{`N2`Y5wN@H55bHT5TVB#HF(XVUn?TPAr0VRfs`lE$CiR{sGqsJ)F4#cy|-culrcJLc3;L-+4@+L(d6 zEP7SFuU`z+VeR=C7{ONYtI$ld80CpvXUj`lYi^pu^n%+UVLa6j4jzp7Xb1{p@CXI~ z&LD3$PYnE-y*$XETzhHJp*d_zdtKpCvDJ2n-?=n#n`a{9%xAA;+)`=#fWI(an{$(; zjF^>o5Knw153UNs_}A98NJ0v#JEYpP!ADoYkQYE49&X#h^a1|(m3=x@!b5WAw9?6% z;5z1mm7&5%jgkwI2w$8Ex9|(=yeB4~413dV+}8HKJnpxaCsGkmT&dlmzJe3%704>g zEgs#g4EOauIvSNgGW&(5$=Jxgy-9^L`vJObmQ#PutyG+co_#}qIf`S{%j=LOlWfsx z(I%$!=+n*Ps;6+oYFeZN#6&2d7>mj*?quHo6vpTi$ zX8W+9^Xf6htpBbCz)M^waw`oU^noVN!`Y^cZmBoWTieB?Q9o(6%Sz6jYjKQT^Z&!ga2)i04b0RhYfZynA%v z6D_-?#ibJdy*33rJc3bmWkthuw}|2(9T3;RrcWSuS}mvF8-Zz@j$F2$Ncq*0k%H3ng#g z+6Zz4pWlX2t2G8cE@@aG=M1|ZhHc!}?sM_n^X;Plqwp8@S|Nkw#0mhBwtsJ?d5?B~ z6R;+J;igq?BaShbb^3@&c)G^#fQ(6-*>58tAkUv~ssJXB*=B@(Q*sMJK^tdsaIXVL z)^QALAixQR+y>f67MA8f<6xuY1;WzdduR4HH6H|`&Z9tgCO%igC(y`0e*%6tRu5>q zjc&LFwj}@k*#0-|8b>U>;V+vN{pu)#h+xXgg1RP_3$!?tEf8nlqODgRzPG`367UGN zsqclGG;