1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
Ë
 
çúh„–ãó–—ddlZddlZddlmZmZmZmZddlmZm    Z    ddl
m Z ddl m Z ddlmZdd    lmZmZmZdd
lmZdd lmZdd lmZdd lmZddlmZddlmZddl m!Z!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0d Z1d!Z2d"Z3d#Z4d$Z5d%Z6d&Z7d'Z8d(Z9d)Z:d*Z;d+Z<d,Z=d-Z>d.Z?d/Z@d0ZAd1ZBd2ZCd3ZDd4ZEd5ZFd6ZGd7ZHd8ZId9ZJGd:„d;«ZKGd<„d=eK«ZLy)>éN)ÚDictÚListÚOptionalÚUnion)Ú NEVER_DECODEÚPipeline)Údeprecated_functioné)Úget_protocol_versioné)Ú    to_string)ÚAggregateRequestÚAggregateResultÚCursor)ÚDocument)ÚField)ÚIndexDefinition)ÚProfileInformation)ÚQuery)ÚResult)ÚSuggestionParserÚNUMERICz    FT.CREATEzFT.ALTERz    FT.SEARCHzFT.ADDz
FT.ADDHASHz FT.DROPINDEXz
FT.EXPLAINz FT.EXPLAINCLIzFT.DELz FT.AGGREGATEú
FT.PROFILEz    FT.CURSORz FT.SPELLCHECKz
FT.DICTADDz
FT.DICTDELz FT.DICTDUMPzFT.MGETz    FT.CONFIGz
FT.TAGVALSz FT.ALIASADDzFT.ALIASUPDATEz FT.ALIASDELzFT.INFOz    FT.SUGADDz    FT.SUGDELz    FT.SUGLENz    FT.SUGGETz FT.SYNUPDATEz
FT.SYNDUMPÚ    NOOFFSETSÚNOFIELDSÚNOHLÚNOFREQSÚ MAXTEXTFIELDSÚ    TEMPORARYÚ    STOPWORDSÚSKIPINITIALSCANÚ
WITHSCORESÚFUZZYÚ WITHPAYLOADScóŠ—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z    d„Z
d    „Z d\d
„Z                                     d]d e ed ededee edeedededefd„Zd eee effd„Zd^defd„Z                                d_d„Z    d`d„Zedd¬«                            dadededed eed!ed"ed#eed$ed e efd%„«Zedd¬«dbd&„«Zedd'¬«dcd(„«Zd)„Zedd'¬«d*„«Zd+„Z d,ee!eeee"ee#fffd-„Z$d,ee!eeee"ee#fffd.„Z%    ddd/eee&fd,ee!eeee"ee#ffd ffd0„Z'    ddd/eee&fd,ee!eeee"ee#fffd1„Z(d/eee&ffd2„Z)    ddd/ee*e+fd,ee!eeee"ee#fffd3„Z,d4e d/ee*e+fd5efd6„Z-        ded/ee&e*fd7ed,ee!eeee"ee#fffd8„Z.dfd9„Z/d:ed;e efd<„Z0d:ed;e efd=„Z1d:efd>„Z2ed?d@¬«dAedBedCefdD„«Z3ed?dE¬«dAedCefdF„«Z4dGefdH„Z5dIefdJ„Z6dIefdK„Z7dIefdL„Z8dM„Z9dNedCe"fdO„Z:dNedPedCe"fdQ„Z;                dgdNedRedSedTe"dUedVedCe e<fdW„Z=d^dXedYed;e efdZ„Z>d[„Z?y )hÚSearchCommandszSearch commands.c ó€—t|j«dvr|dk(r t|«S|S|j||fi|¤ŽS)N©Ú3ér)r ÚclientrÚ_RESP2_MODULE_CALLBACKS)ÚselfÚcmdÚresÚkwargss    õqH:\项目\archive\测试组\脚本\Change_password\venv_build\Lib\site-packages\redis/commands/search/commands.pyÚ_parse_resultszSearchCommands._parse_resultsCsH€Ü  § ¡ Ó ,°Ñ 8Ø.1°\Ò.AÔ% cÓ*Ð JÀsÐ Jà44×/Ñ/°Ñ4°SÑC¸FÑCÐ Cóc óL—tt|«}tt||««S©N)Úmapr ÚdictÚzip)r-r/r0Úits    r1Ú _parse_infozSearchCommands._parse_infoIs€Ü ”˜CÓ  ˆÜ”C˜˜B“KӠРr3c     ó”—t||dj |d|dj|dj|dj¬«S)NÚqueryÚduration)r=Ú has_payloadÚ with_scoresÚfield_encodings)rÚ _no_contentÚ_with_payloadsÚ _with_scoresÚ_return_fields_decode_as©r-r/r0s   r1Ú _parse_searchzSearchCommands._parse_searchMsQ€ÜØ Øw‘×+Ñ+Ð +ؘJÑ'ؘw™×6Ñ6ؘw™×4Ñ4Ø" 7™O×DÑDô 
ð    
r3c ó4—|j||d|d«S)Nr<Ú
has_cursor)Ú_get_aggregate_resultrEs   r1Ú_parse_aggregatezSearchCommands._parse_aggregateWs €Ø×)Ñ)¨#¨v°g©ÀÀ|Ñ@TÓUÐUr3c óø—|d}t|t«r!|j|d||j«}n5t    |d|j
|d|j |j¬«}|t|d«fS)Nr<rr=)r=r>r?r )    Ú
isinstancerrIÚ_cursorrrArBrCr)r-r/r0r<Úresults     r1Ú_parse_profilezSearchCommands._parse_profileZs€€Øw‘ˆÜ eÔ-Ô .Ø×/Ñ/°°A±¸¸u¿}¹}ÓM‰F䨐A‘Ø×%Ñ%Ð%Ø 
Ñ+Ø!×0Ñ0Ø!×.Ñ.ô ˆFðÔ)¨#¨a©&Ó1Ð1Ð1r3c óܗi}|dk(r|S|D]X}t|t«r|dk(rŒt|«dk7rŒ(|dsŒ.|ddsŒ7|dDcgc] }|d|ddœ‘Œc}||d<ŒZ|Scc}w)Nrr*r
r )ÚscoreÚ
suggestion)rLÚintÚlen)r-r/r0Ú correctionsÚ _correctionÚ_items      r1Ú_parse_spellcheckz SearchCommands._parse_spellcheckis¡€Øˆ Ø !Š8ØÐ àò    ˆKܘ+¤sÔ+° ¸qÒ0@Øä;Ó 1Ò$ØØ˜q’>ØØ˜q‘> !Ò$Øð$JUÐUVÉö+Ø@E˜% ™(°%¸±(Ó;ò+ˆK˜  A™Ò 'ð5    ð<Ðùò    +sÁ
A)c óB—|r|Dcic] }|d|d“Œ c}SiScc}w)Nrr ©)r-r/r0Úkvss    r1Ú_parse_config_getz SearchCommands._parse_config_getŽs)€Ù25¨#Ö. 3A‘˜˜A™‘Ò.Ð=¸2Ð=ùÒ.s‡c óh—tdt|«d«Dcic]}||||dz“Œc}Scc}w)Nrr
r )ÚrangerT)r-r/r0Úis    r1Ú_parse_syndumpzSearchCommands._parse_syndump‘s4€Ü,1°!´S¸³X¸qÓ,AÖB qA‘˜˜A ™E™
Ñ"ÒBÐBùÒBs™/có(—|j||¬«S)zT
        Create a new batch indexer from the client with a given chunk size
        )Ú
chunk_size)Ú BatchIndexer)r-rbs  r1Ú batch_indexerzSearchCommands.batch_indexer”s€ð× Ñ  °*РÓ=Ð=r3NÚfieldsÚno_term_offsetsÚno_field_flagsÚ    stopwordsÚ
definitionÚ no_highlightÚno_term_frequenciesÚskip_initial_scanc ó6—t|jg} || |jz } |r| jt«|6t |t «r&| jt«| j|«|r| jt«|r| jt«|r| jt«|    r| jt«|
r| jt«|Kt |tttf«r0| t t#|«gz } t#|«dkDr| t|«z } | jd«    | tt%j&d„|D«Ž«z } |j,| ŽS#t($r| |j+«z } YŒ-wxYw)a«
        Creates the search index. The index must not already exist.
 
        For more information, see https://redis.io/commands/ft.create/
 
        Args:
            fields: A list of Field objects.
            no_term_offsets: If `true`, term offsets will not be saved in the index.
            no_field_flags: If true, field flags that allow searching in specific fields
                            will not be saved.
            stopwords: If provided, the index will be created with this custom stopword
                       list. The list can be empty.
            definition: If provided, the index will be created with this custom index
                        definition.
            max_text_fields: If true, indexes will be encoded as if there were more than
                             32 text fields, allowing for additional fields beyond 32.
            temporary: Creates a lightweight temporary index which will expire after the
                       specified period of inactivity. The internal idle timer is reset
                       whenever the index is searched or added to.
            no_highlight: If true, disables highlighting support. Also implied by
                          `no_term_offsets`.
            no_term_frequencies: If true, term frequencies will not be saved in the
                                 index.
            skip_initial_scan: If true, the initial scan and indexing will be skipped.
 
        rÚSCHEMAc3ó<K—|]}|j«–—Œy­wr5©Ú
redis_args©Ú.0Úfs  r1ú    <genexpr>z.SearchCommands.create_index.<locals>.<genexpr>Úóèø€Ò*J¸a¨1¯<©<¯>Ñ*Jùó‚)Ú
CREATE_CMDÚ
index_nameÚargsÚappendrrLrSrrrrrr!ÚlistÚtupleÚsetr rTÚ    itertoolsÚchainÚ    TypeErrorrqÚexecute_command) r-rerfrgrhriÚmax_text_fieldsÚ    temporaryrjrkrlrzs             r1Ú create_indexzSearchCommands.create_indexšsS€ôN˜DŸO™OÐ,ˆØ Ð !Ø J—O‘OÑ #ˆDÙ Ø K‰Kœ Ô &Ø Ð  ¤Z°    ¼3Ô%?Ø K‰Kœ    Ô "Ø K‰K˜    Ô "Ù Ø K‰Kœ    Ô "Ù Ø K‰KœÔ Ù Ø K‰KœÔ !Ù Ø K‰KœÔ  Ù Ø K‰KœÔ (Ø Ð  ¤Z°    ¼DÄ%ÌÐ;MÔ%NØ ”Y¤ I£Ð/Ñ /ˆDܐ9‹~ Ò!Øœ˜Y›Ñ'à  ‰ HÔð    (Ø ”DœŸ™Ñ*JÀ6Ô*JÐKÓLÑ LˆDð$ˆt×#Ñ# TÐ*Ð*øôò    (Ø F×%Ñ%Ó'Ñ 'ŠDð    (úsÅ%E9Å9FÆFcóؗt|jddg}    |ttjd„|D«Ž«z }|j|ŽS#t
$r||j «z }YŒ-wxYw)a
        Alter the existing search index by adding new fields. The index
        must already exist.
 
        ### Parameters:
 
        - **fields**: a list of Field objects to add for the index
 
        For more information see `FT.ALTER <https://redis.io/commands/ft.alter>`_.
        rnÚADDc3ó<K—|]}|j«–—Œy­wr5rprrs  r1ruz2SearchCommands.alter_schema_add.<locals>.<genexpr>îrvrw)Ú    ALTER_CMDryr|rr€rrqr‚)r-rerzs   r1Úalter_schema_addzSearchCommands.alter_schema_addàsr€ô˜4Ÿ?™?¨H°eÐ<ˆð    (Ø ”DœŸ™Ñ*JÀ6Ô*JÐKÓLÑ LˆDð$ˆt×#Ñ# TÐ*Ð*øôò    (Ø F×%Ñ%Ó'Ñ 'ŠDð    (ús–%A
Á
A)Á(A)Údelete_documentscóš—t|jg}t|t«r|durdnd}|r|j    |«|j
|ŽS)ai
        Drop the index if it exists.
        Replaced `drop_index` in RediSearch 2.0.
        Default behavior was changed to not delete the indexed documents.
 
        ### Parameters:
 
        - **delete_documents**: If `True`, all documents will be deleted.
 
        For more information see `FT.DROPINDEX <https://redis.io/commands/ft.dropindex>`_.
        TÚDDÚ)Ú DROPINDEX_CMDryrLÚboolr{r‚)r-r‹rzÚ
