matrix-react-sdk
Version:
SDK for matrix.org using React
651 lines (545 loc) • 84.2 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.SpaceHierarchy = exports.useSpaceSummary = exports.HierarchyLevel = exports.showRoom = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _react = _interopRequireWildcard(require("react"));
var _event = require("matrix-js-sdk/src/@types/event");
var _classnames = _interopRequireDefault(require("classnames"));
var _lodash = require("lodash");
var _MatrixClientPeg = require("../../MatrixClientPeg");
var _dispatcher = _interopRequireDefault(require("../../dispatcher/dispatcher"));
var _languageHandler = require("../../languageHandler");
var _AccessibleButton = _interopRequireDefault(require("../views/elements/AccessibleButton"));
var _BaseDialog = _interopRequireDefault(require("../views/dialogs/BaseDialog"));
var _Spinner = _interopRequireDefault(require("../views/elements/Spinner"));
var _SearchBox = _interopRequireDefault(require("./SearchBox"));
var _RoomAvatar = _interopRequireDefault(require("../views/avatars/RoomAvatar"));
var _RoomName = _interopRequireDefault(require("../views/elements/RoomName"));
var _useAsyncMemo = require("../../hooks/useAsyncMemo");
var _maps = require("../../utils/maps");
var _StyledCheckbox = _interopRequireDefault(require("../views/elements/StyledCheckbox"));
var _AutoHideScrollbar = _interopRequireDefault(require("./AutoHideScrollbar"));
var _BaseAvatar = _interopRequireDefault(require("../views/avatars/BaseAvatar"));
var _Media = require("../../customisations/Media");
var _InfoTooltip = _interopRequireDefault(require("../views/elements/InfoTooltip"));
var _TextWithTooltip = _interopRequireDefault(require("../views/elements/TextWithTooltip"));
var _useStateToggle = require("../../hooks/useStateToggle");
var _SpaceStore = require("../../stores/SpaceStore");
var _AccessibleTooltipButton = _interopRequireDefault(require("../views/elements/AccessibleTooltipButton"));
var _HtmlUtils = require("../../HtmlUtils");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
const Tile
/*: React.FC<ITileProps>*/
= ({
room,
suggested,
selected,
hasPermissions,
onToggleClick,
onViewRoomClick,
numChildRooms,
children
}) => {
const name = room.name || room.canonical_alias || room.aliases?.[0] || (room.room_type === _event.RoomType.Space ? (0, _languageHandler._t)("Unnamed Space") : (0, _languageHandler._t)("Unnamed Room"));
const [showChildren, toggleShowChildren] = (0, _useStateToggle.useStateToggle)(true);
const cli = _MatrixClientPeg.MatrixClientPeg.get();
const cliRoom = cli.getRoom(room.room_id);
const myMembership = cliRoom?.getMyMembership();
const onPreviewClick = (ev
/*: ButtonEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
onViewRoomClick(false);
};
const onJoinClick = (ev
/*: ButtonEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
onViewRoomClick(true);
};
let button;
if (myMembership === "join") {
button = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: onPreviewClick,
kind: "primary_outline"
}, (0, _languageHandler._t)("View"));
} else if (onJoinClick) {
button = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: onJoinClick,
kind: "primary"
}, (0, _languageHandler._t)("Join"));
}
let checkbox;
if (onToggleClick) {
if (hasPermissions) {
checkbox = /*#__PURE__*/_react.default.createElement(_StyledCheckbox.default, {
checked: !!selected,
onChange: onToggleClick
});
} else {
checkbox = /*#__PURE__*/_react.default.createElement(_TextWithTooltip.default, {
tooltip: (0, _languageHandler._t)("You don't have permission"),
onClick: ev => {
ev.stopPropagation();
}
}, /*#__PURE__*/_react.default.createElement(_StyledCheckbox.default, {
disabled: true
}));
}
}
let url
/*: string*/
;
if (room.avatar_url) {
url = (0, _Media.mediaFromMxc)(room.avatar_url).getSquareThumbnailHttp(20);
}
let description = (0, _languageHandler._t)("%(count)s members", {
count: room.num_joined_members
});
if (numChildRooms) {
description += " · " + (0, _languageHandler._t)("%(count)s rooms", {
count: numChildRooms
});
}
if (room.topic) {
description += " · " + room.topic;
}
let suggestedSection;
if (suggested) {
suggestedSection = /*#__PURE__*/_react.default.createElement(_InfoTooltip.default, {
tooltip: (0, _languageHandler._t)("This room is suggested as a good one to join")
}, (0, _languageHandler._t)("Suggested"));
}
const content = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_BaseAvatar.default, {
name: name,
idName: room.room_id,
url: url,
width: 20,
height: 20
}), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomDirectory_roomTile_name"
}, name, suggestedSection), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomDirectory_roomTile_info",
ref: e => e && (0, _HtmlUtils.linkifyElement)(e),
onClick: ev => {
// prevent clicks on links from bubbling up to the room tile
if (ev.target.tagName === "A") {
ev.stopPropagation();
}
}
}, description), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomDirectory_actions"
}, button, checkbox));
let childToggle;
let childSection;
if (children) {
// the chevron is purposefully a div rather than a button as it should be ignored for a11y
childToggle = /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)("mx_SpaceRoomDirectory_subspace_toggle", {
mx_SpaceRoomDirectory_subspace_toggle_shown: showChildren
}),
onClick: ev => {
ev.stopPropagation();
toggleShowChildren();
}
});
if (showChildren) {
childSection = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomDirectory_subspace_children"
}, children);
}
}
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: (0, _classnames.default)("mx_SpaceRoomDirectory_roomTile", {
mx_SpaceRoomDirectory_subspace: room.room_type === _event.RoomType.Space
}),
onClick: hasPermissions && onToggleClick ? onToggleClick : onPreviewClick
}, content, childToggle), childSection);
};
const showRoom = (room
/*: ISpaceSummaryRoom*/
, viaServers
/*: string[]*/
, autoJoin = false) => {
// Don't let the user view a room they won't be able to either peek or join:
// fail earlier so they don't have to click back to the directory.
if (_MatrixClientPeg.MatrixClientPeg.get().isGuest()) {
if (!room.world_readable && !room.guest_can_join) {
_dispatcher.default.dispatch({
action: "require_registration"
});
return;
}
}
const roomAlias = getDisplayAliasForRoom(room) || undefined;
_dispatcher.default.dispatch({
action: "view_room",
auto_join: autoJoin,
should_peek: true,
_type: "room_directory",
// instrumentation
room_alias: roomAlias,
room_id: room.room_id,
via_servers: viaServers,
oob_data: {
avatarUrl: room.avatar_url,
// XXX: This logic is duplicated from the JS SDK which would normally decide what the name is.
name: room.name || roomAlias || (0, _languageHandler._t)("Unnamed room")
}
});
};
exports.showRoom = showRoom;
const HierarchyLevel = ({
spaceId,
rooms,
relations,
parents,
selectedMap,
onViewRoomClick,
onToggleClick
}
/*: IHierarchyLevelProps*/
) => {
const cli = _MatrixClientPeg.MatrixClientPeg.get();
const space = cli.getRoom(spaceId);
const hasPermissions = space?.currentState.maySendStateEvent(_event.EventType.SpaceChild, cli.getUserId());
const children = Array.from(relations.get(spaceId)?.values() || []);
const sortedChildren = (0, _lodash.sortBy)(children, ev => {
// XXX: Space Summary API doesn't give the child origin_server_ts but once it does we should use it for sorting
return (0, _SpaceStore.getOrder)(ev.content.order, null, ev.state_key);
});
const [subspaces, childRooms] = sortedChildren.reduce((result, ev
/*: ISpaceSummaryEvent*/
) => {
const roomId = ev.state_key;
if (!rooms.has(roomId)) return result;
result[rooms.get(roomId).room_type === _event.RoomType.Space ? 0 : 1].push(roomId);
return result;
}, [[], []]) || [[], []];
const newParents = new Set(parents).add(spaceId);
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, childRooms.map(roomId => /*#__PURE__*/_react.default.createElement(Tile, {
key: roomId,
room: rooms.get(roomId),
suggested: relations.get(spaceId)?.get(roomId)?.content.suggested,
selected: selectedMap?.get(spaceId)?.has(roomId),
onViewRoomClick: autoJoin => {
onViewRoomClick(roomId, autoJoin);
},
hasPermissions: hasPermissions,
onToggleClick: onToggleClick ? () => onToggleClick(spaceId, roomId) : undefined
})), subspaces.filter(roomId => !newParents.has(roomId)).map(roomId => /*#__PURE__*/_react.default.createElement(Tile, {
key: roomId,
room: rooms.get(roomId),
numChildRooms: Array.from(relations.get(roomId)?.values() || []).filter(ev => rooms.get(ev.state_key)?.room_type !== _event.RoomType.Space).length,
suggested: relations.get(spaceId)?.get(roomId)?.content.suggested,
selected: selectedMap?.get(spaceId)?.has(roomId),
onViewRoomClick: autoJoin => {
onViewRoomClick(roomId, autoJoin);
},
hasPermissions: hasPermissions,
onToggleClick: onToggleClick ? () => onToggleClick(spaceId, roomId) : undefined
}, /*#__PURE__*/_react.default.createElement(HierarchyLevel, {
spaceId: roomId,
rooms: rooms,
relations: relations,
parents: newParents,
selectedMap: selectedMap,
onViewRoomClick: onViewRoomClick,
onToggleClick: onToggleClick
}))));
}; // mutate argument refreshToken to force a reload
exports.HierarchyLevel = HierarchyLevel;
const useSpaceSummary = (cli
/*: MatrixClient*/
, space
/*: Room*/
, refreshToken
/*: any*/
) =>
/*: [
null,
ISpaceSummaryRoom[],
Map<string, Map<string, ISpaceSummaryEvent>>?,
Map<string, Set<string>>?,
Map<string, Set<string>>?,
] | [Error]*/
{
// TODO pagination
return (0, _useAsyncMemo.useAsyncMemo)(async () => {
try {
const data = await cli.getSpaceSummary(space.roomId);
const parentChildRelations = new _maps.EnhancedMap();
const childParentRelations = new _maps.EnhancedMap();
const viaMap = new _maps.EnhancedMap();
data.events.map((ev
/*: ISpaceSummaryEvent*/
) => {
if (ev.type === _event.EventType.SpaceChild) {
parentChildRelations.getOrCreate(ev.room_id, new Map()).set(ev.state_key, ev);
childParentRelations.getOrCreate(ev.state_key, new Set()).add(ev.room_id);
}
if (Array.isArray(ev.content["via"])) {
const set = viaMap.getOrCreate(ev.state_key, new Set());
ev.content["via"].forEach(via => set.add(via));
}
});
return [null, data.rooms, parentChildRelations, viaMap, childParentRelations];
} catch (e) {
console.error(e); // TODO
return [e];
}
}, [space, refreshToken], [undefined]);
};
exports.useSpaceSummary = useSpaceSummary;
const SpaceHierarchy
/*: React.FC<IHierarchyProps>*/
= ({
space,
initialText = "",
showRoom,
refreshToken,
additionalButtons,
children
}) => {
const cli = _MatrixClientPeg.MatrixClientPeg.get();
const userId = cli.getUserId();
const [query, setQuery] = (0, _react.useState)(initialText);
const [selected, setSelected] = (0, _react.useState)(new Map()); // Map<parentId, Set<childId>>
const [summaryError, rooms, parentChildMap, viaMap, childParentMap] = useSpaceSummary(cli, space, refreshToken);
const roomsMap = (0, _react.useMemo)(() => {
if (!rooms) return null;
const lcQuery = query.toLowerCase().trim();
const roomsMap = new Map(rooms.map(r => [r.room_id, r]));
if (!lcQuery) return roomsMap;
const directMatches = rooms.filter(r => {
return r.name?.toLowerCase().includes(lcQuery) || r.topic?.toLowerCase().includes(lcQuery);
}); // Walk back up the tree to find all parents of the direct matches to show their place in the hierarchy
const visited = new Set();
const queue = [...directMatches.map(r => r.room_id)];
while (queue.length) {
const roomId = queue.pop();
visited.add(roomId);
childParentMap.get(roomId)?.forEach(parentId => {
if (!visited.has(parentId)) {
queue.push(parentId);
}
});
} // Remove any mappings for rooms which were not visited in the walk
Array.from(roomsMap.keys()).forEach(roomId => {
if (!visited.has(roomId)) {
roomsMap.delete(roomId);
}
});
return roomsMap;
}, [rooms, childParentMap, query]);
const [error, setError] = (0, _react.useState)("");
const [removing, setRemoving] = (0, _react.useState)(false);
const [saving, setSaving] = (0, _react.useState)(false);
if (summaryError) {
return /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Your server does not support showing space hierarchies."));
}
let content;
if (roomsMap) {
const numRooms = Array.from(roomsMap.values()).filter(r => r.room_type !== _event.RoomType.Space).length;
const numSpaces = roomsMap.size - numRooms - 1; // -1 at the end to exclude the space we are looking at
let countsStr;
if (numSpaces > 1) {
countsStr = (0, _languageHandler._t)("%(count)s rooms and %(numSpaces)s spaces", {
count: numRooms,
numSpaces
});
} else if (numSpaces > 0) {
countsStr = (0, _languageHandler._t)("%(count)s rooms and 1 space", {
count: numRooms,
numSpaces
});
} else {
countsStr = (0, _languageHandler._t)("%(count)s rooms", {
count: numRooms,
numSpaces
});
}
let manageButtons;
if (space.getMyMembership() === "join" && space.currentState.maySendStateEvent(_event.EventType.SpaceChild, userId)) {
const selectedRelations = Array.from(selected.keys()).flatMap(parentId => {
return [...selected.get(parentId).values()].map(childId => [parentId, childId]);
});
const selectionAllSuggested = selectedRelations.every(([parentId, childId]) => {
return parentChildMap.get(parentId)?.get(childId)?.content.suggested;
});
const disabled = !selectedRelations.length || removing || saving;
let Button
/*: React.ComponentType<React.ComponentProps<typeof AccessibleButton>>*/
= _AccessibleButton.default;
let props = {};
if (!selectedRelations.length) {
Button = _AccessibleTooltipButton.default;
props = {
tooltip: (0, _languageHandler._t)("Select a room below first"),
yOffset: -40
};
}
manageButtons = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(Button, (0, _extends2.default)({}, props, {
onClick: async () => {
setRemoving(true);
try {
for (const [parentId, childId] of selectedRelations) {
await cli.sendStateEvent(parentId, _event.EventType.SpaceChild, {}, childId);
parentChildMap.get(parentId).delete(childId);
if (parentChildMap.get(parentId).size > 0) {
parentChildMap.set(parentId, new Map(parentChildMap.get(parentId)));
} else {
parentChildMap.delete(parentId);
}
}
} catch (e) {
setError((0, _languageHandler._t)("Failed to remove some rooms. Try again later"));
}
setRemoving(false);
},
kind: "danger_outline",
disabled: disabled
}), removing ? (0, _languageHandler._t)("Removing...") : (0, _languageHandler._t)("Remove")), /*#__PURE__*/_react.default.createElement(Button, (0, _extends2.default)({}, props, {
onClick: async () => {
setSaving(true);
try {
for (const [parentId, childId] of selectedRelations) {
const suggested = !selectionAllSuggested;
const existingContent = parentChildMap.get(parentId)?.get(childId)?.content;
if (!existingContent || existingContent.suggested === suggested) continue;
const content = _objectSpread(_objectSpread({}, existingContent), {}, {
suggested: !selectionAllSuggested
});
await cli.sendStateEvent(parentId, _event.EventType.SpaceChild, content, childId);
parentChildMap.get(parentId).get(childId).content = content;
parentChildMap.set(parentId, new Map(parentChildMap.get(parentId)));
}
} catch (e) {
setError("Failed to update some suggestions. Try again later");
}
setSaving(false);
},
kind: "primary_outline",
disabled: disabled
}), saving ? (0, _languageHandler._t)("Saving...") : selectionAllSuggested ? (0, _languageHandler._t)("Mark as not suggested") : (0, _languageHandler._t)("Mark as suggested")));
}
let results;
if (roomsMap.size) {
const hasPermissions = space?.currentState.maySendStateEvent(_event.EventType.SpaceChild, cli.getUserId());
results = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(HierarchyLevel, {
spaceId: space.roomId,
rooms: roomsMap,
relations: parentChildMap,
parents: new Set(),
selectedMap: selected,
onToggleClick: hasPermissions ? (parentId, childId) => {
setError("");
if (!selected.has(parentId)) {
setSelected(new Map(selected.set(parentId, new Set([childId]))));
return;
}
const parentSet = selected.get(parentId);
if (!parentSet.has(childId)) {
setSelected(new Map(selected.set(parentId, new Set([...parentSet, childId]))));
return;
}
parentSet.delete(childId);
setSelected(new Map(selected.set(parentId, new Set(parentSet))));
} : undefined,
onViewRoomClick: (roomId, autoJoin) => {
showRoom(roomsMap.get(roomId), Array.from(viaMap.get(roomId) || []), autoJoin);
}
}), children && /*#__PURE__*/_react.default.createElement("hr", null));
} else {
results = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomDirectory_noResults"
}, /*#__PURE__*/_react.default.createElement("h3", null, (0, _languageHandler._t)("No results found")), /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("You may want to try a different search or check for typos.")));
}
content = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomDirectory_listHeader"
}, countsStr, /*#__PURE__*/_react.default.createElement("span", null, additionalButtons, manageButtons)), error && /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomDirectory_error"
}, error), /*#__PURE__*/_react.default.createElement(_AutoHideScrollbar.default, {
className: "mx_SpaceRoomDirectory_list"
}, results, children));
} else {
content = /*#__PURE__*/_react.default.createElement(_Spinner.default, null);
} // TODO loading state/error state
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_SearchBox.default, {
className: "mx_textinput_icon mx_textinput_search",
placeholder: (0, _languageHandler._t)("Search names and descriptions"),
onSearch: setQuery,
autoFocus: true,
initialValue: initialText
}), content);
};
exports.SpaceHierarchy = SpaceHierarchy;
const SpaceRoomDirectory
/*: React.FC<IProps>*/
= ({
space,
onFinished,
initialText
}) => {
const onCreateRoomClick = () => {
_dispatcher.default.dispatch({
action: 'view_create_room',
public: true
});
onFinished();
};
const title = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, {
room: space,
height: 32,
width: 32
}), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("h1", null, (0, _languageHandler._t)("Explore rooms")), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_RoomName.default, {
room: space
}))));
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
className: "mx_SpaceRoomDirectory",
hasCancel: true,
onFinished: onFinished,
title: title
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_Dialog_content"
}, (0, _languageHandler._t)("If you can't find the room you're looking for, ask for an invite or <a>create a new room</a>.", null, {
a: sub => {
return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "link",
onClick: onCreateRoomClick
}, sub);
}
}), /*#__PURE__*/_react.default.createElement(SpaceHierarchy, {
space: space,
showRoom: (room
/*: ISpaceSummaryRoom*/
, viaServers
/*: string[]*/
, autoJoin = false) => {
showRoom(room, viaServers, autoJoin);
onFinished();
},
initialText: initialText
}, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: onCreateRoomClick,
kind: "primary",
className: "mx_SpaceRoomDirectory_createRoom"
}, (0, _languageHandler._t)("Create room")))));
};
var _default = SpaceRoomDirectory; // Similar to matrix-react-sdk's MatrixTools.getDisplayAliasForRoom
// but works with the objects we get from the public room list
exports.default = _default;
function getDisplayAliasForRoom(room
/*: ISpaceSummaryRoom*/
) {
return room.canonical_alias || (room.aliases ? room.aliases[0] : "");
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0cnVjdHVyZXMvU3BhY2VSb29tRGlyZWN0b3J5LnRzeCJdLCJuYW1lcyI6WyJUaWxlIiwicm9vbSIsInN1Z2dlc3RlZCIsInNlbGVjdGVkIiwiaGFzUGVybWlzc2lvbnMiLCJvblRvZ2dsZUNsaWNrIiwib25WaWV3Um9vbUNsaWNrIiwibnVtQ2hpbGRSb29tcyIsImNoaWxkcmVuIiwibmFtZSIsImNhbm9uaWNhbF9hbGlhcyIsImFsaWFzZXMiLCJyb29tX3R5cGUiLCJSb29tVHlwZSIsIlNwYWNlIiwic2hvd0NoaWxkcmVuIiwidG9nZ2xlU2hvd0NoaWxkcmVuIiwiY2xpIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0IiwiY2xpUm9vbSIsImdldFJvb20iLCJyb29tX2lkIiwibXlNZW1iZXJzaGlwIiwiZ2V0TXlNZW1iZXJzaGlwIiwib25QcmV2aWV3Q2xpY2siLCJldiIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwib25Kb2luQ2xpY2siLCJidXR0b24iLCJjaGVja2JveCIsInVybCIsImF2YXRhcl91cmwiLCJnZXRTcXVhcmVUaHVtYm5haWxIdHRwIiwiZGVzY3JpcHRpb24iLCJjb3VudCIsIm51bV9qb2luZWRfbWVtYmVycyIsInRvcGljIiwic3VnZ2VzdGVkU2VjdGlvbiIsImNvbnRlbnQiLCJlIiwidGFyZ2V0IiwidGFnTmFtZSIsImNoaWxkVG9nZ2xlIiwiY2hpbGRTZWN0aW9uIiwibXhfU3BhY2VSb29tRGlyZWN0b3J5X3N1YnNwYWNlX3RvZ2dsZV9zaG93biIsIm14X1NwYWNlUm9vbURpcmVjdG9yeV9zdWJzcGFjZSIsInNob3dSb29tIiwidmlhU2VydmVycyIsImF1dG9Kb2luIiwiaXNHdWVzdCIsIndvcmxkX3JlYWRhYmxlIiwiZ3Vlc3RfY2FuX2pvaW4iLCJkaXMiLCJkaXNwYXRjaCIsImFjdGlvbiIsInJvb21BbGlhcyIsImdldERpc3BsYXlBbGlhc0ZvclJvb20iLCJ1bmRlZmluZWQiLCJhdXRvX2pvaW4iLCJzaG91bGRfcGVlayIsIl90eXBlIiwicm9vbV9hbGlhcyIsInZpYV9zZXJ2ZXJzIiwib29iX2RhdGEiLCJhdmF0YXJVcmwiLCJIaWVyYXJjaHlMZXZlbCIsInNwYWNlSWQiLCJyb29tcyIsInJlbGF0aW9ucyIsInBhcmVudHMiLCJzZWxlY3RlZE1hcCIsInNwYWNlIiwiY3VycmVudFN0YXRlIiwibWF5U2VuZFN0YXRlRXZlbnQiLCJFdmVudFR5cGUiLCJTcGFjZUNoaWxkIiwiZ2V0VXNlcklkIiwiQXJyYXkiLCJmcm9tIiwidmFsdWVzIiwic29ydGVkQ2hpbGRyZW4iLCJvcmRlciIsInN0YXRlX2tleSIsInN1YnNwYWNlcyIsImNoaWxkUm9vbXMiLCJyZWR1Y2UiLCJyZXN1bHQiLCJyb29tSWQiLCJoYXMiLCJwdXNoIiwibmV3UGFyZW50cyIsIlNldCIsImFkZCIsIm1hcCIsImZpbHRlciIsImxlbmd0aCIsInVzZVNwYWNlU3VtbWFyeSIsInJlZnJlc2hUb2tlbiIsImRhdGEiLCJnZXRTcGFjZVN1bW1hcnkiLCJwYXJlbnRDaGlsZFJlbGF0aW9ucyIsIkVuaGFuY2VkTWFwIiwiY2hpbGRQYXJlbnRSZWxhdGlvbnMiLCJ2aWFNYXAiLCJldmVudHMiLCJ0eXBlIiwiZ2V0T3JDcmVhdGUiLCJNYXAiLCJzZXQiLCJpc0FycmF5IiwiZm9yRWFjaCIsInZpYSIsImNvbnNvbGUiLCJlcnJvciIsIlNwYWNlSGllcmFyY2h5IiwiaW5pdGlhbFRleHQiLCJhZGRpdGlvbmFsQnV0dG9ucyIsInVzZXJJZCIsInF1ZXJ5Iiwic2V0UXVlcnkiLCJzZXRTZWxlY3RlZCIsInN1bW1hcnlFcnJvciIsInBhcmVudENoaWxkTWFwIiwiY2hpbGRQYXJlbnRNYXAiLCJyb29tc01hcCIsImxjUXVlcnkiLCJ0b0xvd2VyQ2FzZSIsInRyaW0iLCJyIiwiZGlyZWN0TWF0Y2hlcyIsImluY2x1ZGVzIiwidmlzaXRlZCIsInF1ZXVlIiwicG9wIiwicGFyZW50SWQiLCJrZXlzIiwiZGVsZXRlIiwic2V0RXJyb3IiLCJyZW1vdmluZyIsInNldFJlbW92aW5nIiwic2F2aW5nIiwic2V0U2F2aW5nIiwibnVtUm9vbXMiLCJudW1TcGFjZXMiLCJzaXplIiwiY291bnRzU3RyIiwibWFuYWdlQnV0dG9ucyIsInNlbGVjdGVkUmVsYXRpb25zIiwiZmxhdE1hcCIsImNoaWxkSWQiLCJzZWxlY3Rpb25BbGxTdWdnZXN0ZWQiLCJldmVyeSIsImRpc2FibGVkIiwiQnV0dG9uIiwiQWNjZXNzaWJsZUJ1dHRvbiIsInByb3BzIiwiQWNjZXNzaWJsZVRvb2x0aXBCdXR0b24iLCJ0b29sdGlwIiwieU9mZnNldCIsInNlbmRTdGF0ZUV2ZW50IiwiZXhpc3RpbmdDb250ZW50IiwicmVzdWx0cyIsInBhcmVudFNldCIsIlNwYWNlUm9vbURpcmVjdG9yeSIsIm9uRmluaXNoZWQiLCJvbkNyZWF0ZVJvb21DbGljayIsInB1YmxpYyIsInRpdGxlIiwiYSIsInN1YiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBOztBQUdBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFrREEsTUFBTUE7QUFBMEI7QUFBQSxFQUFHLENBQUM7QUFDaENDLEVBQUFBLElBRGdDO0FBRWhDQyxFQUFBQSxTQUZnQztBQUdoQ0MsRUFBQUEsUUFIZ0M7QUFJaENDLEVBQUFBLGNBSmdDO0FBS2hDQyxFQUFBQSxhQUxnQztBQU1oQ0MsRUFBQUEsZUFOZ0M7QUFPaENDLEVBQUFBLGFBUGdDO0FBUWhDQyxFQUFBQTtBQVJnQyxDQUFELEtBUzdCO0FBQ0YsUUFBTUMsSUFBSSxHQUFHUixJQUFJLENBQUNRLElBQUwsSUFBYVIsSUFBSSxDQUFDUyxlQUFsQixJQUFxQ1QsSUFBSSxDQUFDVSxPQUFMLEdBQWUsQ0FBZixDQUFyQyxLQUNMVixJQUFJ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