Mercurial > libervia-desktop-kivy
annotate cagou/core/common_widgets.py @ 354:aa860c10acfc
chat: new chat selector:
Using the new ScreenManager feature, a widget to select a chat to display is shown when a
user opens the chat (except if an entity jid is specified, in which case it opens directly
the Chat widget), or when user presses ESC.
When on ChatSelector, pressing ESC brings to the root widget (i.e. default widget).
The ChatSelect is a first draft, it is planned to show opened chats, rooms, and a way to
create new chats.
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 17 Jan 2020 18:44:35 +0100 |
parents | 51520ce98154 |
children | 3002704318e3 |
rev | line source |
---|---|
237
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/env python2 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 # Cagou: desktop/mobile frontend for Salut à Toi XMPP client |
282 | 5 # Copyright (C) 2016-2019 Jérôme Poisson (goffi@goffi.org) |
237
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 # (at your option) any later version. |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 # GNU Affero General Public License for more details. |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 """common advanced widgets, which can be reused everywhere.""" |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 from sat.core.i18n import _ |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
23 from kivy.uix.label import Label |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 from kivy.uix.boxlayout import BoxLayout |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 from cagou.core.menu import TouchMenuItemBehaviour |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from kivy import properties |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 from kivy.metrics import dp |
324
4374cb741eb5
core (common widgets): added a DelayedBoxLayout class:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
28 from kivy.clock import Clock |
237
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 from cagou import G |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 from sat.core import log as logging |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 log = logging.getLogger(__name__) |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 |
324
4374cb741eb5
core (common widgets): added a DelayedBoxLayout class:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
35 class DelayedBoxLayout(BoxLayout): |
4374cb741eb5
core (common widgets): added a DelayedBoxLayout class:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
36 """A BoxLayout with delayed layout, to avoid slowing down during resize""" |
4374cb741eb5
core (common widgets): added a DelayedBoxLayout class:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
37 # XXX: thanks to Alexander Taylor for his blog post at |
4374cb741eb5
core (common widgets): added a DelayedBoxLayout class:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
38 # https://blog.kivy.org/2019/07/a-delayed-resize-layout-in-kivy/ |
4374cb741eb5
core (common widgets): added a DelayedBoxLayout class:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
39 |
4374cb741eb5
core (common widgets): added a DelayedBoxLayout class:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
40 do_layout_event = properties.ObjectProperty(None, allownone=True) |
4374cb741eb5
core (common widgets): added a DelayedBoxLayout class:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
41 layout_delay_s = properties.NumericProperty(0.2) |
329
51520ce98154
common_widgets (DelayedBoxLayout), chat: don't delay layout on new message:
Goffi <goffi@goffi.org>
parents:
324
diff
changeset
|
42 #: set this to X to force next X layouts to be done without delay |
51520ce98154
common_widgets (DelayedBoxLayout), chat: don't delay layout on new message:
Goffi <goffi@goffi.org>
parents:
324
diff
changeset
|
43 dont_delay_next_layouts = properties.NumericProperty(0) |
324
4374cb741eb5
core (common widgets): added a DelayedBoxLayout class:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
44 |
4374cb741eb5
core (common widgets): added a DelayedBoxLayout class:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
45 def do_layout(self, *args, **kwargs): |
4374cb741eb5
core (common widgets): added a DelayedBoxLayout class:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
46 if self.do_layout_event is not None: |
4374cb741eb5
core (common widgets): added a DelayedBoxLayout class:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
47 self.do_layout_event.cancel() |
329
51520ce98154
common_widgets (DelayedBoxLayout), chat: don't delay layout on new message:
Goffi <goffi@goffi.org>
parents:
324
diff
changeset
|
48 if self.dont_delay_next_layouts>0: |
51520ce98154
common_widgets (DelayedBoxLayout), chat: don't delay layout on new message:
Goffi <goffi@goffi.org>
parents:
324
diff
changeset
|
49 self.dont_delay_next_layouts-=1 |
51520ce98154
common_widgets (DelayedBoxLayout), chat: don't delay layout on new message:
Goffi <goffi@goffi.org>
parents:
324
diff
changeset
|
50 super().do_layout() |
51520ce98154
common_widgets (DelayedBoxLayout), chat: don't delay layout on new message:
Goffi <goffi@goffi.org>
parents:
324
diff
changeset
|
51 else: |
51520ce98154
common_widgets (DelayedBoxLayout), chat: don't delay layout on new message:
Goffi <goffi@goffi.org>
parents:
324
diff
changeset
|
52 real_do_layout = super().do_layout |
51520ce98154
common_widgets (DelayedBoxLayout), chat: don't delay layout on new message:
Goffi <goffi@goffi.org>
parents:
324
diff
changeset
|
53 self.do_layout_event = Clock.schedule_once( |
51520ce98154
common_widgets (DelayedBoxLayout), chat: don't delay layout on new message:
Goffi <goffi@goffi.org>
parents:
324
diff
changeset
|
54 lambda dt: real_do_layout(*args, **kwargs), |
51520ce98154
common_widgets (DelayedBoxLayout), chat: don't delay layout on new message:
Goffi <goffi@goffi.org>
parents:
324
diff
changeset
|
55 self.layout_delay_s) |
324
4374cb741eb5
core (common widgets): added a DelayedBoxLayout class:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
56 |
4374cb741eb5
core (common widgets): added a DelayedBoxLayout class:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
57 |
237
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 class Identities(object): |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
60 def __init__(self, entity_ids): |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
61 identities = {} |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 for cat, type_, name in entity_ids: |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 identities.setdefault(cat, {}).setdefault(type_, []).append(name) |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 client = identities.get('client', {}) |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 if 'pc' in client: |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 self.type = 'desktop' |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 elif 'phone' in client: |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 self.type = 'phone' |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 elif 'web' in client: |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 self.type = 'web' |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 elif 'console' in client: |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 self.type = 'console' |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 else: |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 self.type = 'desktop' |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
76 self.identities = identities |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
77 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
78 @property |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
79 def name(self): |
312 | 80 return list(self.identities.values())[0].values()[0][0] |
237
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
83 class ItemWidget(TouchMenuItemBehaviour, BoxLayout): |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 name = properties.StringProperty() |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
85 base_width = properties.NumericProperty(dp(100)) |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
86 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
87 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 class DeviceWidget(ItemWidget): |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 def __init__(self, main_wid, entity_jid, identities, **kw): |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
91 self.entity_jid = entity_jid |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
92 self.identities = identities |
312 | 93 own_jid = next(iter(G.host.profiles.values())).whoami |
237
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 self.own_device = entity_jid.bare == own_jid |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 if self.own_device: |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 name = self.identities.name |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 elif self.entity_jid.node: |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 name = self.entity_jid.node |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
99 elif self.entity_jid == own_jid.domain: |
312 | 100 name = _("your server") |
237
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
101 else: |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 name = entity_jid |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
103 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
104 super(DeviceWidget, self).__init__(name=name, main_wid=main_wid, **kw) |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
105 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
106 @property |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
107 def profile(self): |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 return self.main_wid.profile |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
109 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
110 def getSymbol(self): |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
111 if self.identities.type == 'desktop': |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
112 return 'desktop' |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 elif self.identities.type == 'phone': |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
114 return 'mobile' |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
115 elif self.identities.type == 'web': |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
116 return 'globe' |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
117 elif self.identities.type == 'console': |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
118 return 'terminal' |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
119 else: |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 return 'desktop' |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
122 def do_item_action(self, touch): |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
123 pass |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
124 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
125 |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
126 class CategorySeparator(Label): |
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 pass |