delete_strs    r1Ú    dropindexzSearchCommands.dropindexôsX€ô˜tŸ™Ð/ˆôÐ*¬DÔ1Ð6FÈ$Ñ6Nñ àð    ñ Ø K‰K˜
Ô #à#ˆt×#Ñ# TÐ*Ð*r3c
 óâ—|s|    rd}t|j||g} |r| jd«|"| jd«| j|«|r7| jd«|r| jd«|    r| jd«|r| d|gz } | jd«| tt    j
|
j «Ž«z } ||j| ŽS|j| ŽS)    zS
        Internal add_document used for both batch and single doc indexing
        TÚNOSAVEÚPAYLOADÚREPLACEÚPARTIALÚNOCREATEÚLANGUAGEÚFIELDS)ÚADD_CMDryr{r|rr€Úitemsr‚) r-Údoc_idÚconnÚnosaverQÚpayloadÚreplaceÚpartialÚlanguageÚ    no_creatererzs             r1Ú _add_documentzSearchCommands._add_document sâ€ñ" ‘i؈G䘟™¨&°%Ð8ˆÙ Ø K‰K˜Ô !Ø Ð Ø K‰K˜    Ô "Ø K‰K˜Ô  Ù Ø K‰K˜    Ô "ÙØ— ‘ ˜IÔ&ÙØ— ‘ ˜JÔ'Ù Ø Z Ð*Ñ *ˆDØ  ‰ HÔØ ””Y—_‘_ f§l¡l£nÐ5Ó6Ñ6ˆà Ð Ø'4×'Ñ'¨Ð.Ð .à#ˆt×#Ñ# TÐ*Ð*r3có¢—t|j||g}|r|jd«|r|d|gz }||j|ŽS|j|ŽS)zX
        Internal add_document_hash used for both batch and single doc indexing
        r–r™)Ú ADDHASH_CMDryr{r‚)r-rržrQr£r¡rzs       r1Ú_add_document_hashz!SearchCommands._add_document_hash7sc€ô˜TŸ_™_¨f°eÐ<ˆá Ø K‰K˜    Ô "á Ø Z Ð*Ñ *ˆDà Ð Ø'4×'Ñ'¨Ð.Ð .à#ˆt×#Ñ# TÐ*Ð*r3z2.0.0z2deprecated since redisearch 2.0, call hset instead©ÚversionÚreasonrrŸrQr r¡r¢r£r¤c     ó:—|j|fd|||||||dœ|    ¤ŽS)aš
        Add a single document to the index.
 
        Args:
 
            doc_id: the id of the saved document.
            nosave: if set to true, we just index the document, and don't
                      save a copy of it. This means that searches will just
                      return ids.
            score: the document ranking, between 0.0 and 1.0
            payload: optional inner-index payload we can save for fast
                     access in scoring functions
            replace: if True, and the document already is in the index,
                     we perform an update and reindex the document
            partial: if True, the fields specified will be added to the
                       existing document.
                       This has the added benefit that any fields specified
                       with `no_index`
                       will not be reindexed again. Implies `replace`
            language: Specify the language used for document tokenization.
            no_create: if True, the document is only updated and reindexed
                         if it already exists.
                         If the document does not exist, an error will be
                         returned. Implies `replace`
            fields: kwargs dictionary of the document fields to be saved
                    and/or indexed.
                    NOTE: Geo points shoule be encoded as strings of "lon,lat"
        N)ržrŸrQr r¡r¢r£r¤)r¥)
