close Warning: HTML preview using PatchRenderer failed (ValueError: need more than 1 value to unpack)

Ticket #6470: fulltextsearch_v2.diff

File fulltextsearch_v2.diff, 36.3 KB (added by Markus Schulz <msc@…>, 15 years ago)

V2 with support for all themes via default/default-wide filter-screen

Line 
1diff --git a/mythplugins/mythvideo/mythvideo/videofilter.cpp b/mythplugins/mythvideo/mythvideo/videofilter.cpp
2index 16317b5..7e722cb 100644
3--- a/mythplugins/mythvideo/mythvideo/videofilter.cpp
4+++ b/mythplugins/mythvideo/mythvideo/videofilter.cpp
5@@ -5,6 +5,7 @@
6 #include <mythtv/libmythui/mythuibuttonlist.h>
7 #include <mythtv/libmythui/mythuibutton.h>
8 #include <mythtv/libmythui/mythuitext.h>
9+#include <mythtv/libmythui/mythuitextedit.h>
10 
11 #include "globals.h"
12 #include "videolist.h"
13@@ -72,6 +73,7 @@ VideoFilterSettings::VideoFilterSettings(bool loaddefaultsettings,
14     userrating(kUserRatingFilterAll), browse(kBrowseFilterAll),
15     m_inetref(kInetRefFilterAll), m_coverfile(kCoverFileFilterAll),
16     orderby(kOrderByTitle), m_parental_level(ParentalLevel::plNone),
17+    fulltextsearch(""), season(-1), episode(-1), re_season("(\\d+)[xX](\\d*)"),
18     m_changed_state(0)
19 {
20     if (_prefix.isEmpty())
21@@ -192,6 +194,18 @@ VideoFilterSettings::operator=(const VideoFilterSettings &rhs)
22         m_parental_level = rhs.m_parental_level;
23     }
24 
25+    if (fulltextsearch != rhs.fulltextsearch)
26+    {
27+       fulltextsearch = rhs.fulltextsearch;
28+       m_changed_state |= kFilterTextsearchChanged;
29+    }
30+    if (season != rhs.season || episode != rhs.episode)
31+    {
32+       season = rhs.season;
33+       episode = rhs.episode;
34+       m_changed_state |= kFilterTextsearchChanged;
35+    }
36+
37     return *this;
38 }
39 
40@@ -214,7 +228,20 @@ bool VideoFilterSettings::matches_filter(const Metadata &mdata) const
41 {
42     bool matches = true;
43 
44-    if (genre != kGenreFilterAll)
45+    //fulltext search
46+    if (!fulltextsearch.isEmpty())
47+    {
48+       matches = false;
49+       matches = matches || mdata.GetTitle().contains(fulltextsearch, Qt::CaseInsensitive);
50+       matches = matches || mdata.GetSubtitle().contains(fulltextsearch, Qt::CaseInsensitive);
51+       matches = matches || mdata.GetPlot().contains(fulltextsearch, Qt::CaseInsensitive);
52+    }
53+    //search for season with optionally episode nr.
54+    if (matches && season != -1) {
55+       matches = season == mdata.GetSeason();
56+       matches = matches && (episode == -1 || episode == mdata.GetEpisode());
57+    }
58+    if (matches && genre != kGenreFilterAll)
59     {
60         matches = false;
61 
62@@ -424,6 +451,37 @@ bool VideoFilterSettings::meta_less_than(const Metadata &lhs,
63     return ret;
64 }
65 
66+void VideoFilterSettings::setFulltextSearch(QString val)
67+{
68+       m_changed_state |= kFilterTextsearchChanged;
69+       if (re_season.indexIn(val) != -1)
70+       {
71+               bool res;
72+               QStringList list = re_season.capturedTexts();
73+               season = list[1].toInt(&res);
74+               if (!res)
75+                       season = -1;
76+               if (list.size() > 2) {
77+                       episode = list[2].toInt(&res);
78+                       if (!res)
79+                               episode = -1;
80+               }
81+               else {
82+                       episode = -1;
83+               }
84+               //clear \dX\d from string for string-search in plot/title/subtitle
85+               fulltextsearch = val;
86+               fulltextsearch.replace(re_season, "");
87+               fulltextsearch = fulltextsearch.simplified ();
88+       }
89+       else
90+       {
91+       fulltextsearch = val;
92+               season = -1;
93+               episode = -1;
94+       }
95+}
96+
97 /////////////////////////////////
98 // VideoFilterDialog
99 /////////////////////////////////
100@@ -432,7 +490,7 @@ VideoFilterDialog::VideoFilterDialog(MythScreenStack *lparent, QString lname,
101     m_browseList(0), m_orderbyList(0), m_yearList(0), m_userratingList(0),
102     m_categoryList(0), m_countryList(0), m_genreList(0), m_castList(0),
103     m_runtimeList(0), m_inetrefList(0), m_coverfileList(0), m_saveButton(0),
104-    m_doneButton(0), m_numvideosText(0), m_videoList(*video_list)
105+    m_doneButton(0), m_numvideosText(0), m_fulltextsearch(0), m_videoList(*video_list)
106 {
107     m_fsp = new BasicFilterSettingsProxy<VideoList>(*video_list);
108     m_settings = m_fsp->getSettings();
109@@ -449,6 +507,7 @@ bool VideoFilterDialog::Create()
110         return false;
111 
112     bool err = false;
113+    UIUtilE::Assign(this, m_fulltextsearch, "fulltextsearch_input", &err);
114     UIUtilE::Assign(this, m_yearList, "year_select", &err);
115     UIUtilE::Assign(this, m_userratingList, "userrating_select", &err);
116     UIUtilE::Assign(this, m_categoryList, "category_select", &err);
117@@ -500,6 +559,8 @@ bool VideoFilterDialog::Create()
118             SLOT(SetCoverFile(MythUIButtonListItem*)));
119     connect(m_orderbyList, SIGNAL(itemSelected(MythUIButtonListItem*)),
120             SLOT(setOrderby(MythUIButtonListItem*)));
121+    connect(m_fulltextsearch, SIGNAL(valueChanged()),
122+               SLOT(setFulltextSearch()));
123 
124     connect(m_saveButton, SIGNAL(Clicked()), SLOT(saveAsDefault()));
125     connect(m_doneButton, SIGNAL(Clicked()), SLOT(saveAndExit()));
126@@ -778,3 +839,9 @@ void VideoFilterDialog::setOrderby(MythUIButtonListItem *item)
127             .setOrderby((VideoFilterSettings::ordering)item->GetData().toInt());
128     update_numvideo();
129 }
130+
131+void VideoFilterDialog::setFulltextSearch()
132+{
133+       m_settings.setFulltextSearch(m_fulltextsearch->GetText());
134+       update_numvideo();
135+}
136diff --git a/mythplugins/mythvideo/mythvideo/videofilter.h b/mythplugins/mythvideo/mythvideo/videofilter.h
137index c3839bf..1e51470 100644
138--- a/mythplugins/mythvideo/mythvideo/videofilter.h
139+++ b/mythplugins/mythvideo/mythvideo/videofilter.h
140@@ -30,7 +30,8 @@ class VideoFilterSettings
141         kFilterInetRefChanged = (1 << 8),
142         kFilterCoverFileChanged = (1 << 9),
143         kFilterParentalLevelChanged = (1 << 10),
144-        kFilterCastChanged = (1 << 11)
145+        kFilterCastChanged = (1 << 11),
146+        kFilterTextsearchChanged = (1 << 12)
147     };
148 
149   public:
150@@ -121,6 +122,9 @@ class VideoFilterSettings
151         orderby = lorderby;
152     }
153 
154+    QString getFulltextSearch() const { return fulltextsearch;}
155+    void setFulltextSearch(QString val);
156+
157     ParentalLevel::Level getParentalLevel() const { return m_parental_level; }
158     void setParentalLevel(ParentalLevel::Level parental_level)
159     {
160@@ -163,6 +167,11 @@ class VideoFilterSettings
161     ordering orderby;
162     ParentalLevel::Level m_parental_level;
163     QString prefix;
164+    QString fulltextsearch;
165+    int season;
166+    int episode;
167+    QRegExp re_season;
168+
169 
170     unsigned int m_changed_state;
171 };
172@@ -223,6 +232,7 @@ class VideoFilterDialog : public MythScreenType
173     void SetInetRef(MythUIButtonListItem *item);
174     void SetCoverFile(MythUIButtonListItem *item);
175     void setOrderby(MythUIButtonListItem *item);
176+    void setFulltextSearch();
177 
178  private:
179     void fillWidgets();
180@@ -243,6 +253,7 @@ class VideoFilterDialog : public MythScreenType
181     MythUIButton    *m_saveButton;
182     MythUIButton    *m_doneButton;
183     MythUIText      *m_numvideosText;
184+    MythUITextEdit     *m_fulltextsearch;
185 
186     const VideoList &m_videoList;
187     FilterSettingsProxy *m_fsp;
188diff --git a/mythplugins/mythvideo/theme/default-wide/video-ui.xml b/mythplugins/mythvideo/theme/default-wide/video-ui.xml
189index 0880416..75f06dd 100644
190--- a/mythplugins/mythvideo/theme/default-wide/video-ui.xml
191+++ b/mythplugins/mythvideo/theme/default-wide/video-ui.xml
192@@ -1167,122 +1167,132 @@
193         </textarea>
194 
195         <!-- Labels -->
196+        <textarea name="fullsearch_text">
197+            <area>10,127,250,30</area>
198+            <value>Fulltext search:</value>
199+            <font>basemedium</font>
200+            <align>right</align>
201+        </textarea>
202+
203+        <textedit name="fulltextsearch_input" from="basetextedit">
204+            <position>300,120</position>
205+        </textedit>
206 
207         <textarea name="category_text" from="basetextarea">
208-            <area>10,127,140,34</area>
209+            <area>10,191,140,34</area>
210             <value>Category :</value>
211             <align>right,top</align>
212         </textarea>
213 
214         <textarea name="genre_text" from="category_text">
215-            <position>10,171</position>
216+            <position>10,225</position>
217             <value>Genre :</value>
218         </textarea>
219 
220         <textarea name="country_text" from="category_text">
221-            <position>10,215</position>
222+            <position>10,279</position>
223             <value>Country :</value>
224         </textarea>
225 
226         <textarea name="cast_text" from="category_text">
227-            <position>10,259</position>
228+            <position>10,323</position>
229             <value>Actor/Actress :</value>
230         </textarea>
231 
232         <textarea name="year_text" from="category_text">
233-            <position>10,303</position>
234+            <position>10,367</position>
235             <value>Year :</value>
236         </textarea>
237 
238         <textarea name="runtime_text" from="category_text">
239-            <position>10,347</position>
240+            <position>10,411</position>
241             <value>Runtime :</value>
242         </textarea>
243 
244         <textarea name="userrating_text" from="category_text">
245-            <position>400,127</position>
246+            <position>400,191</position>
247             <value>User Rating :</value>
248         </textarea>
249 
250         <textarea name="browse_text" from="category_text">
251-            <position>400,171</position>
252+            <position>400,235</position>
253             <value>Browse :</value>
254         </textarea>
255 
256         <textarea name="inetref_text" from="category_text">
257-            <position>400,215</position>
258+            <position>400,279</position>
259             <value>InetRef :</value>
260         </textarea>
261 
262         <textarea name="coverfile_text" from="category_text">
263-            <position>400,259</position>
264+            <position>400,323</position>
265             <value>Cover File :</value>
266         </textarea>
267 
268         <textarea name="orderby_text" from="category_text">
269-            <position>400,303</position>
270+            <position>400,367</position>
271             <value>Sort by :</value>
272         </textarea>
273 
274         <!-- Widgets -->
275 
276         <buttonlist name="category_select" from="baseselector">
277-            <position>160,120</position>
278+            <position>160,184</position>
279         </buttonlist>
280 
281         <buttonlist name="genre_select" from="baseselector">
282-            <position>160,164</position>
283+            <position>160,228</position>
284         </buttonlist>
285 
286         <buttonlist name="country_select" from="baseselector">
287-            <position>160,208</position>
288+            <position>160,272</position>
289         </buttonlist>
290 
291         <buttonlist name="cast_select" from="baseselector">
292-            <position>160,252</position>
293+            <position>160,316</position>
294         </buttonlist>
295 
296         <buttonlist name="year_select" from="baseselector">
297-            <position>160,296</position>
298+            <position>160,360</position>
299         </buttonlist>
300 
301         <buttonlist name="runtime_select" from="baseselector">
302-            <position>160,340</position>
303+            <position>160,404</position>
304         </buttonlist>
305 
306         <buttonlist name="userrating_select" from="baseselector">
307-            <position>550,120</position>
308+            <position>550,184</position>
309         </buttonlist>
310 
311         <buttonlist name="browse_select" from="baseselector">
312-            <position>550,164</position>
313+            <position>550,228</position>
314         </buttonlist>
315 
316         <buttonlist name="inetref_select" from="baseselector">
317-            <position>550,208</position>
318+            <position>550,272</position>
319         </buttonlist>
320 
321         <buttonlist name="coverfile_select" from="baseselector">
322-            <position>550,252</position>
323+            <position>550,316</position>
324         </buttonlist>
325 
326         <buttonlist name="orderby_select" from="baseselector">
327-            <position>550,296</position>
328+            <position>550,360</position>
329         </buttonlist>
330 
331         <textarea name="numvideos_text" from="basetextarea">
332-            <area>20,430,760,30</area>
333+            <area>20,490,760,30</area>
334             <value>Result</value>
335             <align>allcenter</align>
336         </textarea>
337 
338         <button name="done_button" from="basebutton">
339-            <position>400,505</position>
340+            <position>400,545</position>
341             <value>Done</value>
342         </button>
343 
344         <button name="save_button" from="basebutton">
345-            <position>200,505</position>
346+            <position>200,545</position>
347             <value>Save as default</value>
348         </button>
349 
350diff --git a/mythplugins/mythvideo/theme/default/video-ui.xml b/mythplugins/mythvideo/theme/default/video-ui.xml
351index 5b21436..2182a46 100644
352--- a/mythplugins/mythvideo/theme/default/video-ui.xml
353+++ b/mythplugins/mythvideo/theme/default/video-ui.xml
354@@ -1078,125 +1078,135 @@
355         </textarea>
356 
357         <!-- Labels -->
358+        <textarea name="fullsearch_text">
359+            <area>10,127,250,30</area>
360+            <value>Fulltext search:</value>
361+            <font>basemedium</font>
362+            <align>right</align>
363+        </textarea>
364+
365+        <textedit name="fulltextsearch_input" from="basetextedit">
366+            <position>300,120</position>
367+        </textedit>
368 
369         <textarea name="category_text" from="basetextarea">
370-            <area>10,127,140,34</area>
371+            <area>10,191,140,34</area>
372             <value>Category :</value>
373             <align>right,top</align>
374         </textarea>
375 
376         <textarea name="genre_text" from="category_text">
377-            <position>10,171</position>
378+            <position>10,225</position>
379             <value>Genre :</value>
380         </textarea>
381 
382         <textarea name="country_text" from="category_text">
383-            <position>10,215</position>
384+            <position>10,279</position>
385             <value>Country :</value>
386         </textarea>
387 
388         <textarea name="cast_text" from="category_text">
389-            <position>10,259</position>
390+            <position>10,323</position>
391             <value>Actor/Actress :</value>
392         </textarea>
393 
394         <textarea name="year_text" from="category_text">
395-            <position>10,303</position>
396+            <position>10,367</position>
397             <value>Year :</value>
398         </textarea>
399 
400         <textarea name="runtime_text" from="category_text">
401-            <position>10,347</position>
402+            <position>10,411</position>
403             <value>Runtime :</value>
404         </textarea>
405 
406         <textarea name="userrating_text" from="category_text">
407-            <position>400,127</position>
408+            <position>400,191</position>
409             <value>User Rating :</value>
410         </textarea>
411 
412         <textarea name="browse_text" from="category_text">
413-            <position>400,171</position>
414+            <position>400,235</position>
415             <value>Browse :</value>
416         </textarea>
417 
418         <textarea name="inetref_text" from="category_text">
419-            <position>400,215</position>
420+            <position>400,279</position>
421             <value>InetRef :</value>
422         </textarea>
423 
424         <textarea name="coverfile_text" from="category_text">
425-            <position>400,259</position>
426+            <position>400,323</position>
427             <value>Cover File :</value>
428         </textarea>
429 
430         <textarea name="orderby_text" from="category_text">
431-            <position>400,303</position>
432+            <position>400,367</position>
433             <value>Sort by :</value>
434         </textarea>
435 
436         <!-- Widgets -->
437 
438         <buttonlist name="category_select" from="baseselector">
439-            <position>160,120</position>
440+            <position>160,184</position>
441         </buttonlist>
442 
443         <buttonlist name="genre_select" from="baseselector">
444-            <position>160,164</position>
445+            <position>160,228</position>
446         </buttonlist>
447 
448         <buttonlist name="country_select" from="baseselector">
449-            <position>160,208</position>
450+            <position>160,272</position>
451         </buttonlist>
452 
453         <buttonlist name="cast_select" from="baseselector">
454-            <position>160,252</position>
455+            <position>160,316</position>
456         </buttonlist>
457 
458         <buttonlist name="year_select" from="baseselector">
459-            <position>160,296</position>
460+            <position>160,360</position>
461         </buttonlist>
462 
463         <buttonlist name="runtime_select" from="baseselector">
464-            <position>160,340</position>
465+            <position>160,404</position>
466         </buttonlist>
467 
468         <buttonlist name="userrating_select" from="baseselector">
469-            <position>550,120</position>
470+            <position>550,184</position>
471         </buttonlist>
472 
473         <buttonlist name="browse_select" from="baseselector">
474-            <position>550,164</position>
475+            <position>550,228</position>
476         </buttonlist>
477 
478         <buttonlist name="inetref_select" from="baseselector">
479-            <position>550,208</position>
480+            <position>550,272</position>
481         </buttonlist>
482 
483         <buttonlist name="coverfile_select" from="baseselector">
484-            <position>550,252</position>
485+            <position>550,316</position>
486         </buttonlist>
487 
488         <buttonlist name="orderby_select" from="baseselector">
489-            <position>550,296</position>
490+            <position>550,360</position>
491         </buttonlist>
492 
493         <textarea name="numvideos_text" from="basetextarea">
494-            <area>20,430,760,30</area>
495+            <area>20,490,760,30</area>
496             <value>Result</value>
497             <align>allcenter</align>
498         </textarea>
499 
500         <button name="done_button" from="basebutton">
501-            <position>400,505</position>
502+            <position>400,545</position>
503             <value>Done</value>
504         </button>
505 
506         <button name="save_button" from="basebutton">
507-            <position>200,505</position>
508+            <position>200,545</position>
509             <value>Save as default</value>
510         </button>
511 
512     </window>
513-</mythuitheme>
514+ </mythuitheme>
515 <!-- vim: set expandtab ts=4 sw=4 : -->
516diff --git a/mythtv/themes/Terra/video-ui.xml b/mythtv/themes/Terra/video-ui.xml
517index 390a99c..387d03d 100644
518--- a/mythtv/themes/Terra/video-ui.xml
519+++ b/mythtv/themes/Terra/video-ui.xml
520@@ -95,7 +95,7 @@
521     </window>
522 
523     <window name="filter">
524-        <area>0,42,1280,515</area>
525+        <area>0,42,1280,555</area>
526         <imagetype name="fade">
527             <filename>popups/fade_background.png</filename>
528         </imagetype>
529@@ -120,116 +120,126 @@
530 
531         <!-- Labels -->
532 
533+        <textarea name="fullsearch_text">
534+            <area>269,235,180,30</area>
535+            <value>Fulltext search:</value>
536+           <font>basemedium</font>
537+        </textarea>
538+       
539+       <textedit name="fulltextsearch_input" from="baseshorttextedit">
540+         <position>450,225</position>
541+       </textedit>
542+
543         <textarea name="category_text">
544-            <area>269,228,220,30</area>
545+            <area>269,268,220,30</area>
546             <value>Category</value>
547             <align>hcenter</align>
548             <font>basemedium</font>
549         </textarea>
550 
551         <textarea name="genre_text" from="category_text">
552-            <position>269,296</position>
553+            <position>269,336</position>
554             <value>Genre</value>
555         </textarea>
556 
557         <textarea name="country_text" from="category_text">
558-            <position>269,364</position>
559+            <position>269,404</position>
560             <value>Country</value>
561         </textarea>
562 
563         <textarea name="cast_text" from="category_text">
564-            <position>269,432</position>
565+            <position>269,472</position>
566             <value>Actor/Actress</value>
567         </textarea>
568 
569         <textarea name="year_text" from="category_text">
570-            <position>526,228</position>
571+            <position>526,268</position>
572             <value>Year</value>
573         </textarea>
574 
575         <textarea name="runtime_text" from="category_text">
576-            <position>526,296</position>
577+            <position>526,336</position>
578             <value>Runtime</value>
579         </textarea>
580 
581         <textarea name="userrating_text" from="category_text">
582-            <position>526,364</position>
583+            <position>526,404</position>
584             <value>User Rating</value>
585         </textarea>
586 
587         <textarea name="browse_text" from="category_text">
588-            <position>526,432</position>
589+            <position>526,472</position>
590             <value>Browse</value>
591         </textarea>
592 
593         <textarea name="inetref_text" from="category_text">
594-            <position>784,228</position>
595+            <position>784,268</position>
596             <value>InetRef</value>
597         </textarea>
598 
599         <textarea name="coverfile_text" from="category_text">
600-            <position>784,296</position>
601+            <position>784,336</position>
602             <value>Cover File</value>
603         </textarea>
604 
605         <textarea name="orderby_text" from="category_text">
606-            <position>784,364</position>
607+            <position>784,404</position>
608             <value>Sort by</value>
609         </textarea>
610 
611         <!-- Widgets -->
612 
613         <buttonlist name="category_select" from="baseselector">
614-            <position>269,255</position>
615+            <position>269,295</position>
616         </buttonlist>
617 
618         <buttonlist name="genre_select" from="baseselector">
619-            <position>269,323</position>
620+            <position>269,363</position>
621         </buttonlist>
622 
623         <buttonlist name="country_select" from="baseselector">
624-            <position>269,391</position>
625+            <position>269,431</position>
626         </buttonlist>
627 
628         <buttonlist name="cast_select" from="baseselector">
629-            <position>269,459</position>
630+            <position>269,499</position>
631         </buttonlist>
632 
633         <buttonlist name="year_select" from="baseselector">
634-            <position>526,255</position>
635+            <position>526,295</position>
636         </buttonlist>
637 
638         <buttonlist name="runtime_select" from="baseselector">
639-            <position>526,323</position>
640+            <position>526,363</position>
641         </buttonlist>
642 
643         <buttonlist name="userrating_select" from="baseselector">
644-            <position>526,391</position>
645+            <position>526,431</position>
646         </buttonlist>
647 
648         <buttonlist name="browse_select" from="baseselector">
649-            <position>526,459</position>
650+            <position>526,499</position>
651         </buttonlist>
652 
653         <buttonlist name="inetref_select" from="baseselector">
654-            <position>784,255</position>
655+            <position>784,295</position>
656         </buttonlist>
657 
658         <buttonlist name="coverfile_select" from="baseselector">
659-            <position>784,323</position>
660+            <position>784,363</position>
661         </buttonlist>
662 
663         <buttonlist name="orderby_select" from="baseselector">
664-            <position>784,391</position>
665+            <position>784,431</position>
666         </buttonlist>
667 
668         <button name="done_button" from="basebutton">
669-            <position>693,515</position>
670+            <position>693,560</position>
671             <value>Done</value>
672         </button>
673 
674         <button name="save_button" from="basebutton">
675-            <position>363,515</position>
676+            <position>363,560</position>
677             <value>Make default</value>
678         </button>
679 
680diff --git a/mythtv/themes/Terra/video/filters_background.png b/mythtv/themes/Terra/video/filters_background.png
681index 5470bb3ceed1c1bc15a07465004a212e5be2eca3..162fc1a3e67d0581f45b336ae5902bf9e24d5ed0 100644
682GIT binary patch
683literal 6911
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
784ZYwqFmq5P+rcA#29V5h83<{x*x^4|?f1^NI0
785
786literal 7443
787zcmcgx2~^W(wvS^AE)}%;L<&M31K5rPW#2;DYSGA6ixm+B7Xq>)K>{QJEu+{9qCs|(
788zjAfHiLAF3-69H)m5G6ub0%1wO2qBO_VnUYp;k<X+u`^nG<~<Ia9CGgees}rZ-@V`c
789z|L~3bfeq_ESqFhYHXsk~{}uvS4TC`bw0eyO_+~<KND4kaK!1fivIhL%)&yJu|F4ZY
790z=#2&+_A7s@<^u?az?Zr)UmuI{j0}vyoQg(4Fc=IhI3g5%=2R3478xCsKj-)f1fqW(
791zx&O-}akm5`!B<c+JZD@;buk_3>zi5ZI%pwD-A%u--E3if!3Q72D!#f5-MFR&3XOFA
792z6l&YKaif+kbZq~iF@^i3^$v<Zw54rbqVAft-fOgu-uv13-~b^US>SEyV%FE!SK~E;
793z6-^vnI@$;CW7fV@J$xBI_D%bJ=JYM>-G?)Y@+8%?W%%&a;YLNL3mTbdNi!kfA_;T{
794z`X%UHWIw@Cet9NpHbV?GRA=C3f0!f}n#cyylLLD-=W|Hh$s|HLJianrjdYT<EqHv3
795zpy8Z_((>8e<t8#iq>5hRBpYODhjw%q{FP2GZ&*BoOf;sE-Fk)6lHM5!Qy}RT#4;_3
796zt@iE^$lp?}lUqJbZi&@s{nFZoRmJ=-e-{xQnaJ}bD`pdzme@bv$0K%{*qy9v0Hz}H
797zxYGn2E+NFYstTP;B)XIjV-d?AKp@v{P{OO4nh1SMnfLDBFAPr+R);T_kH!f`{8j8A
798zr{;L+-yP^XHM{n;@_1f;c}P(-flSKFqfup7b4et;p~r_1i0xWnLsr(-%7)6Dh04zE
799zc3!iDpR^d7R43+H)1rcc4UPN^w!zGrMZE_y6wW0~*+ua*Z2I{u`-~HKe5`O_bhPvF
800zL}pmnz56h;a;1{IJeVXFny<_Lk{}?aYii}-U!N{lLDf~P{D-few+At2mO7SqLm(H<
801zl!p)R9&O0uWfrj;s0xOYQaee2*8Q3uNJwL^&5@>N!^cIUznI}Y2x==he0i~GJ)@Wz
802zFI+1H;q%G&(fvq6DE@2}1mf|ddr5|0GdWRx5<MDeY8JRKRnwsCuSpW+CN0dUooES!
803zOk#Sz-4_k)&98kaf~w0|`SLNQ2VDB}thev6u8Fkv-KL|R5{cxZ);16qr@UesJC~V@
804zz*y^;oj54mu>+0fCuBv8oJ~^yh4X4KY5A_2k1(OuRNV`-l#8CmQIqJ+1N;~#;Gt%E
805zb=bW~ZjF~eL)0r;jthZ69-Vte36C%}o$l|A9>vd$II16`?UEK0O*157bI$$y-BTVo
806z;d+Gl1V_m>#80Mka280Lg5{xVYA6@gj7X|?_e<mzA+ovUBm_ow5q-R@32o)C>}2g<
807z4}nCb3j~4&`BEgW50SWZF(}|f-F!^3+%rhs>!EtZaS=W5iMFPdrfPg=zdW*RG`Kc9
808z+dsZEpPOA=9B2@?^dM3(ZX<dU8X0J-?<C3i6F^pp-ukPuWV0kIy%{}hQ-831F1h)-
809ziwAMp0-^fBP!>m^BVk6l9_AUuO*zU56sC=529@=ogUkf=;=4lM?(X)Y1;@<*AIFAA
810zhk8OeI6SAE=wwCqD<>Pu$J23tE;t+iIZXyF$yl`bF&iG+%8PXOU<4+F1TxlvBV`i3
811z$h7hKRgeoAr)B-oWesQ)W73TokT{2fA@JiKPRkcv7^p2U9klQco#gq%eg&TxsH`p7
812zeG^vD$08a45_7Dq9gV|sJf8#xdXxm`&2=QrrXaGoUpbFQ!wRS{CEH3T$;*UBcJJ-#
813zxiwnV0$etpSPg*)=~1?9>FoW8l6-z?t|K_gEWolidT#-<eTv|Udj6U8S{+o@l9=@Q
814z$lPcs%nY{snsRK#)HA{7f;kp-fr0MR3YmpRkYz28-D95pjDNb3ZG&vi;HD&uD9w@@
815z0={yBK<2kyZao!YIx-}VD`zoEnHE8eF0xYw*VTEa85&uPo>swX&l4IRaL&>tl30!8
816zmL2+lb)yIXSab1VwO^9rB@?pLDM}a0Qf^KpVjptL;`mU0Og*;TmeN?Gb~^*8*`U3@
817zzn|0*t5>L-R^}SC#k3@P`bY)V_yvYg7%XuevKa!&PHjJljr57hJ6u;?V4T~z>sVl{
818zlMrP&6pba(M^A(5vbA?}zHOfQ>}UF%+b-ZdQ0#gz<M5rux#O|ZwQSO4CFZDV#}Ip<
819z>*dSi);88v@PVF_*c{4vv<n21lT(bWWg=@?F3lYJZ0TTEPY<_Ak7X!791x_!OMb}W
820zUU`g)k2kt%6OlKs4T12gb+s-J4h{9lk4J|F+qp5hT?*eGqC>vB^q_lhh{SvD+@0}C
821zDm63Is|<xk3%>(Icp-0y(%swb<K0wqORUo~-KAh37RWEQI;L!e-Mt%1jpZG`+$wnx
822z3w+W4Y5YO=Qt0|YHoNQ6)#-HkVg**evyK5Q2Ppfl8dU1uC~z*T%$NLPZz|lE66>xF
823zKyfWSGqZ2^Xq{b!G9B()W)J@ed{@-2XH!*CvG)c(-O4vB(lq}HaG+x#ZRYCcLE*7h
824z6k*>1pl{sApY!w3%b^=WOxSp3Q_~HBpry`Q69U;%Q(2k7UDo%hyXQW(f}jHF{`9)A
825zdme!VEs*MJjpS1l%C*>t<$=ejJyCgpm2PcG-bph4voCP@00rMBRCjy~3m+~%KeH8N
826zY46a^Cd}kO<QHoJy4K_+--E8miT(-*;u}&F@V#?0Xz*XeKL)(L%VQ;rytO)@899yv
827z5Zp9*Eo^T$M*JLz8n<70<1s62an+hP#oy5VsLisQwEl{~<zFj*L;CHO{7zvOve#Aq
828zDeyC+)b3>3wsZgN=A8geM#t~e^p60%kMP<M5M-l25M-oQObM8rE+F?#{1W<KPBt#3
829z&P=YJ=B)oE+%{QJ!M=xeArSYQQ&%>hbleGZ>lJ*`u);b&4GRqTswYSF4&cWC+PIDt
830z<6!9MsQC<}_CYZ+K{+}=IluAD`fSgVp#S+cH#axN{(!@G0b$sDxD}SWIR+S0VDrP5
831zS1T^LlrTZxqn--~5ZrZVSP&2~_ktr$KaZPc%c}S>AJwn)vh#C_LCei?3`BnvKepa3
832zX`F3q15meRFWdrNQFZT$Q^8c1BKKA<rW1fx-=xvcCY#)JGw`d;!`i%WAv$J$KeO5V
833z)&Wa^^0ow}A1P5H+AkcjC0#Y+lp|p$nsQV}5H?%4YNJ2|9*yVc5@|eob}!#Rz)Kfm
834zY{x4nXQ{F-QeJo3B|UGS6Ns)8Anj+K&zwikJ*JumeY-uR4oZ7|1mS@|+v(})d3*bH
835zgZie_QnazPK;h1pF?oQ7rk?W$Z`tERPK&)I=ojOap$Q50OeT{WwSc<}Do-={BaP(h
836z*73vJL5`xD0gDZTUod>Ry{ztpU)$|F*UyhN?-M}z9;c;1>*l~pi!e}BT3@^c{eC8>
837z^5=j$^f8)^w4zPFB=|M@ew?#Qxo6YwRx3DWv%(KCkK#X@w4_7@4_nXB>61hHppuUy
838zCD=EXmhK#xjyvE>z|CLME@qy)Z4T=H8W;&olUtsVgRLYhY2nAX5&=La?;ta{FIvAo
839zwNmhD_%>drj~Bc5V?bY}-D%x1SmjQRaNu!KuyaO?#y+pDtHBe0AD$^;3Jhe49kvs_
840z`m#(w7#A{H^xv@doy>BQ@V+F(qOFR21;V}OGw1g&tCa%Uv)7HOe-{2LM*F3#eh2-%
841zm#{rD4`~Rx&!g7Yv}0UsH@4@;-^sJ@b<n>Q&bd__tW}x!{^!j=?VkP{j(=-wSg~Ty
842z-tJYbcXyG0Y4E>mId2m_Pq55zS_8(&06?|8D{s~dGSpyR7XG$=_BQ3eX?|}AKjK>c
843z(FkkSdl~^?6u#My{t<)!vW)*(fqfT7b8@CybUv<6dH)Rmfdmnu-G$nq@N9GQR`>rV
844z&LNUpUl{+fg8aRc2Q4^n>eIXLO36Qs4Ce{@FD{z_R?9fu_Lh<6jjaA!#b#!q-P45s
845zEByTWB;Nlb`9jL;p6}|))DQdg>$h}@-#f9r#l2sRcdqV$7Oma|x!;y33mN^u=Q{ul
846z*WZBRa|7G7cRFA^buoKWefobE!z{fHXN}?E;1q$aHAwuHz8FG8IRXsfM!poA+Fm|%
847zBm$$K4~F(1!Gb_Htkxs84jSHb!j?>xQ5V8i<{DIdu-$rAq-&UZ>U9dzg4>LADXkx+
848zwEko62^esfG$xuM#RERUgiC)}?_F0p|LOqX`kT+~Qtbq8=)W20(y!2;cZKyn{QJs?
849z6RH`Sx^FKS(((d-@>r>(QP&>O!T-}O=a*y~1NNu<0gM3lA8UL);kUjy;TtWxqc*+s
850zhOlA+Xag!Q#OS{NKlpZmJ23Y8l0EWr3Jz?JAj=^K274P=2}EcsWkk=8c&!CwVQfLb
851z+KRC{h-Qh#!lAlaDammE7fT80_zU0(Wocvh-fa;k$f0VYepDN;yX7R7p#z4`yeYWa
852z5s>x1rDad7!EpHX8L!BQDfhZ+2f6_f>OW-W3pPP~D)Wr}k(GUyy#=Cnx}xQzLw>%G
853z9w$-UnIO4LCxNTCtaqy4c_>z>uS8EXt}R_ynaz36`JQ}_C8=XmMMc(KuLxh4-tJw#
854zm!+oCHWw3`&M>80E`Lc%JAr$7TCQw#08^~(l^~~AU8D|hp&gQkjN&Fc!M>u`SQk2Y
855zsFLU~9_`>~PnL6o)O%<;UMw$3*n{DjDF;8C>KhX9F{<H2U0foks;=MWD3j8P8?S9r
856z9GzqTghB@mcJ4YoXJ-^9eHcLY@$sQ0qEGaY5c%t~VX0DZt$=hKZ{{%2X0wPjm6eq@
857zBb(3hmTH^u=N$@|Z4|;i;ch)@=<}ixYJ@1FPSHWx?pGfldWy3Fp(ZlyP+*?5eK75h
858zb87U%Fedf%LcM+bX*w!tcJqxw^0OD6E6X<&yx{tv!-S~RBQbU-t;FkSR%J~MHE43g
859z&xRw$8`5%R7H1N{g5%LSaCs4*FqA!AZMIlb7XxRN!J5QHW~!ENo#B<4haa#HRo*&W
860z7dEZ3gJHraGok*+j^U(p^~Xl7t>BqL)r%DIb~7h(1V%_STgiYx(Jq#~(8gH?8E!PK
861z&C&t;Qu|kmay83LD@73Fe5x{w8%Stp>%o?L&e2wOxTgr@AvSy9*s%uDqhxA~>{}<f
862z(y$w>3O)pGUT309#JAHMa&!=i$4w<EMl`uRWNV}!U9ChU%@?u!@D9iXUAHIxhbpgg
863zot+C{db&iXSZtyT!BU!Drl9*P>JfdG-Q{5C_q2-~|Ef>{Hn<Jdx6;zm!onj^dj_y(
864zD>#k|ws(^&6N`)GcKAS;GEsPYCNeyHs<XyM{A5PhB&YhnQV6v)lB;ynDC~ox`%thx
865z?m&(X#D|&E#%_=ITDplD2r))=6s&8DsLUYr+-#Ah8(7C(I8Z}rB3!zJ5%>FeH7~u^
866z6BZFc>^@tKvZMJRn@HSrLPH+6vu84&8rg>O_@pL$*xF58uI4k;i;JSpZZc<RGz{h!
867zXFSrQ+6UHHkY(?O=Xcs<mrajg%9>R!WSK(8#-?`4BIJ5ns`JrNq$rkfSC?oWi#?r)
868z<*cETHf0A`z9bZiwN(q8S8Z%|sXu?|p`on>#wlp3M;8xDz#s&F#?%G`^~sccUfQ%+
869z!&&ZD&vX2@f20v){!p>tOqkInZk41#Ij*9qo-=omlp)H9g(iv<g(MUQ+an()smu};
870zqIBHsvXg~{gEG5*#IL7|NG~0v#?)&g(l-FO+JX9#KMBe5iU`Ext!lH5Mk=Nv6}4u#
871zC8__&A@lrams+gN^RB1`V8hmscevV@e)hB~kT9++Fr~G&7SUe7vKpaPNxX7(TZf;b
872zOj{w4RiP2j_?DiYN`6<@E%$PkOD)r-cG!){pH*yvxL>wbjcD3l90H5~m94)<vLGz1
873z3<b^xFC;qaZAN88j;fQDv|QVS!|&PV8uWZ~xO2g0>vf3+lA#`vfc-;OTB<Quh;1*|
874zyzCM^eY1i{Bp!;Ev>L{%S`F3D5K9^2AP@DJLc!OW?z#1Fz%~iM)xEH$CarJAODD2H
875zDOqagC?~u)$|)Adm;U1B19#_^%FJhfT^>0bj}D4=kUG<w&_1znOJ4$ZqKN!#BLhdc
876ziX<ULv$L~{Xoe$pVPE)gk9LZnloDP-h#4ZT4kuW<X&^1a2m(u8>)^|}@TPikioyPj
877zR_y{!!R_tLBqM{^VXN*_>g?&;hUy)W>L}@+3d5%r;i~KYWD~`Q_TQ5k9ivZLRrl?+
878z)K!b~oFho_=v_zLvT&h({@ixalr~;F1+UOf$S{AhU4L#$`}|CbTCU&1m>!R4gtNEn
879zOVXzsITr$F9YQ;#+ndBQg>D&z%whri`0?%RW5+&$^5=Hfmz>;Su`a8IP4%GH>$Z0e
880z>z;sz?I`$LJmV}<Ya@(CipzC3&*u6%uR`0=JRQhnmuTaHN4cG63#aDlk6inn*Yl_E
881zwx>uF^i2^KCi$G;)MWBb611Lq$R2|yrH%?CgJRA<=mXga1<LzUjmJ4`nLJQyqbbcP
882zd*3Ld$B2Nr8=UiuxZB3!^E*BcnrJ7?V-&0)F1Lqx>Zkgo(&el1dq&s5b8#Hwj!*`Y
883zCw<A4892&t+J+-ap%8;TwX<NCw|iw>)$V{8*<?QQsQJ45`>78n-~~o@V^`>cOrh(5
884zFmMapQ}@G8e(Gsd#I)GcA)OJh1y<kc?C}$LWAg%vkRnA7J+84x$c4+nBAm7{LpnxF
885z+%RXr9@vnbnL5Gi@9F4E{T?)lkyBdROldm-z!=ndB6tHc;`#HOznr=mhSA<}ZjWC%
886zZD9xjY_%;Vacvyf<IA?*erjnXrW$qqS+IZoLgkIacV-it93Go@t%k)b_N42>YSm-J
887zXW1j@;aC&yVr<sj2}7Y@wn>Um=Rh|@-}RbJxN9D{#e_AdSUNS=b#CxP?3utgmZ%A4
888zztGgmlW5GPK4K&6N-`QV&VL-~dSQ~*9Bz_t<NF91qi)87134Ym@eOym@Yp)`=+j1)
889zILu&v6DV)eTyr1oOh@O)ldZ7j2zDBHM>MwI?jBYfY=!`5rM9XyGgmFH`lR3{xYa-)
890O$gkb^mwk2e`~L<f3D@8N
891