Mercurial > prosody-modules
annotate mod_group_bookmarks/mod_group_bookmarks.lua @ 1819:1b08597b5e6f
mod_storage_xmlarchive: Add support for purging (used when deleting users)
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 02 Sep 2015 16:43:34 +0200 |
parents | 7dbde05b48a9 |
children | 6824a1f3d8c0 |
rev | line source |
---|---|
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 -- Prosody IM |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
679
diff
changeset
|
4 -- |
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 -- This project is MIT/X11 licensed. Please see the |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 -- COPYING file in the source package for more information. |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 -- |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 local st = require "util.stanza" |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 local datamanager = require "util.datamanager" |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 local jid, datamanager = require "util.jid", require "util.datamanager"; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 local jid_bare, jid_prep, jid_split = jid.bare, jid.prep, jid.split; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 local module_host = module:get_host(); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 local rooms; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 local members; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 local bookmarks_file; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 module:add_feature("jabber:iq:private"); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 function inject_bookmarks(username, host, data) |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 local jid = username.."@"..host; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 data:reset(); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 if members[jid] then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 for _, room in ipairs(members[jid]) do |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 data:tag("conference", { |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 name = room; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 jid = room; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 autojoin = "1"; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 }); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 local nick = rooms[room][jid]; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 if nick then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 data:tag("nick"):text(nick):up(); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 data:up(); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 return data; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 module:hook("iq/self/jabber:iq:private:query", function(event) |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 local origin, stanza = event.origin, event.stanza; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 local type = stanza.attr.type; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 local query = stanza.tags[1]; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 if #query.tags == 1 then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 local tag = query.tags[1]; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 local key = tag.name..":"..tag.attr.xmlns; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 local data, err = datamanager.load(origin.username, origin.host, "private"); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 if err then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 origin.send(st.error_reply(stanza, "wait", "internal-server-error")); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 return true; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 if stanza.attr.type == "get" then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 local data = data and data[key]; |
290
ee416b285802
mod_group_bookmarks: Always ensure bookmarks are injected, even if the user has no bookmarks already stored
Matthew Wild <mwild1@gmail.com>
parents:
289
diff
changeset
|
59 if (not data) and key == "storage:storage:bookmarks" then |
ee416b285802
mod_group_bookmarks: Always ensure bookmarks are injected, even if the user has no bookmarks already stored
Matthew Wild <mwild1@gmail.com>
parents:
289
diff
changeset
|
60 data = st.stanza("storage", { xmlns = "storage:bookmarks" }); |
ee416b285802
mod_group_bookmarks: Always ensure bookmarks are injected, even if the user has no bookmarks already stored
Matthew Wild <mwild1@gmail.com>
parents:
289
diff
changeset
|
61 end |
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 if data then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 data = st.deserialize(data); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 if key == "storage:storage:bookmarks" then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 data = inject_bookmarks(origin.username, origin.host, data); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 origin.send(st.reply(stanza):tag("query", {xmlns = "jabber:iq:private"}) |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 :add_child(data)); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 else |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 origin.send(st.reply(stanza):add_child(stanza.tags[1])); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 return true; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 end, 1); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 function module.load() |
679
dcddd9195098
mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents:
290
diff
changeset
|
78 bookmarks_file = module:get_option_string("group_bookmarks_file"); |
dcddd9195098
mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents:
290
diff
changeset
|
79 |
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 rooms = { default = {} }; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 members = { }; |
679
dcddd9195098
mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents:
290
diff
changeset
|
82 |
dcddd9195098
mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents:
290
diff
changeset
|
83 if not bookmarks_file then |
dcddd9195098
mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents:
290
diff
changeset
|
84 module:log("error", "Please specify group_bookmarks_file in your configuration"); |
dcddd9195098
mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents:
290
diff
changeset
|
85 return; |
dcddd9195098
mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents:
290
diff
changeset
|
86 end |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
679
diff
changeset
|
87 |
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 local curr_room; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 for line in io.lines(bookmarks_file) do |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 if line:match("^%s*%[.-%]%s*$") then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 curr_room = line:match("^%s*%[(.-)%]%s*$"); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 if curr_room:match("^%+") then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 curr_room = curr_room:gsub("^%+", ""); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 if not members[false] then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 members[false] = {}; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 members[false][#members[false]+1] = curr_room; -- Is a public group |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 module:log("debug", "New group: %s", tostring(curr_room)); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 rooms[curr_room] = rooms[curr_room] or {}; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 elseif curr_room then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 -- Add JID |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 local entryjid, name = line:match("([^=]*)=?(.*)"); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 module:log("debug", "entryjid = '%s', name = '%s'", entryjid, name); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 local jid; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 jid = jid_prep(entryjid:match("%S+")); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 if jid then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 module:log("debug", "New member of %s: %s", tostring(curr_room), tostring(jid)); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 rooms[curr_room][jid] = name or false; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 members[jid] = members[jid] or {}; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 members[jid][#members[jid]+1] = curr_room; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 module:log("info", "Group bookmarks loaded successfully"); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 |