r-rrŸrQr r¡r¢r£r¤res
          r1Ú add_documentzSearchCommands.add_documentKsD€ðV"ˆt×!Ñ!Ø ð 
àØØØØØØØñ 
ðñ 
ð     
r3có.—|j|d|||¬«S)aþ
        Add a hash document to the index.
 
        ### Parameters
 
        - **doc_id**: the document's id. This has to be an existing HASH key
                      in Redis that will hold the fields the index needs.
        - **score**:  the document ranking, between 0.0 and 1.0
        - **replace**: if True, and the document already is in the index, we
                      perform an update and reindex the document
        - **language**: Specify the language used for document tokenization.
        N)ržrQr£r¡)r¨)r-rrQr£r¡s     r1Úadd_document_hashz SearchCommands.add_document_hashƒs'€ð ×&Ñ&Ø ˜ U°XÀwð'ó
ð    
r3zdeprecated since redisearch 2.0cóŽ—t|j|g}|r|jd«||j|ŽS|j|ŽS)a
        Delete a document from index
        Returns 1 if the document was deleted, 0 if not
 
        ### Parameters
 
        - **delete_actual_document**: if set to True, RediSearch also delete
                                      the actual document if it is in the index
        r)ÚDEL_CMDryr{r‚)r-rržÚdelete_actual_documentrzs     r1Údelete_documentzSearchCommands.delete_document—sO€ô˜Ÿ™¨&Ð1ˆÙ !Ø K‰K˜Ô à Ð Ø'4×'Ñ'¨Ð.Ð .à#ˆt×#Ñ# TÐ*Ð*r3cóò—|jj|«}|j«Dcic]\}}t|«t|«“Œ}}}|}    |d=t dd|i|¤ŽScc}}w#t$rYŒwxYw)ú.
        Load a single document by id
        ÚidrZ©r+Úhgetallrœr ÚKeyErrorr©r-r¶reÚkÚvÚf2s      r1Ú load_documentzSearchCommands.load_document«s‚€ð—‘×$Ñ$ RÓ(ˆØ5;·\±\³^× D©T¨Q°Œi˜‹lœI a›LÑ(Ð DˆÑ D؈𠠠 Øt ôÑ(˜2Ð( Ñ(Ð(ùóEøô
ò    Ù ð    ús¯A$ÁA*Á*    A6Á5A6cóF—|jt|jg|¢­ŽS)z
        Returns the full contents of multiple documents.
 
        ### Parameters
 
        - **ids**: the ids of the saved documents.
 
        )r‚ÚMGET_CMDry)r-Úidss  r1ÚgetzSearchCommands.getºs"€ð$ˆt×#Ñ#¤H¨d¯o©oÐDÀÒDÐDr3cón—|jt|j«}|jt|«S)úÕ
        Get info an stats about the the current index, including the number of
        documents, memory consumption, etc
 
        For more information see `FT.INFO <https://redis.io/commands/ft.info>`_.
        ©r‚ÚINFO_CMDryr2©r-r/s  r1ÚinfozSearchCommands.infoÇs-€ð×"Ñ"¤8¨T¯_©_Ó=ˆØ×"Ñ"¤8¨SÓ1Ð1r3Ú query_paramscóþ—|€gSg}t|«dkDrh|jd«|jt|«dz«|j«D]'\}}|j|«|j|«Œ)|S)NrÚparamsr
)rTr{rœ)r-rÉrzÚkeyÚvalues     r1Úget_params_argszSearchCommands.get_params_argsÒs~€ð Р؈IØˆÜ ˆ|Ó ˜qÒ  Ø K‰K˜Ô !Ø K‰Kœ˜LÓ)¨AÑ-Ô .Ø*×0Ñ0Ó2ò #‘
UØ— ‘ ˜CÔ Ø— ‘ ˜EÕ"ð #ðˆ r3cóö—|jg}t|t«r t|«}t|t«st    dt |«›«‚||j «z }||j|«z }||fS)NzBad query type )ryrLÚstrrÚ
ValueErrorÚtypeÚget_argsrÎ)r-r<rÉrzs    r1Ú_mk_query_argszSearchCommands._mk_query_argsàss€ð—‘Рˆä eœSÔ !ä˜%“LˆEܘ%¤Ô'ܘ¬t°E«{¨mÐ<Ó=Ð =à —‘Ó Ñ ˆØ ×$Ñ$ \Ó2Ñ2ˆàUˆ{Ðr3r<cóT—|j||¬«\}}tj«}i}t|j«dvr    d|t
<|j tg|¢­i|¤Ž}t|t«r|S|jt||tj«|z
dz¬«S)á¦
        Search the index for a given query, and return a result of documents
 
        ### Parameters
 
        - **query**: the search query. Either a text for simple queries with
                     default parameters, or a Query object for complex queries.
                     See RediSearch's documentation on query format
 
        For more information see `FT.SEARCH <https://redis.io/commands/ft.search>`_.
        ©rÉr(Tç@@©r<r=© rÔÚtimeÚ    monotonicr r+rr‚Ú
SEARCH_CMDrLrr2©r-r<rÉrzÚstÚoptionsr/s       r1ÚsearchzSearchCommands.searchðs¦€ð ×)Ñ)¨%¸lÐ)ÓK‰ ˆˆeÜ ^‰^Ó ˆàˆÜ  § ¡ Ó ,°HÑ <Ø$(ˆG”LÑ !à"ˆd×"Ñ"¤:Ð@°Ò@¸Ñ@ˆä cœ8Ô $؈Jà×"Ñ"Ü ˜ 5´D·N±NÓ4DÀrÑ4IÈVÑ3Sð#ó
ð    
r3có\—|j||¬«\}}|jtg|¢­ŽS)zReturns the execution plan for a complex query.
 
        For more information see `FT.EXPLAIN <https://redis.io/commands/ft.explain>`_.
        r×)rÔr‚Ú EXPLAIN_CMD)r-r<rÉrzÚ
query_texts     r1ÚexplainzSearchCommands.explains6€ð ×.Ñ.¨uÀ<Ð.ÓPшˆjØ#ˆt×#Ñ#¤KÐ7°$Ò7Ð7r3có—td«‚)Nz#EXPLAINCLI will not be implemented.)ÚNotImplementedError)r-r<s  r1Ú explain_clizSearchCommands.explain_clis€Ü!Ð"GÓHÐHr3có’—t|t«r9t|j«}t|j
g|j «z}nCt|t«r'd}td|j
g|j «z}n td|«‚||j|«z }|j|Ž}|jt|||¬«S)á‰
        Issue an aggregation query.
 
        ### Parameters
 
        **query**: This can be either an `AggregateRequest`, or a `Cursor`
 
        An `AggregateResult` object is returned. You can access the rows from
        its `rows` property, which will always yield the rows of the result.
 
        For more information see `FT.AGGREGATE <https://redis.io/commands/ft.aggregate>`_.
        TÚREADú    Bad query©r<rH© rLrrrMÚ AGGREGATE_CMDryÚ
build_argsrÚ
CURSOR_CMDrÑrÎr‚r2©r-r<rÉrHr.Úraws      r1Ú    aggregatezSearchCommands.aggregates»€ô" eÔ-Ô .ܘeŸm™mÓ,ˆJÜ  $§/¡/Ð2°U×5EÑ5EÓ5GÑG‰CÜ ˜œvÔ &؈Jܘv t§¡Ð7¸%×:JÑ:JÓ:LÑL‰Cä˜[¨%Ó0Ð 0Ø ˆt×#Ñ# LÓ1Ñ1ˆà"ˆd×"Ñ" CÐ(ˆØ×"Ñ"Ü ˜3 e¸
ð#ó
ð    
r3rórHcóâ—|r1t|t«r |d|_|}nt|d«}|d}nd}t|t«r|jr |d}|dd}nd}|dd}t |||«S)Nr rr
)rLrÚcidrÚ _with_schemar)r-rór<rHÚcursorÚschemaÚrowss       r1rIz$SearchCommands._get_aggregate_result?s‚€ñ ܘ%¤Ô(Ø ™F”    Ø‘ä  A¡›Øa‘&‰CàˆFä eÔ-Ô .°5×3EÒ3Eؘ‘VˆFؐqr7‰DàˆFؐqr7ˆDä˜t V¨VÓ4Ð4r3Úlimitedcóú—tj«}t|jdg}|r|j    d«|j    d«t |t «rd|d<||j«z }nHt |t«r-d|d<||j«z }||j|«z }n td«‚|j|Ž}|jt||tj«|z
dz¬    «S)
a
        Performs a search or aggregate command and collects performance
        information.
 
        ### Parameters
 
        **query**: This can be either an `AggregateRequest` or `Query`.
        **limited**: If set to True, removes details of reader iterator.
        **query_params**: Define one or more value parameters.
        Each parameter has a name and a value.
 
        rŽÚLIMITEDÚQUERYÚ    AGGREGATEr
ÚSEARCHz5Must provide AggregateRequest object or Query object.rØrÙ)rÛrÜÚ PROFILE_CMDryr{rLrrðrrÓrÎrÑr‚r2)r-r<rûrÉrßr.r/s       r1ÚprofilezSearchCommands.profileUsë€ô$^‰^Ó ˆÜ˜DŸO™O¨RÐ0ˆÙ Ø J‰JyÔ !Ø 
‰
7Ôä eÔ-Ô .Ø ˆC‰FØ 5×#Ñ#Ó%Ñ %‰CÜ ˜œuÔ %؈C‰FØ 5—>‘>Ó#Ñ #ˆCØ 4×'Ñ'¨ Ó5Ñ 5‰CäÐTÓUÐ Uà"ˆd×"Ñ" CÐ(ˆà×"Ñ"Ü ˜ E´T·^±^Ó5EÈÑ5JÈfÑ4Tð#ó
ð    
r3cóô—t|j|g}|r|jd|g«|r|jdd|g«|r|jdd|g«|j|Ž}|j    t|«S)a´
        Issue a spellcheck query
 
        Args:
 
            query: search query.
            distance: the maximal Levenshtein distance for spelling
                       suggestions (default: 1, max: 4).
            include: specifies an inclusion custom dictionary.
            exclude: specifies an exclusion custom dictionary.
 
        For more information see `FT.SPELLCHECK <https://redis.io/commands/ft.spellcheck>`_.
        ÚDISTANCEÚTERMSÚINCLUDEÚEXCLUDE©ÚSPELLCHECK_CMDryÚextendr‚r2©r-r<ÚdistanceÚincludeÚexcluder.r/s       r1Ú
spellcheckzSearchCommands.spellcheck}sy€ô˜tŸ™°Ð6ˆÙ Ø J‰J˜
 HÐ-Ô .á Ø J‰J˜ ¨GÐ4Ô 5á Ø J‰J˜ ¨GÐ4Ô 5à"ˆd×"Ñ" CÐ(ˆà×"Ñ"¤>°3Ó7Ð7r3ÚnameÚtermscóR—t|g}|j|«|j|ŽS)zûAdds terms to a dictionary.
 
        ### Parameters
 
        - **name**: Dictionary name.
        - **terms**: List of items for adding to the dictionary.
 
        For more information see `FT.DICTADD <https://redis.io/commands/ft.dictadd>`_.
        )Ú DICT_ADD_CMDr
r‚©r-rrr.s    r1Údict_addzSearchCommands.dict_add™ó-€ô˜TÐ"ˆØ 
‰
5ÔØ#ˆt×#Ñ# SÐ)Ð)r3cóR—t|g}|j|«|j|ŽS)aDeletes terms from a dictionary.
 
        ### Parameters
 
        - **name**: Dictionary name.
        - **terms**: List of items for removing from the dictionary.
 
        For more information see `FT.DICTDEL <https://redis.io/commands/ft.dictdel>`_.
        )Ú DICT_DEL_CMDr
r‚rs    r1Údict_delzSearchCommands.dict_del§rr3có0—t|g}|j|ŽS)zÉDumps all terms in the given dictionary.
 
        ### Parameters
 
        - **name**: Dictionary name.
 
        For more information see `FT.DICTDUMP <https://redis.io/commands/ft.dictdump>`_.
        )Ú DICT_DUMP_CMDr‚)r-rr.s   r1Ú    dict_dumpzSearchCommands.dict_dumpµs!€ô˜dÐ#ˆØ#ˆt×#Ñ# SÐ)Ð)r3ú8.0.0úDdeprecated since Redis 8.0, call config_set from core module insteadÚoptionrÍÚreturncó>—td||g}|j|Ž}|dk(S)áSet runtime configuration option.
 
        ### Parameters
 
        - **option**: the name of the configuration option.
        - **value**: a value for the configuration option.
 
        For more information see `FT.CONFIG SET <https://redis.io/commands/ft.config-set>`_.
        ÚSETÚOK©Ú
CONFIG_CMDr‚©r-rrÍr.rós     r1Ú
config_setzSearchCommands.config_setÁs.€ô˜5 &¨%Ð0ˆØ"ˆd×"Ñ" CÐ(ˆØd‰{Ðr3úDdeprecated since Redis 8.0, call config_get from core module insteadcó^—td|g}|j|Ž}|jt|«S)úãGet runtime configuration option value.
 
        ### Parameters
 
        - **option**: the name of the configuration option.
 
        For more information see `FT.CONFIG GET <https://redis.io/commands/ft.config-get>`_.
        ÚGET©r&r‚r2©r-rr.r/s    r1Ú
config_getzSearchCommands.config_getÓs5€ô˜5 &Ð)ˆØ"ˆd×"Ñ" CÐ(ˆØ×"Ñ"¤:¨sÓ3Ð3r3ÚtagfieldcóD—|jt|j|«S)zÒ
        Return a list of all possible tag values
 
        ### Parameters
 
        - **tagfield**: Tag field name
 
        For more information see `FT.TAGVALS <https://redis.io/commands/ft.tagvals>`_.
        )r‚Ú TAGVALS_CMDry)r-r0s  r1ÚtagvalszSearchCommands.tagvalsäs€ð×#Ñ#¤K°·±À(ÓKÐKr3ÚaliascóD—|jt||j«S)zî
        Alias a search index - will fail if alias already exists
 
        ### Parameters
 
        - **alias**: Name of the alias to create
 
        For more information see `FT.ALIASADD <https://redis.io/commands/ft.aliasadd>`_.
        )r‚Ú ALIAS_ADD_CMDry©r-r4s  r1ÚaliasaddzSearchCommands.aliasaddñs€ð×#Ñ#¤M°5¸$¿/¹/ÓJÐJr3cóD—|jt||j«S)zø
        Updates an alias - will fail if alias does not already exist
 
        ### Parameters
 
        - **alias**: Name of the alias to create
 
        For more information see `FT.ALIASUPDATE <https://redis.io/commands/ft.aliasupdate>`_.
        )r‚ÚALIAS_UPDATE_CMDryr7s  r1Ú aliasupdatezSearchCommands.aliasupdateþs€ð×#Ñ#Ô$4°e¸T¿_¹_ÓMÐMr3có.—|jt|«S)zØ
        Removes an alias to a search index
 
        ### Parameters
 
        - **alias**: Name of the alias to delete
 
        For more information see `FT.ALIASDEL <https://redis.io/commands/ft.aliasdel>`_.
        )r‚Ú ALIAS_DEL_CMDr7s  r1ÚaliasdelzSearchCommands.aliasdel s€ð×#Ñ#¤M°5Ó9Ð9r3cóh—|jd¬«}|D]‰}t||j|jg}|j    d«r|j d«|j r,|j d«|j |j «|j|ŽŒ‹|j«dS)aJ
        Add suggestion terms to the AutoCompleter engine. Each suggestion has
        a score and string.
        If kwargs["increment"] is true and the terms are already in the
        server's dictionary, we increment their scores.
 
        For more information see `FT.SUGADD <https://redis.io/commands/ft.sugadd/>`_.
        F©Ú transactionÚ    incrementÚINCRr•éÿÿÿÿ©    ÚpipelineÚSUGADD_COMMANDÚstringrQrÂr{r r‚Úexecute©r-rÌÚ suggestionsr0ÚpipeÚsugrzs       r1ÚsugaddzSearchCommands.sugadds—€ð}‰}¨ˆ}Ó/ˆØò    (ˆCÜ" C¨¯©°S·Y±YÐ?ˆD؏z‰z˜+Ô&Ø— ‘ ˜FÔ#؏{Š{Ø— ‘ ˜IÔ&Ø— ‘ ˜CŸK™KÔ(à  ˆD×  Ñ   $Ò 'ð    (ð|‰|‹~˜bÑ!Ð!r3rÌcó.—|jt|«S)z 
        Return the number of entries in the AutoCompleter index.
 
        For more information see `FT.SUGLEN <https://redis.io/commands/ft.suglen>`_.
        )r‚ÚSUGLEN_COMMAND)r-rÌs  r1ÚsuglenzSearchCommands.suglen.s€ð ×#Ñ#¤N°CÓ8Ð8r3rHcó0—|jt||«S)zÙ
        Delete a string from the AutoCompleter index.
        Returns 1 if the string was found and deleted, 0 otherwise.
 
        For more information see `FT.SUGDEL <https://redis.io/commands/ft.sugdel>`_.
        )r‚ÚSUGDEL_COMMAND)r-rÌrHs   r1ÚsugdelzSearchCommands.sugdel6s€ð×#Ñ#¤N°C¸Ó@Ð@r3ÚprefixÚfuzzyÚnumr?Ú with_payloadscó—t||d|g}|r|jt«|r|jt«|r|jt«|j
|Ž}g}    |s|    St |||«}
|
D cgc]} | ‘Œc} Scc} w)át
        Get a list of suggestions from the AutoCompleter, for a given prefix.
 
        Parameters:
 
        prefix : str
            The prefix we are searching. **Must be valid ascii or utf-8**
        fuzzy : bool
            If set to true, the prefix search is done in fuzzy mode.
            **NOTE**: Running fuzzy searches on short (<3 letters) prefixes
            can be very
            slow, and even scan the entire index.
        with_scores : bool
            If set to true, we also return the (refactored) score of
            each suggestion.
            This is normally not needed, and is NOT the original score
            inserted into the index.
        with_payloads : bool
            Return suggestion payloads
        num : int
            The maximum number of results we return. Note that we might
            return less. The algorithm trims irrelevant suggestions.
 
        Returns:
 
        list:
             A list of Suggestion objects. If with_scores was False, the
             score of all suggestions is 1.
 
        For more information see `FT.SUGGET <https://redis.io/commands/ft.sugget>`_.
        ÚMAX©ÚSUGGET_COMMANDr{r#r"r$r‚r) r-rÌrUrVrWr?rXrzr/ÚresultsÚparserÚss             r1ÚsuggetzSearchCommands.sugget?sƒ€ôP  V¨U°CÐ8ˆÙ Ø K‰KœÔ Ù Ø K‰Kœ
Ô #Ù Ø K‰Kœ Ô %à"ˆd×"Ñ" DÐ)ˆØˆÙ؈Nä! +¨}¸cÓBˆØ!Ö"a’Ò"Ð"ùÒ"sÁ7    BÚgroupidÚ skipinitialcó—t|j|g}|r|jdg«|j|«|j|ŽS)að
        Updates a synonym group.
        The command is used to create or update a synonym group with
        additional terms.
        Only documents which were indexed after the update will be affected.
 
        Parameters:
 
        groupid :
            Synonym group id.
        skipinitial : bool
            If set to true, we do not scan and index.
        terms :
            The terms.
 
        For more information see `FT.SYNUPDATE <https://redis.io/commands/ft.synupdate>`_.
        r!)Ú SYNUPDATE_CMDryr
r‚)r-rbrcrr.s     r1Ú    synupdatezSearchCommands.synupdatewsF€ô$˜dŸo™o¨wÐ7ˆÙ Ø J‰JÐ)Ð*Ô +Ø 
‰
5ÔØ#ˆt×#Ñ# SÐ)Ð)r3cón—|jt|j«}|jt|«S)a
        Dumps the contents of a synonym group.
 
        The command is used to dump the synonyms data structure.
        Returns a list of synonym terms and their synonym group ids.
 
        For more information see `FT.SYNDUMP <https://redis.io/commands/ft.syndump>`_.
        )r‚Ú SYNDUMP_CMDryr2rÇs  r1ÚsyndumpzSearchCommands.syndumps-€ð×"Ñ"¤;°·±Ó@ˆØ×"Ñ"¤;°Ó4Ð4r3)éd)    FFNNFNFFF)F)NFçð?NFFNF)NrkNF)FrkNFFNF)rkNF)NFr5)FN©NNN©Fé
FF)@Ú__name__Ú
__module__Ú __qualname__Ú__doc__r2r:rFrJrOrXr\r`rdrrrrrÐrr…rrŠr’r¥r¨r    Úfloatr­r¯r³r¾rÂrÈrrSÚbytesrÎrÔrrárårèrrrôrIrrrrrr(r/r3r8r;r>rNrQrTrrarfrirZr3r1r&r&@s[„ÙòDò !ò
òVò 2ò#òJ>òCó>ð!&Ø$Ø)-Ø04ØØØ"Ø$)Ø"'ñD+àU‘ ðD+ððD+ðð    D+ð
˜D ™IÑ&ð D+ð ˜_Ñ-ð D+ððD+ð"ðD+ð óD+ðL+ u¨U°D¸±KÐ-?Ñ'@ó+ñ(+¨$ó+ð8ØØØØØØØó(+ðVDIó+ñ(ØРTôð ØØ"&ØØØ"&Øñ3
àð3
ðð3
ðð    3
ð
˜$‘ð 3
ð ð 3
ðð3
ð˜3‘-ð3
ðð3
ðs‘)ò3
óð3
ñjØРTôò
óð
ñ" Ð1RÔSò+óTð+ò& )ñ Ð1RÔSñ
EóTð
Eò    2ð Ø$ T¨#¨u°S¸#¸uÀeÐ5KÑ/LÐ*LÑ%MÑNó ðØ#+¨D°°e¸CÀÀeÈUÐ<RÑ6SÐ1SÑ,TÑ#Uóð&OSñ
àS˜%ZÑ ð
ð˜D  e¨C°°e¸UÐ,BÑ&CÐ!CÑDÀdÐJÑKó
ðFLPñ
8àS˜%ZÑ ð
8ð˜t C¨¨s°C¸ÀÐ/EÑ)FÐ$FÑGÑHó
8ðI  s¨E zÑ!2óIð LPñ
àÐ% vÐ-Ñ.ð
ð˜t C¨¨s°C¸ÀÐ/EÑ)FÐ$FÑGÑHó
ð@5Øð5Ø %Ð&6¸Ð&>Ñ ?ð5ØMQó5ð2ØKOñ    &
àUÐ,Ð,Ñ-ð&
ðð&
ð˜t C¨¨s°C¸ÀÐ/EÑ)FÐ$FÑGÑHó    &
óP8ð8 *˜Sð *¨$¨s©)ó *ð *˜Sð *¨$¨s©)ó *ð
*˜có
*ñØØUôð  ð ¨Sð °Tò ó    ð ñØØUôð 4 ð 4¨ò 4ó    ð 4ð L ó Lð K˜có Kð N ó Nð
:˜có
:ò"ð.9˜#ð9 #ó9ðA˜#ðA sðA¨sóAðØØ!Ø#ñ6#à ð6#ðð6#ðð    6#ð
ð 6#ð ð 6#ðð6#ð
ÐÑ    ó6#ñp* ð*°4ð*ÈÈcÉó*ó0
5r3r&có*—eZdZd„Z    ddeeefdeeeeee    e
e fffd„Z     ddee efdeeeeee    e
e fffd„Zdd„Zedd    ¬
«d ed ed efd„«Zedd¬
«d ed efd„«Zd„Zd„Z                ddededede    deded eefd„Zy)ÚAsyncSearchCommandscƒóŠK—|jt|j«ƒd{–—†}|jt|«S7Œ­w)rÄNrÅrÇs  r1rÈzAsyncSearchCommands.infos:èø€ð×(Ñ(¬°4·?±?ÓC×CˆØ×"Ñ"¤8¨SÓ1Ð1ðDús‚$A¦A§ANr<rÉcƒópK—|j||¬«\}}tj«}i}t|j«dvr    d|t
<|j tg|¢­i|¤Žƒd{–—†}t|t«r|S|jt||tj«|z
dz¬«S7ŒG­w)rÖr×r(TNrØrÙrÚrÞs       r1rázAsyncSearchCommands.search¨s³èø€ð ×)Ñ)¨%¸lÐ)ÓK‰ ˆˆeÜ ^‰^Ó ˆàˆÜ  § ¡ Ó ,°HÑ <Ø$(ˆG”LÑ !à(D×(Ñ(¬ÐF°dÒF¸gÑF×Fˆä cœ8Ô $؈Jà×"Ñ"Ü ˜ 5´D·N±NÓ4DÀrÑ4IÈVÑ3Sð#ó
ð    
ð Gús‚A*B6Á,B4Á-AB6cƒó®K—t|t«r9t|j«}t|j
g|j «z}nCt|t«r'd}td|j
g|j «z}n td|«‚||j|«z }|j|Žƒd{–—†}|jt|||¬«S7Œ­w)rêTrërìNrírîròs      r1rôzAsyncSearchCommands.aggregateÈsÇèø€ô" eÔ-Ô .ܘeŸm™mÓ,ˆJÜ  $§/¡/Ð2°U×5EÑ5EÓ5GÑG‰CÜ ˜œvÔ &؈Jܘv t§¡Ð7¸%×:JÑ:JÓ:LÑL‰Cä˜[¨%Ó0Ð 0Ø ˆt×#Ñ# LÓ1Ñ1ˆà(D×(Ñ(¨#Ð.×.ˆØ×"Ñ"Ü ˜3 e¸
ð#ó
ð    
ð/ús‚B3CÂ5CÂ6CcƒóK—t|j|g}|r|jd|g«|r|jdd|g«|r|jdd|g«|j|Žƒd{–—†}|j    t|«S7Œ­w)a¾
        Issue a spellcheck query
 
        ### Parameters
 
        **query**: search query.
        **distance***: the maximal Levenshtein distance for spelling
                       suggestions (default: 1, max: 4).
        **include**: specifies an inclusion custom dictionary.
        **exclude**: specifies an exclusion custom dictionary.
 
        For more information see `FT.SPELLCHECK <https://redis.io/commands/ft.spellcheck>`_.
        rrrrNrr s       r1rzAsyncSearchCommands.spellcheckès…èø€ô˜tŸ™°Ð6ˆÙ Ø J‰J˜
 HÐ-Ô .á Ø J‰J˜ ¨GÐ4Ô 5á Ø J‰J˜ ¨GÐ4Ô 5à(D×(Ñ(¨#Ð.×.ˆà×"Ñ"¤>°3Ó7Ð7ð/ús‚A'BÁ)BÁ*Brrr©rrÍr cƒóZK—td||g}|j|Žƒd{–—†}|dk(S7Œ    ­w)r"r#Nr$r%r's     r1r(zAsyncSearchCommands.config_sets:èø€ô˜5 &¨%Ð0ˆØ(D×(Ñ(¨#Ð.×.ˆØd‰{Ðð/ús ‚+Ÿ) 
+r)cƒó~K—td|g}i}|j|Žƒd{–—†}|jt|«S7Œ­w)r+r,Nr-r.s    r1r/zAsyncSearchCommands.config_getsFèø€ô˜5 &Ð)ˆØˆØ(D×(Ñ(¨#Ð.×.ˆØ×"Ñ"¤:¨sÓ3Ð3ð/ús ‚= ;¡=cƒóK—|jj|«ƒd{–—†}|j«Dcic]\}}t|«t|«“Œ}}}|}    |d=t dd|i|¤ŽS7ŒLcc}}w#t$rYŒ wxYw­w)rµNr¶rZr·rºs      r1r¾z!AsyncSearchCommands.load_document(sŠèø€ð—{‘{×*Ñ*¨2Ó.×.ˆØ5;·\±\³^× D©T¨Q°Œi˜‹lœI a›LÑ(Ð DˆÑ D؈𠠠 Øt ôÑ(˜2Ð( Ñ(Ð(ð/úÛ Døô
ò    Ù ð    üsD‚B¡A.¢B¹A0ÁBÁA6Á!BÁ0BÁ6    BÁ?BÂBÂBcó„K—|jd¬«}|D]‰}t||j|jg}|j    d«r|j d«|j r,|j d«|j |j «|j|ŽŒ‹|j«ƒd{–—†dS7Œ­w)aI
        Add suggestion terms to the AutoCompleter engine. Each suggestion has
        a score and string.
        If kwargs["increment"] is true and the terms are already in the
        server's dictionary, we increment their scores.
 
        For more information see `FT.SUGADD <https://redis.io/commands/ft.sugadd>`_.
        Fr@rBrCr•NrDrErJs       r1rNzAsyncSearchCommands.sugadd7s¡èø€ð}‰}¨ˆ}Ó/ˆØò    (ˆCÜ" C¨¯©°S·Y±YÐ?ˆD؏z‰z˜+Ô&Ø— ‘ ˜FÔ#؏{Š{Ø— ‘ ˜IÔ&Ø— ‘ ˜CŸK™KÔ(à  ˆD×  Ñ   $Ò 'ð    (ð—l‘l“n×$ bÑ)Ð)Ð$ús‚B4CÂ6B>Â7CrÌrUrVrWr?rXcƒó,K—t||d|g}|r|jt«|r|jt«|r|jt«|j
|Žƒd{–—†}g}    |s|    St |||«}
|
D cgc]} | ‘Œc} S7Œ'cc} w­w)rZr[Nr\) r-rÌrUrVrWr?rXrzÚretr^r_r`s             r1razAsyncSearchCommands.suggetNs‘èø€ôP  V¨U°CÐ8ˆÙ Ø K‰KœÔ Ù Ø K‰Kœ
Ô #Ù Ø K‰Kœ Ô %à(D×(Ñ(¨$Ð/×/ˆØˆÙ؈Nä! +¨}¸cÓBˆØ!Ö"a’Ò"Ð"ð 0úò #ùs$‚A#BÁ%B Á&B    BÂ
BÂBr5rlrm)rorprqrÈrrÐrrrrSrsrtrárrrôrr    rr(r/r¾rNrrrarZr3r1rvrvœs_„ò    2ðLPñ
àS˜%ZÑ ð
ð˜t C¨¨s°C¸ÀÐ/EÑ)FÐ$FÑGÑHó
ðFLPñ
à_ fÐ,Ñ-ð
ð˜t C¨¨s°C¸ÀÐ/EÑ)FÐ$FÑGÑHó
ó@8ñ8ØØUôð  sð °3ð ¸4ò ó    ð ñØØUôð 4 sð 4¨sò 4ó    ð 4ò )ò*ð6ØØ!Ø#ñ6#à ð6#ðð6#ðð    6#ð
ð 6#ð ð 6#ðð6#ð
ÐÑ    ô6#r3rv)MrrÛÚtypingrrrrÚ redis.clientrrÚ redis.utilsr    Úhelpersr Ú_utilr Ú aggregationrrrÚdocumentrÚfieldrÚindex_definitionrÚprofile_informationrr<rrNrrRrrrxr‰rÝr›r§rrãÚEXPLAINCLI_CMDr±rïrrñr    rrrrÀr&r2r6r:r=rÆrGrSrPr]rerhrrrrrrr r!r"r#r$r&rvrZr3r1ú<module>rŒs!ðÛÛ ß.Ó.ç/Ý+å*ÝßBÑBÝÝÝ-Ý3ÝÝÝ(à
€à €
Ø €    Ø €
Ø
€Ø€ Ø€ Ø€ Ø €Ø
€Ø€ Ø€ Ø €
Ø €Ø€ Ø€ Ø€ Ø €Ø €
Ø€ Ø€ Ø#ÐØ€ Ø €Ø€Ø€Ø€Ø€Ø€ Ø€ à €    Ø €Ø €Ø
€Ø€ Ø €    Ø €    Ø#€Ø €
؀؀ ÷Y 5ñY 5ôxh#˜.õh#r3