UNPKG

matrix-react-sdk

Version:
636 lines (542 loc) 85.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _event = require("matrix-js-sdk/src/@types/event"); var _languageHandler = require("../../../languageHandler"); var _RovingTabIndex = require("../../../accessibility/RovingTabIndex"); var _RoomListStore = _interopRequireWildcard(require("../../../stores/room-list/RoomListStore")); var _RoomViewStore = _interopRequireDefault(require("../../../stores/RoomViewStore")); var _models = require("../../../stores/room-list/models"); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _RoomSublist = _interopRequireDefault(require("./RoomSublist")); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _GroupAvatar = _interopRequireDefault(require("../avatars/GroupAvatar")); var _ExtraTile = _interopRequireDefault(require("./ExtraTile")); var _StaticNotificationState = require("../../../stores/notifications/StaticNotificationState"); var _actions = require("../../../dispatcher/actions"); var _RoomNotificationStateStore = require("../../../stores/notifications/RoomNotificationStateStore"); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); var _CustomRoomTagStore = _interopRequireDefault(require("../../../stores/CustomRoomTagStore")); var _arrays = require("../../../utils/arrays"); var _objects = require("../../../utils/objects"); var _IconizedContextMenu = require("../context_menus/IconizedContextMenu"); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _CommunityPrototypeStore = require("../../../stores/CommunityPrototypeStore"); var _CallHandler = _interopRequireDefault(require("../../../CallHandler")); var _SpaceStore = _interopRequireWildcard(require("../../../stores/SpaceStore")); var _space = require("../../../utils/space"); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _RoomAvatar = _interopRequireDefault(require("../avatars/RoomAvatar")); var _dec, _class, _temp; const TAG_ORDER /*: TagID[]*/ = [_models.DefaultTagID.Invite, _models.DefaultTagID.Favourite, _models.DefaultTagID.DM, _models.DefaultTagID.Untagged, // -- Custom Tags Placeholder -- _models.DefaultTagID.LowPriority, _models.DefaultTagID.ServerNotice, _models.DefaultTagID.Suggested, _models.DefaultTagID.Archived]; const CUSTOM_TAGS_BEFORE_TAG = _models.DefaultTagID.LowPriority; const ALWAYS_VISIBLE_TAGS /*: TagID[]*/ = [_models.DefaultTagID.DM, _models.DefaultTagID.Untagged]; // If we have no dialer support, we just show the create chat dialog const dmOnAddRoom = (dispatcher /*: Dispatcher<ActionPayload>*/ ) => { (dispatcher || _dispatcher.default).dispatch({ action: 'view_create_chat' }); }; // If we have dialer support, show a context menu so the user can pick between // the dialer and the create chat dialog const dmAddRoomContextMenu = (onFinished /*: () => void*/ ) => { return /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, { first: true }, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("Start a Conversation"), iconClassName: "mx_RoomList_iconPlus", onClick: e => { e.preventDefault(); e.stopPropagation(); onFinished(); _dispatcher.default.dispatch({ action: "view_create_chat" }); } }), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("Open dial pad"), iconClassName: "mx_RoomList_iconDialpad", onClick: e => { e.preventDefault(); e.stopPropagation(); onFinished(); _dispatcher.default.fire(_actions.Action.OpenDialPad); } })); }; const TAG_AESTHETICS /*: ITagAestheticsMap*/ = { [_models.DefaultTagID.Invite]: { sectionLabel: (0, _languageHandler._td)("Invites"), isInvite: true, defaultHidden: false }, [_models.DefaultTagID.Favourite]: { sectionLabel: (0, _languageHandler._td)("Favourites"), isInvite: false, defaultHidden: false }, [_models.DefaultTagID.DM]: { sectionLabel: (0, _languageHandler._td)("People"), isInvite: false, defaultHidden: false, addRoomLabel: (0, _languageHandler._td)("Start chat") // Either onAddRoom or addRoomContextMenu are set depending on whether we // have dialer support. }, [_models.DefaultTagID.Untagged]: { sectionLabel: (0, _languageHandler._td)("Rooms"), isInvite: false, defaultHidden: false, addRoomLabel: (0, _languageHandler._td)("Add room"), addRoomContextMenu: (onFinished /*: () => void*/ ) => { if (_SpaceStore.default.instance.activeSpace) { const canAddRooms = _SpaceStore.default.instance.activeSpace.currentState.maySendStateEvent(_event.EventType.SpaceChild, _MatrixClientPeg.MatrixClientPeg.get().getUserId()); return /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, { first: true }, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("Create new room"), iconClassName: "mx_RoomList_iconPlus", onClick: e => { e.preventDefault(); e.stopPropagation(); onFinished(); (0, _space.showCreateNewRoom)(_MatrixClientPeg.MatrixClientPeg.get(), _SpaceStore.default.instance.activeSpace); }, disabled: !canAddRooms, tooltip: canAddRooms ? undefined : (0, _languageHandler._t)("You do not have permissions to create new rooms in this space") }), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("Add existing room"), iconClassName: "mx_RoomList_iconHash", onClick: e => { e.preventDefault(); e.stopPropagation(); onFinished(); (0, _space.showAddExistingRooms)(_MatrixClientPeg.MatrixClientPeg.get(), _SpaceStore.default.instance.activeSpace); }, disabled: !canAddRooms, tooltip: canAddRooms ? undefined : (0, _languageHandler._t)("You do not have permissions to add rooms to this space") }), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("Explore rooms"), iconClassName: "mx_RoomList_iconBrowse", onClick: e => { e.preventDefault(); e.stopPropagation(); onFinished(); _dispatcher.default.fire(_actions.Action.ViewRoomDirectory); } })); } return /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, { first: true }, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("Create new room"), iconClassName: "mx_RoomList_iconPlus", onClick: e => { e.preventDefault(); e.stopPropagation(); onFinished(); _dispatcher.default.dispatch({ action: "view_create_room" }); } }), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: _CommunityPrototypeStore.CommunityPrototypeStore.instance.getSelectedCommunityId() ? (0, _languageHandler._t)("Explore community rooms") : (0, _languageHandler._t)("Explore public rooms"), iconClassName: "mx_RoomList_iconExplore", onClick: e => { e.preventDefault(); e.stopPropagation(); onFinished(); _dispatcher.default.fire(_actions.Action.ViewRoomDirectory); } })); } }, [_models.DefaultTagID.LowPriority]: { sectionLabel: (0, _languageHandler._td)("Low priority"), isInvite: false, defaultHidden: false }, [_models.DefaultTagID.ServerNotice]: { sectionLabel: (0, _languageHandler._td)("System Alerts"), isInvite: false, defaultHidden: false }, // TODO: Replace with archived view: https://github.com/vector-im/element-web/issues/14038 [_models.DefaultTagID.Archived]: { sectionLabel: (0, _languageHandler._td)("Historical"), isInvite: false, defaultHidden: true }, [_models.DefaultTagID.Suggested]: { sectionLabel: (0, _languageHandler._td)("Suggested Rooms"), isInvite: false, defaultHidden: false } }; function customTagAesthetics(tagId /*: TagID*/ ) /*: ITagAesthetics*/ { if (tagId.startsWith("u.")) { tagId = tagId.substring(2); } return { sectionLabel: (0, _languageHandler._td)("Custom Tag"), sectionLabelRaw: tagId, isInvite: false, defaultHidden: false }; } let RoomList = (_dec = (0, _replaceableComponent.replaceableComponent)("views.rooms.RoomList"), _dec(_class = (_temp = class RoomList extends _react.default.PureComponent /*:: <IProps, IState>*/ { constructor(props /*: IProps*/ ) { super(props); (0, _defineProperty2.default)(this, "dispatcherRef", void 0); (0, _defineProperty2.default)(this, "customTagStoreRef", void 0); (0, _defineProperty2.default)(this, "tagAesthetics", void 0); (0, _defineProperty2.default)(this, "roomStoreToken", void 0); (0, _defineProperty2.default)(this, "onRoomViewStoreUpdate", () => { this.setState({ currentRoomId: _RoomViewStore.default.getRoomId() }); }); (0, _defineProperty2.default)(this, "onAction", (payload /*: ActionPayload*/ ) => { if (payload.action === _actions.Action.ViewRoomDelta) { const viewRoomDeltaPayload = payload; const currentRoomId = _RoomViewStore.default.getRoomId(); const room = this.getRoomDelta(currentRoomId, viewRoomDeltaPayload.delta, viewRoomDeltaPayload.unread); if (room) { _dispatcher.default.dispatch({ action: 'view_room', room_id: room.roomId, show_room_tile: true // to make sure the room gets scrolled into view }); } } else if (payload.action === _actions.Action.PstnSupportUpdated) { this.updateDmAddRoomAction(); this.updateLists(); } }); (0, _defineProperty2.default)(this, "getRoomDelta", (roomId /*: string*/ , delta /*: number*/ , unread = false) => { const lists = _RoomListStore.default.instance.orderedLists; const rooms /*: Room[]*/ = []; TAG_ORDER.forEach(t => { let listRooms = lists[t]; if (unread) { // filter to only notification rooms (and our current active room so we can index properly) listRooms = listRooms.filter(r => { const state = _RoomNotificationStateStore.RoomNotificationStateStore.instance.getRoomState(r); return state.room.roomId === roomId || state.isUnread; }); } rooms.push(...listRooms); }); const currentIndex = rooms.findIndex(r => r.roomId === roomId); // use slice to account for looping around the start const [room] = rooms.slice((currentIndex + delta) % rooms.length); return room; }); (0, _defineProperty2.default)(this, "updateSuggestedRooms", (suggestedRooms /*: ISpaceSummaryRoom[]*/ ) => { this.setState({ suggestedRooms }); }); (0, _defineProperty2.default)(this, "updateLists", () => { const newLists = _RoomListStore.default.instance.orderedLists; if (_SettingsStore.default.getValue("advancedRoomListLogging")) { // TODO: Remove debug: https://github.com/vector-im/element-web/issues/14602 console.log("new lists", newLists); } const previousListIds = Object.keys(this.state.sublists); const newListIds = Object.keys(newLists).filter(t => { if (!(0, _models.isCustomTag)(t)) return true; // always include non-custom tags // if the tag is custom though, only include it if it is enabled return _CustomRoomTagStore.default.getTags()[t]; }); const isNameFiltering = !!_RoomListStore.default.instance.getFirstNameFilterCondition(); let doUpdate = this.state.isNameFiltering !== isNameFiltering || (0, _arrays.arrayHasDiff)(previousListIds, newListIds); if (!doUpdate) { // so we didn't have the visible sublists change, but did the contents of those // sublists change significantly enough to break the sticky headers? Probably, so // let's check the length of each. for (const tagId of newListIds) { const oldRooms = this.state.sublists[tagId]; const newRooms = newLists[tagId]; if (oldRooms.length !== newRooms.length) { doUpdate = true; break; } } } if (doUpdate) { // We have to break our reference to the room list store if we want to be able to // diff the object for changes, so do that. // @ts-ignore - ITagMap is ts-ignored so this will have to be too const newSublists = (0, _objects.objectWithOnly)(newLists, newListIds); const sublists = (0, _objects.objectShallowClone)(newSublists, (k, v) => (0, _arrays.arrayFastClone)(v)); this.setState({ sublists, isNameFiltering }, () => { this.props.onResize(); }); } }); (0, _defineProperty2.default)(this, "onStartChat", () => { const initialText = _RoomListStore.default.instance.getFirstNameFilterCondition()?.search; _dispatcher.default.dispatch({ action: "view_create_chat", initialText }); }); (0, _defineProperty2.default)(this, "onExplore", () => { const initialText = _RoomListStore.default.instance.getFirstNameFilterCondition()?.search; _dispatcher.default.dispatch({ action: _actions.Action.ViewRoomDirectory, initialText }); }); (0, _defineProperty2.default)(this, "onSpaceInviteClick", () => { const initialText = _RoomListStore.default.instance.getFirstNameFilterCondition()?.search; (0, _space.showSpaceInvite)(this.props.activeSpace, initialText); }); this.state = { sublists: {}, isNameFiltering: !!_RoomListStore.default.instance.getFirstNameFilterCondition(), suggestedRooms: _SpaceStore.default.instance.suggestedRooms }; // shallow-copy from the template as we need to make modifications to it this.tagAesthetics = (0, _objects.objectShallowClone)(TAG_AESTHETICS); this.updateDmAddRoomAction(); } componentDidMount() /*: void*/ { this.dispatcherRef = _dispatcher.default.register(this.onAction); this.roomStoreToken = _RoomViewStore.default.addListener(this.onRoomViewStoreUpdate); _SpaceStore.default.instance.on(_SpaceStore.SUGGESTED_ROOMS, this.updateSuggestedRooms); _RoomListStore.default.instance.on(_RoomListStore.LISTS_UPDATE_EVENT, this.updateLists); this.customTagStoreRef = _CustomRoomTagStore.default.addListener(this.updateLists); this.updateLists(); // trigger the first update } componentWillUnmount() { _SpaceStore.default.instance.off(_SpaceStore.SUGGESTED_ROOMS, this.updateSuggestedRooms); _RoomListStore.default.instance.off(_RoomListStore.LISTS_UPDATE_EVENT, this.updateLists); _dispatcher.default.unregister(this.dispatcherRef); if (this.customTagStoreRef) this.customTagStoreRef.remove(); if (this.roomStoreToken) this.roomStoreToken.remove(); } updateDmAddRoomAction() { const dmTagAesthetics = (0, _objects.objectShallowClone)(TAG_AESTHETICS[_models.DefaultTagID.DM]); if (_CallHandler.default.sharedInstance().getSupportsPstnProtocol()) { dmTagAesthetics.addRoomContextMenu = dmAddRoomContextMenu; } else { dmTagAesthetics.onAddRoom = dmOnAddRoom; } this.tagAesthetics[_models.DefaultTagID.DM] = dmTagAesthetics; } renderSuggestedRooms() /*: ReactComponentElement<typeof ExtraTile>[]*/ { return this.state.suggestedRooms.map(room => { const name = room.name || room.canonical_alias || room.aliases?.[0] || (0, _languageHandler._t)("Empty room"); const avatar = /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, { oobData: { name, avatarUrl: room.avatar_url }, width: 32, height: 32, resizeMethod: "crop" }); const viewRoom = () => { _dispatcher.default.dispatch({ action: "view_room", room_id: room.room_id, oobData: { avatarUrl: room.avatar_url, name } }); }; return /*#__PURE__*/_react.default.createElement(_ExtraTile.default, { isMinimized: this.props.isMinimized, isSelected: this.state.currentRoomId === room.room_id, displayName: name, avatar: avatar, onClick: viewRoom, key: `suggestedRoomTile_${room.room_id}` }); }); } renderCommunityInvites() /*: ReactComponentElement<typeof ExtraTile>[]*/ { // TODO: Put community invites in a more sensible place (not in the room list) // See https://github.com/vector-im/element-web/issues/14456 return _MatrixClientPeg.MatrixClientPeg.get().getGroups().filter(g => { return g.myMembership === 'invite'; }).map(g => { const avatar = /*#__PURE__*/_react.default.createElement(_GroupAvatar.default, { groupId: g.groupId, groupName: g.name, groupAvatarUrl: g.avatarUrl, width: 32, height: 32, resizeMethod: "crop" }); const openGroup = () => { _dispatcher.default.dispatch({ action: 'view_group', group_id: g.groupId }); }; return /*#__PURE__*/_react.default.createElement(_ExtraTile.default, { isMinimized: this.props.isMinimized, isSelected: false, displayName: g.name, avatar: avatar, notificationState: _StaticNotificationState.StaticNotificationState.RED_EXCLAMATION, onClick: openGroup, key: `temporaryGroupTile_${g.groupId}` }); }); } renderSublists() /*: React.ReactElement[]*/ { // show a skeleton UI if the user is in no rooms and they are not filtering const showSkeleton = !this.state.isNameFiltering && Object.values(_RoomListStore.default.instance.unfilteredLists).every(list => !list?.length); return TAG_ORDER.reduce((tags, tagId) => { if (tagId === CUSTOM_TAGS_BEFORE_TAG) { const customTags = Object.keys(this.state.sublists).filter(tagId => (0, _models.isCustomTag)(tagId)); tags.push(...customTags); } tags.push(tagId); return tags; }, []).map(orderedTagId => { let extraTiles = null; if (orderedTagId === _models.DefaultTagID.Invite) { extraTiles = this.renderCommunityInvites(); } else if (orderedTagId === _models.DefaultTagID.Suggested) { extraTiles = this.renderSuggestedRooms(); } const aesthetics /*: ITagAesthetics*/ = (0, _models.isCustomTag)(orderedTagId) ? customTagAesthetics(orderedTagId) : this.tagAesthetics[orderedTagId]; if (!aesthetics) throw new Error(`Tag ${orderedTagId} does not have aesthetics`); // The cost of mounting/unmounting this component offsets the cost // of keeping it in the DOM and hiding it when it is not required return /*#__PURE__*/_react.default.createElement(_RoomSublist.default, { key: `sublist-${orderedTagId}`, tagId: orderedTagId, forRooms: true, startAsHidden: aesthetics.defaultHidden, label: aesthetics.sectionLabelRaw ? aesthetics.sectionLabelRaw : (0, _languageHandler._t)(aesthetics.sectionLabel), onAddRoom: aesthetics.onAddRoom, addRoomLabel: aesthetics.addRoomLabel ? (0, _languageHandler._t)(aesthetics.addRoomLabel) : aesthetics.addRoomLabel, addRoomContextMenu: aesthetics.addRoomContextMenu, isMinimized: this.props.isMinimized, onResize: this.props.onResize, showSkeleton: showSkeleton, extraTiles: extraTiles, resizeNotifier: this.props.resizeNotifier, alwaysVisible: ALWAYS_VISIBLE_TAGS.includes(orderedTagId) }); }); } render() { const cli = _MatrixClientPeg.MatrixClientPeg.get(); const userId = cli.getUserId(); let explorePrompt /*: JSX.Element*/ ; if (!this.props.isMinimized) { if (this.state.isNameFiltering) { explorePrompt = /*#__PURE__*/_react.default.createElement("div", { className: "mx_RoomList_explorePrompt" }, /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("Can't see what you’re looking for?")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_RoomList_explorePrompt_startChat", kind: "link", onClick: this.onStartChat }, (0, _languageHandler._t)("Start a new chat")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_RoomList_explorePrompt_explore", kind: "link", onClick: this.onExplore }, this.props.activeSpace ? (0, _languageHandler._t)("Explore rooms") : (0, _languageHandler._t)("Explore all public rooms"))); } else if (this.props.activeSpace?.canInvite(userId) || this.props.activeSpace?.getMyMembership() === "join") { explorePrompt = /*#__PURE__*/_react.default.createElement("div", { className: "mx_RoomList_explorePrompt" }, /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("Quick actions")), this.props.activeSpace.canInvite(userId) && /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_RoomList_explorePrompt_spaceInvite", onClick: this.onSpaceInviteClick }, (0, _languageHandler._t)("Invite people")), this.props.activeSpace.getMyMembership() === "join" && /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_RoomList_explorePrompt_spaceExplore", onClick: this.onExplore }, (0, _languageHandler._t)("Explore rooms"))); } else if (Object.values(this.state.sublists).some(list => list.length > 0)) { const unfilteredLists = _RoomListStore.default.instance.unfilteredLists; const unfilteredRooms = unfilteredLists[_models.DefaultTagID.Untagged] || []; const unfilteredHistorical = unfilteredLists[_models.DefaultTagID.Archived] || []; const unfilteredFavourite = unfilteredLists[_models.DefaultTagID.Favourite] || []; // show a prompt to join/create rooms if the user is in 0 rooms and no historical if (unfilteredRooms.length < 1 && unfilteredHistorical < 1 && unfilteredFavourite < 1) { explorePrompt = /*#__PURE__*/_react.default.createElement("div", { className: "mx_RoomList_explorePrompt" }, /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("Use the + to make a new room or explore existing ones below")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_RoomList_explorePrompt_startChat", kind: "link", onClick: this.onStartChat }, (0, _languageHandler._t)("Start a new chat")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_RoomList_explorePrompt_explore", kind: "link", onClick: this.onExplore }, (0, _languageHandler._t)("Explore all public rooms"))); } } } const sublists = this.renderSublists(); return /*#__PURE__*/_react.default.createElement(_RovingTabIndex.RovingTabIndexProvider, { handleHomeEnd: true, onKeyDown: this.props.onKeyDown }, ({ onKeyDownHandler }) => /*#__PURE__*/_react.default.createElement("div", { onFocus: this.props.onFocus, onBlur: this.props.onBlur, onKeyDown: onKeyDownHandler, className: "mx_RoomList", role: "tree", "aria-label": (0, _languageHandler._t)("Rooms") }, sublists, explorePrompt)); } }, _temp)) || _class); exports.default = RoomList; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL1Jvb21MaXN0LnRzeCJdLCJuYW1lcyI6WyJUQUdfT1JERVIiLCJEZWZhdWx0VGFnSUQiLCJJbnZpdGUiLCJGYXZvdXJpdGUiLCJETSIsIlVudGFnZ2VkIiwiTG93UHJpb3JpdHkiLCJTZXJ2ZXJOb3RpY2UiLCJTdWdnZXN0ZWQiLCJBcmNoaXZlZCIsIkNVU1RPTV9UQUdTX0JFRk9SRV9UQUciLCJBTFdBWVNfVklTSUJMRV9UQUdTIiwiZG1PbkFkZFJvb20iLCJkaXNwYXRjaGVyIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJkaXNwYXRjaCIsImFjdGlvbiIsImRtQWRkUm9vbUNvbnRleHRNZW51Iiwib25GaW5pc2hlZCIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImZpcmUiLCJBY3Rpb24iLCJPcGVuRGlhbFBhZCIsIlRBR19BRVNUSEVUSUNTIiwic2VjdGlvbkxhYmVsIiwiaXNJbnZpdGUiLCJkZWZhdWx0SGlkZGVuIiwiYWRkUm9vbUxhYmVsIiwiYWRkUm9vbUNvbnRleHRNZW51IiwiU3BhY2VTdG9yZSIsImluc3RhbmNlIiwiYWN0aXZlU3BhY2UiLCJjYW5BZGRSb29tcyIsImN1cnJlbnRTdGF0ZSIsIm1heVNlbmRTdGF0ZUV2ZW50IiwiRXZlbnRUeXBlIiwiU3BhY2VDaGlsZCIsIk1hdHJpeENsaWVudFBlZyIsImdldCIsImdldFVzZXJJZCIsInVuZGVmaW5lZCIsIlZpZXdSb29tRGlyZWN0b3J5IiwiQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUiLCJnZXRTZWxlY3RlZENvbW11bml0eUlkIiwiY3VzdG9tVGFnQWVzdGhldGljcyIsInRhZ0lkIiwic3RhcnRzV2l0aCIsInN1YnN0cmluZyIsInNlY3Rpb25MYWJlbFJhdyIsIlJvb21MaXN0IiwiUmVhY3QiLCJQdXJlQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsInNldFN0YXRlIiwiY3VycmVudFJvb21JZCIsIlJvb21WaWV3U3RvcmUiLCJnZXRSb29tSWQiLCJwYXlsb2FkIiwiVmlld1Jvb21EZWx0YSIsInZpZXdSb29tRGVsdGFQYXlsb2FkIiwicm9vbSIsImdldFJvb21EZWx0YSIsImRlbHRhIiwidW5yZWFkIiwiZGlzIiwicm9vbV9pZCIsInJvb21JZCIsInNob3dfcm9vbV90aWxlIiwiUHN0blN1cHBvcnRVcGRhdGVkIiwidXBkYXRlRG1BZGRSb29tQWN0aW9uIiwidXBkYXRlTGlzdHMiLCJsaXN0cyIsIlJvb21MaXN0U3RvcmUiLCJvcmRlcmVkTGlzdHMiLCJyb29tcyIsImZvckVhY2giLCJ0IiwibGlzdFJvb21zIiwiZmlsdGVyIiwiciIsInN0YXRlIiwiUm9vbU5vdGlmaWNhdGlvblN0YXRlU3RvcmUiLCJnZXRSb29tU3RhdGUiLCJpc1VucmVhZCIsInB1c2giLCJjdXJyZW50SW5kZXgiLCJmaW5kSW5kZXgiLCJzbGljZSIsImxlbmd0aCIsInN1Z2dlc3RlZFJvb21zIiwibmV3TGlzdHMiLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWUiLCJjb25zb2xlIiwibG9nIiwicHJldmlvdXNMaXN0SWRzIiwiT2JqZWN0Iiwia2V5cyIsInN1Ymxpc3RzIiwibmV3TGlzdElkcyIsIkN1c3RvbVJvb21UYWdTdG9yZSIsImdldFRhZ3MiLCJpc05hbWVGaWx0ZXJpbmciLCJnZXRGaXJzdE5hbWVGaWx0ZXJDb25kaXRpb24iLCJkb1VwZGF0ZSIsIm9sZFJvb21zIiwibmV3Um9vbXMiLCJuZXdTdWJsaXN0cyIsImsiLCJ2Iiwib25SZXNpemUiLCJpbml0aWFsVGV4dCIsInNlYXJjaCIsInRhZ0Flc3RoZXRpY3MiLCJjb21wb25lbnREaWRNb3VudCIsImRpc3BhdGNoZXJSZWYiLCJyZWdpc3RlciIsIm9uQWN0aW9uIiwicm9vbVN0b3JlVG9rZW4iLCJhZGRMaXN0ZW5lciIsIm9uUm9vbVZpZXdTdG9yZVVwZGF0ZSIsIm9uIiwiU1VHR0VTVEVEX1JPT01TIiwidXBkYXRlU3VnZ2VzdGVkUm9vbXMiLCJMSVNUU19VUERBVEVfRVZFTlQiLCJjdXN0b21UYWdTdG9yZVJlZiIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwib2ZmIiwidW5yZWdpc3RlciIsInJlbW92ZSIsImRtVGFnQWVzdGhldGljcyIsIkNhbGxIYW5kbGVyIiwic2hhcmVkSW5zdGFuY2UiLCJnZXRTdXBwb3J0c1BzdG5Qcm90b2NvbCIsIm9uQWRkUm9vbSIsInJlbmRlclN1Z2dlc3RlZFJvb21zIiwibWFwIiwibmFtZSIsImNhbm9uaWNhbF9hbGlhcyIsImFsaWFzZXMiLCJhdmF0YXIiLCJhdmF0YXJVcmwiLCJhdmF0YXJfdXJsIiwidmlld1Jvb20iLCJvb2JEYXRhIiwiaXNNaW5pbWl6ZWQiLCJyZW5kZXJDb21tdW5pdHlJbnZpdGVzIiwiZ2V0R3JvdXBzIiwiZyIsIm15TWVtYmVyc2hpcCIsImdyb3VwSWQiLCJvcGVuR3JvdXAiLCJncm91cF9pZCIsIlN0YXRpY05vdGlmaWNhdGlvblN0YXRlIiwiUkVEX0VYQ0xBTUFUSU9OIiwicmVuZGVyU3VibGlzdHMiLCJzaG93U2tlbGV0b24iLCJ2YWx1ZXMiLCJ1bmZpbHRlcmVkTGlzdHMiLCJldmVyeSIsImxpc3QiLCJyZWR1Y2UiLCJ0YWdzIiwiY3VzdG9tVGFncyIsIm9yZGVyZWRUYWdJZCIsImV4dHJhVGlsZXMiLCJhZXN0aGV0aWNzIiwiRXJyb3IiLCJyZXNpemVOb3RpZmllciIsImluY2x1ZGVzIiwicmVuZGVyIiwiY2xpIiwidXNlcklkIiwiZXhwbG9yZVByb21wdCIsIm9uU3RhcnRDaGF0Iiwib25FeHBsb3JlIiwiY2FuSW52aXRlIiwiZ2V0TXlNZW1iZXJzaGlwIiwib25TcGFjZUludml0ZUNsaWNrIiwic29tZSIsInVuZmlsdGVyZWRSb29tcyIsInVuZmlsdGVyZWRIaXN0b3JpY2FsIiwidW5maWx0ZXJlZEZhdm91cml0ZSIsIm9uS2V5RG93biIsIm9uS2V5RG93bkhhbmRsZXIiLCJvbkZvY3VzIiwib25CbHVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBZ0JBOztBQUlBOztBQUVBOztBQUNBOztBQUVBOztBQUNBOztBQUVBOztBQUNBOztBQUVBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBb0JBLE1BQU1BO0FBQWtCO0FBQUEsRUFBRyxDQUN2QkMscUJBQWFDLE1BRFUsRUFFdkJELHFCQUFhRSxTQUZVLEVBR3ZCRixxQkFBYUcsRUFIVSxFQUl2QkgscUJBQWFJLFFBSlUsRUFNdkI7QUFFQUoscUJBQWFLLFdBUlUsRUFTdkJMLHFCQUFhTSxZQVRVLEVBVXZCTixxQkFBYU8sU0FWVSxFQVd2QlAscUJBQWFRLFFBWFUsQ0FBM0I7QUFhQSxNQUFNQyxzQkFBc0IsR0FBR1QscUJBQWFLLFdBQTVDO0FBQ0EsTUFBTUs7QUFBNEI7QUFBQSxFQUFHLENBQ2pDVixxQkFBYUcsRUFEb0IsRUFFakNILHFCQUFhSSxRQUZvQixDQUFyQzs7QUFvQkE7QUFDQSxNQUFNTyxXQUFXLEdBQUcsQ0FBQ0M7QUFBRDtBQUFBLEtBQTRDO0FBQzVELEdBQUNBLFVBQVUsSUFBSUMsbUJBQWYsRUFBa0NDLFFBQWxDLENBQTJDO0FBQUNDLElBQUFBLE1BQU0sRUFBRTtBQUFULEdBQTNDO0FBQ0gsQ0FGRCxDLENBSUE7QUFDQTs7O0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsQ0FBQ0M7QUFBRDtBQUFBLEtBQTRCO0FBQ3JELHNCQUFPLDZCQUFDLGtEQUFEO0FBQStCLElBQUEsS0FBSztBQUFwQyxrQkFDSCw2QkFBQyw4Q0FBRDtBQUNJLElBQUEsS0FBSyxFQUFFLHlCQUFHLHNCQUFILENBRFg7QUFFSSxJQUFBLGFBQWEsRUFBQyxzQkFGbEI7QUFHSSxJQUFBLE9BQU8sRUFBR0MsQ0FBRCxJQUFPO0FBQ1pBLE1BQUFBLENBQUMsQ0FBQ0MsY0FBRjtBQUNBRCxNQUFBQSxDQUFDLENBQUNFLGVBQUY7QUFDQUgsTUFBQUEsVUFBVTs7QUFDVkosMEJBQWtCQyxRQUFsQixDQUEyQjtBQUFDQyxRQUFBQSxNQUFNLEVBQUU7QUFBVCxPQUEzQjtBQUNIO0FBUkwsSUFERyxlQVdILDZCQUFDLDhDQUFEO0FBQ0ksSUFBQSxLQUFLLEVBQUUseUJBQUcsZUFBSCxDQURYO0FBRUksSUFBQSxhQUFhLEVBQUMseUJBRmxCO0FBR0ksSUFBQSxPQUFPLEVBQUdHLENBQUQsSUFBTztBQUNaQSxNQUFBQSxDQUFDLENBQUNDLGNBQUY7QUFDQUQsTUFBQUEsQ0FBQyxDQUFDRSxlQUFGO0FBQ0FILE1BQUFBLFVBQVU7O0FBQ1ZKLDBCQUFrQlEsSUFBbEIsQ0FBdUJDLGdCQUFPQyxXQUE5QjtBQUNIO0FBUkwsSUFYRyxDQUFQO0FBc0JILENBdkJEOztBQXlCQSxNQUFNQztBQUFpQztBQUFBLEVBQUc7QUFDdEMsR0FBQ3hCLHFCQUFhQyxNQUFkLEdBQXVCO0FBQ25Cd0IsSUFBQUEsWUFBWSxFQUFFLDBCQUFJLFNBQUosQ0FESztBQUVuQkMsSUFBQUEsUUFBUSxFQUFFLElBRlM7QUFHbkJDLElBQUFBLGFBQWEsRUFBRTtBQUhJLEdBRGU7QUFNdEMsR0FBQzNCLHFCQUFhRSxTQUFkLEdBQTBCO0FBQ3RCdUIsSUFBQUEsWUFBWSxFQUFFLDBCQUFJLFlBQUosQ0FEUTtBQUV0QkMsSUFBQUEsUUFBUSxFQUFFLEtBRlk7QUFHdEJDLElBQUFBLGFBQWEsRUFBRTtBQUhPLEdBTlk7QUFXdEMsR0FBQzNCLHFCQUFhRyxFQUFkLEdBQW1CO0FBQ2ZzQixJQUFBQSxZQUFZLEVBQUUsMEJBQUksUUFBSixDQURDO0FBRWZDLElBQUFBLFFBQVEsRUFBRSxLQUZLO0FBR2ZDLElBQUFBLGFBQWEsRUFBRSxLQUhBO0FBSWZDLElBQUFBLFlBQVksRUFBRSwwQkFBSSxZQUFKLENBSkMsQ0FLZjtBQUNBOztBQU5lLEdBWG1CO0FBbUJ0QyxHQUFDNUIscUJBQWFJLFFBQWQsR0FBeUI7QUFDckJxQixJQUFBQSxZQUFZLEVBQUUsMEJBQUksT0FBSixDQURPO0FBRXJCQyxJQUFBQSxRQUFRLEVBQUUsS0FGVztBQUdyQkMsSUFBQUEsYUFBYSxFQUFFLEtBSE07QUFJckJDLElBQUFBLFlBQVksRUFBRSwwQkFBSSxVQUFKLENBSk87QUFLckJDLElBQUFBLGtCQUFrQixFQUFFLENBQUNaO0FBQUQ7QUFBQSxTQUE0QjtBQUM1QyxVQUFJYSxvQkFBV0MsUUFBWCxDQUFvQkMsV0FBeEIsRUFBcUM7QUFDakMsY0FBTUMsV0FBVyxHQUFHSCxvQkFBV0MsUUFBWCxDQUFvQkMsV0FBcEIsQ0FBZ0NFLFlBQWhDLENBQTZDQyxpQkFBN0MsQ0FBK0RDLGlCQUFVQyxVQUF6RSxFQUNoQkMsaUNBQWdCQyxHQUFoQixHQUFzQkMsU0FBdEIsRUFEZ0IsQ0FBcEI7O0FBR0EsNEJBQU8sNkJBQUMsa0RBQUQ7QUFBK0IsVUFBQSxLQUFLO0FBQXBDLHdCQUNILDZCQUFDLDhDQUFEO0FBQ0ksVUFBQSxLQUFLLEVBQUUseUJBQUcsaUJBQUgsQ0FEWDtBQUVJLFVBQUEsYUFBYSxFQUFDLHNCQUZsQjtBQUdJLFVBQUEsT0FBTyxFQUFHdEIsQ0FBRCxJQUFPO0FBQ1pBLFlBQUFBLENBQUMsQ0FBQ0MsY0FBRjtBQUNBRCxZQUFBQSxDQUFDLENBQUNFLGVBQUY7QUFDQUgsWUFBQUEsVUFBVTtBQUNWLDBDQUFrQnFCLGlDQUFnQkMsR0FBaEIsRUFBbEIsRUFBeUNULG9CQUFXQyxRQUFYLENBQW9CQyxXQUE3RDtBQUNILFdBUkw7QUFTSSxVQUFBLFFBQVEsRUFBRSxDQUFDQyxXQVRmO0FBVUksVUFBQSxPQUFPLEVBQUVBLFdBQVcsR0FBR1EsU0FBSCxHQUNkLHlCQUFHLCtEQUFIO0FBWFYsVUFERyxlQWNILDZCQUFDLDhDQUFEO0FBQ0ksVUFBQSxLQUFLLEVBQUUseUJBQUcsbUJBQUgsQ0FEWDtBQUVJLFVBQUEsYUFBYSxFQUFDLHNCQUZsQjtBQUdJLFVBQUEsT0FBTyxFQUFHdkIsQ0FBRCxJQUFPO0FBQ1pBLFlBQUFBLENBQUMsQ0FBQ0MsY0FBRjtBQUNBRCxZQUFBQSxDQUFDLENBQUNFLGVBQUY7QUFDQUgsWUFBQUEsVUFBVTtBQUNWLDZDQUFxQnFCLGlDQUFnQkMsR0FBaEIsRUFBckIsRUFBNENULG9CQUFXQyxRQUFYLENBQW9CQyxXQUFoRTtBQUNILFdBUkw7QUFTSSxVQUFBLFFBQVEsRUFBRSxDQUFDQyxXQVRmO0FBVUksVUFBQSxPQUFPLEVBQUVBLFdBQVcsR0FBR1EsU0FBSCxHQUNkLHlCQUFHLHdEQUFIO0FBWFYsVUFkRyxlQTJCSCw2QkFBQyw4Q0FBRDtBQUNJLFVBQUEsS0FBSyxFQUFFLHlCQUFHLGVBQUgsQ0FEWDtBQUVJLFVBQUEsYUFBYSxFQUFDLHdCQUZsQjtBQUdJLFVBQUEsT0FBTyxFQUFHdkIsQ0FBRCxJQUFPO0FBQ1pBLFlBQUFBLENBQUMsQ0FBQ0MsY0FBRjtBQUNBRCxZQUFBQSxDQUFDLENBQUNFLGVBQUY7QUFDQUgsWUFBQUEsVUFBVTs7QUFDVkosZ0NBQWtCUSxJQUFsQixDQUF1QkMsZ0JBQU9vQixpQkFBOUI7QUFDSDtBQVJMLFVBM0JHLENBQVA7QUFzQ0g7O0FBRUQsMEJBQU8sNkJBQUMsa0RBQUQ7QUFBK0IsUUFBQSxLQUFLO0FBQXBDLHNCQUNILDZCQUFDLDhDQUFEO0FBQ0ksUUFBQSxLQUFLLEVBQUUseUJBQUcsaUJBQUgsQ0FEWDtBQUVJLFFBQUEsYUFBYSxFQUFDLHNCQUZsQjtBQUdJLFFBQUEsT0FBTyxFQUFHeEIsQ0FBRCxJQUFPO0FBQ1pBLFVBQUFBLENBQUMsQ0FBQ0MsY0FBRjtBQUNBRCxVQUFBQSxDQUFDLENBQUNFLGVBQUY7QUFDQUgsVUFBQUEsVUFBVTs7QUFDVkosOEJBQWtCQyxRQUFsQixDQUEyQjtBQUFDQyxZQUFBQSxNQUFNLEVBQUU7QUFBVCxXQUEzQjtBQUNIO0FBUkwsUUFERyxlQVdILDZCQUFDLDhDQUFEO0FBQ0ksUUFBQSxLQUFLLEVBQUU0QixpREFBd0JaLFFBQXhCLENBQWlDYSxzQkFBakMsS0FDRCx5QkFBRyx5QkFBSCxDQURDLEdBRUQseUJBQUcsc0JBQUgsQ0FIVjtBQUlJLFFBQUEsYUFBYSxFQUFDLHlCQUpsQjtBQUtJLFFBQUEsT0FBTyxFQUFHMUIsQ0FBRCxJQUFPO0FBQ1pBLFVBQUFBLENBQUMsQ0FBQ0MsY0FBRjtBQUNBRCxVQUFBQSxDQUFDLENBQUNFLGVBQUY7QUFDQUgsVUFBQUEsVUFBVTs7QUFDVkosOEJBQWtCUSxJQUFsQixDQUF1QkMsZ0JBQU9vQixpQkFBOUI7QUFDSDtBQVZMLFFBWEcsQ0FBUDtBQXdCSDtBQTFFb0IsR0FuQmE7QUErRnRDLEdBQUMxQyxxQkFBYUssV0FBZCxHQUE0QjtBQUN4Qm9CLElBQUFBLFlBQVksRUFBRSwwQkFBSSxjQUFKLENBRFU7QUFFeEJDLElBQUFBLFFBQVEsRUFBRSxLQUZjO0FBR3hCQyxJQUFBQSxhQUFhLEVBQUU7QUFIUyxHQS9GVTtBQW9HdEMsR0FBQzNCLHFCQUFhTSxZQUFkLEdBQTZCO0FBQ3pCbUIsSUFBQUEsWUFBWSxFQUFFLDBCQUFJLGVBQUosQ0FEVztBQUV6QkMsSUFBQUEsUUFBUSxFQUFFLEtBRmU7QUFHekJDLElBQUFBLGFBQWEsRUFBRTtBQUhVLEdBcEdTO0FBMEd0QztBQUNBLEdBQUMzQixxQkFBYVEsUUFBZCxHQUF5QjtBQUNyQmlCLElBQUFBLFlBQVksRUFBRSwwQkFBSSxZQUFKLENBRE87QUFFckJDLElBQUFBLFFBQVEsRUFBRSxLQUZXO0FBR3JCQyxJQUFBQSxhQUFhLEVBQUU7QUFITSxHQTNHYTtBQWlIdEMsR0FBQzNCLHFCQUFhTyxTQUFkLEdBQTBCO0FBQ3RCa0IsSUFBQUEsWUFBWSxFQUFFLDBCQUFJLGlCQUFKLENBRFE7QUFFdEJDLElBQUFBLFFBQVEsRUFBRSxLQUZZO0FBR3RCQyxJQUFBQSxhQUFhLEVBQUU7QUFITztBQWpIWSxDQUExQzs7QUF3SEEsU0FBU2tCLG1CQUFULENBQTZCQztBQUE3QjtBQUFBO0FBQUE7QUFBMkQ7QUFDdkQsTUFBSUEsS0FBSyxDQUFDQyxVQUFOLENBQWlCLElBQWpCLENBQUosRUFBNEI7QUFDeEJELElBQUFBLEtBQUssR0FBR0EsS0FBSyxDQUFDRSxTQUFOLENBQWdCLENBQWhCLENBQVI7QUFDSDs7QUFDRCxTQUFPO0FBQ0h2QixJQUFBQSxZQUFZLEVBQUUsMEJBQUksWUFBSixDQURYO0FBRUh3QixJQUFBQSxlQUFlLEVBQUVILEtBRmQ7QUFHSHBCLElBQUFBLFFBQVEsRUFBRSxLQUhQO0FBSUhDLElBQUFBLGFBQWEsRUFBRTtBQUpaLEdBQVA7QUFNSDs7SUFHb0J1QixRLFdBRHBCLGdEQUFxQixzQkFBckIsQyx5QkFBRCxNQUNxQkEsUUFEckIsU0FDc0NDLGVBQU1DO0FBRDVDO0FBQzBFO0FBTXRFQyxFQUFBQSxXQUFXLENBQUNDO0FBQUQ7QUFBQSxJQUFnQjtBQUN2QixVQUFNQSxLQUFOO0FBRHVCO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUVBK0JLLE1BQU07QUFDbEMsV0FBS0MsUUFBTCxDQUFjO0FBQ1ZDLFFBQUFBLGFBQWEsRUFBRUMsdUJBQWNDLFNBQWQ7QUFETCxPQUFkO0FBR0gsS0FuQzBCO0FBQUEsb0RBZ0RSLENBQUNDO0FBQUQ7QUFBQSxTQUE0QjtBQUMzQyxVQUFJQSxPQUFPLENBQUM1QyxNQUFSLEtBQW1CTyxnQkFBT3NDLGFBQTlCLEVBQTZDO0FBQ3pDLGNBQU1DLG9CQUFvQixHQUFHRixPQUE3Qjs7QUFDQSxjQUFNSCxhQUFhLEdBQUdDLHVCQUFjQyxTQUFkLEVBQXRCOztBQUNBLGNBQU1JLElBQUksR0FBRyxLQUFLQyxZQUFMLENBQWtCUCxhQUFsQixFQUFpQ0ssb0JBQW9CLENBQUNHLEtBQXRELEVBQTZESCxvQkFBb0IsQ0FBQ0ksTUFBbEYsQ0FBYjs7QUFDQSxZQUFJSCxJQUFKLEVBQVU7QUFDTkksOEJBQUlwRCxRQUFKLENBQWE7QUFDVEMsWUFBQUEsTUFBTSxFQUFFLFdBREM7QUFFVG9ELFlBQUFBLE9BQU8sRUFBRUwsSUFBSSxDQUFDTSxNQUZMO0FBR1RDLFlBQUFBLGNBQWMsRUFBRSxJQUhQLENBR2E7O0FBSGIsV0FBYjtBQUtIO0FBQ0osT0FYRCxNQVdPLElBQUlWLE9BQU8sQ0FBQzVDLE1BQVIsS0FBbUJPLGdCQUFPZ0Qsa0JBQTlCLEVBQWtEO0FBQ3JELGFBQUtDLHFCQUFMO0FBQ0EsYUFBS0MsV0FBTDtBQUNIO0FBQ0osS0FoRTBCO0FBQUEsd0RBa0VKLENBQUNKO0FBQUQ7QUFBQSxNQUFpQko7QUFBakI7QUFBQSxNQUFnQ0MsTUFBTSxHQUFHLEtBQXpDLEtBQW1EO0FBQ3RFLFlBQU1RLEtBQUssR0FBR0MsdUJBQWMzQyxRQUFkLENBQXVCNEMsWUFBckM7QUFDQSxZQUFNQztBQUFhO0FBQUEsUUFBRyxFQUF0QjtBQUNBN0UsTUFBQUEsU0FBUyxDQUFDOEUsT0FBVixDQUFrQkMsQ0FBQyxJQUFJO0FBQ25CLFlBQUlDLFNBQVMsR0FBR04sS0FBSyxDQUFDSyxDQUFELENBQXJCOztBQUVBLFlBQUliLE1BQUosRUFBWTtBQUNSO0FBQ0FjLFVBQUFBLFNBQVMsR0FBR0EsU0FBUyxDQUFDQyxNQUFWLENBQWlCQyxDQUFDLElBQUk7QUFDOUIsa0JBQU1DLEtBQUssR0FBR0MsdURBQTJCcEQsUUFBM0IsQ0FBb0NxRCxZQUFwQyxDQUFpREgsQ0FBakQsQ0FBZDs7QUFDQSxtQkFBT0MsS0FBSyxDQUFDcEIsSUFBTixDQUFXTSxNQUFYLEtBQXNCQSxNQUF0QixJQUFnQ2MsS0FBSyxDQUFDRyxRQUE3QztBQUNILFdBSFcsQ0FBWjtBQUlIOztBQUVEVCxRQUFBQSxLQUFLLENBQUNVLElBQU4sQ0FBVyxHQUFHUCxTQUFkO0FBQ0gsT0FaRDtBQWNBLFlBQU1RLFlBQVksR0FBR1gsS0FBSyxDQUFDWSxTQUFOLENBQWdCUCxDQUFDLElBQUlBLENBQUMsQ0FBQ2IsTUFBRixLQUFhQSxNQUFsQyxDQUFyQixDQWpCc0UsQ0FrQnRFOztBQUNBLFlBQU0sQ0FBQ04sSUFBRCxJQUFTYyxLQUFLLENBQUNhLEtBQU4sQ0FBWSxDQUFDRixZQUFZLEdBQUd2QixLQUFoQixJQUF5QlksS0FBSyxDQUFDYyxNQUEzQyxDQUFmO0FBQ0EsYUFBTzVCLElBQVA7QUFDSCxLQXZGMEI7QUFBQSxnRUF5RkksQ0FBQzZCO0FBQUQ7QUFBQSxTQUF5QztBQUNwRSxXQUFLcEMsUUFBTCxDQUFjO0FBQUVvQyxRQUFBQTtBQUFGLE9BQWQ7QUFDSCxLQTNGMEI7QUFBQSx1REE2RkwsTUFBTTtBQUN4QixZQUFNQyxRQUFRLEdBQUdsQix1QkFBYzNDLFFBQWQsQ0FBdUI0QyxZQUF4Qzs7QUFDQSxVQUFJa0IsdUJBQWNDLFFBQWQsQ0FBdUIseUJBQXZCLENBQUosRUFBdUQ7QUFDbkQ7QUFDQUMsUUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQVksV0FBWixFQUF5QkosUUFBekI7QUFDSDs7QUFFRCxZQUFNSyxlQUFlLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUtqQixLQUFMLENBQVdrQixRQUF2QixDQUF4QjtBQUNBLFlBQU1DLFVBQVUsR0FBR0gsTUFBTSxDQUFDQyxJQUFQLENBQVlQLFFBQVosRUFBc0JaLE1BQXRCLENBQTZCRixDQUFDLElBQUk7QUFDakQsWUFBSSxDQUFDLHlCQUFZQSxDQUFaLENBQUwsRUFBcUIsT0FBTyxJQUFQLENBRDRCLENBQ2Y7QUFFbEM7O0FBQ0EsZUFBT3dCLDRCQUFtQkMsT0FBbkIsR0FBNkJ6QixDQUE3QixDQUFQO0FBQ0gsT0FMa0IsQ0FBbkI7QUFPQSxZQUFNMEIsZUFBZSxHQUFHLENBQUMsQ0FBQzlCLHVCQUFjM0MsUUFBZCxDQUF1QjBFLDJCQUF2QixFQUExQjtBQUNBLFVBQUlDLFFBQVEsR0FBRyxLQUFLeEIsS0FBTCxDQUFXc0IsZUFBWCxLQUErQkEsZUFBL0IsSUFBa0QsMEJBQWFQLGVBQWIsRUFBOEJJLFVBQTlCLENBQWpFOztBQUNBLFVBQUksQ0FBQ0ssUUFBTCxFQUFlO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsYUFBSyxNQUFNNUQsS0FBWCxJQUFvQnVELFVBQXBCLEVBQWdDO0FBQzVCLGdCQUFNTSxRQUFRLEdBQUcsS0FBS3pCLEtBQUwsQ0FBV2tCLFFBQVgsQ0FBb0J0RCxLQUFwQixDQUFqQjtBQUNBLGdCQUFNOEQsUUFBUSxHQUFHaEIsUUFBUSxDQUFDOUMsS0FBRCxDQUF6Qjs7QUFDQSxjQUFJNkQsUUFBUSxDQUFDakIsTUFBVCxLQUFvQmtCLFFBQVEsQ0FBQ2xCLE1BQWpDLEVBQXlDO0FBQ3JDZ0IsWUFBQUEsUUFBUSxHQUFHLElBQVg7QUFDQTtBQUNIO0FBQ0o7QUFDSjs7QUFFRCxVQUFJQSxRQUFKLEVBQWM7QUFDVjtBQUNBO0FBQ0E7QUFDQSxjQUFNRyxXQUFXLEdBQUcsNkJBQWVqQixRQUFmLEVBQXlCUyxVQUF6QixDQUFwQjtBQUNBLGNBQU1ELFFBQVEsR0FBRyxpQ0FBbUJTLFdBQW5CLEVBQWdDLENBQUNDLENBQUQsRUFBSUMsQ0FBSixLQUFVLDRCQUFlQSxDQUFmLENBQTFDLENBQWpCO0FBRUEsYUFBS3hELFFBQUwsQ0FBYztBQUFDNkMsVUFBQUEsUUFBRDtBQUFXSSxVQUFBQTtBQUFYLFNBQWQsRUFBMkMsTUFBTTtBQUM3QyxlQUFLbEQsS0FBTCxDQUFXMEQsUUFBWDtBQUNILFNBRkQ7QUFHSDtBQUNKLEtBdkkwQjtBQUFBLHVEQXlJTCxNQUFNO0FBQ3hCLFlBQU1DLFdBQVcsR0FBR3ZDLHVCQUFjM0MsUUFBZCxDQUF1QjBFLDJCQUF2QixJQUFzRFMsTUFBMUU7O0FBQ0FoRCwwQkFBSXBELFFBQUosQ0FBYTtBQUFFQyxRQUFBQSxNQUFNLEVBQUUsa0JBQVY7QUFBOEJrRyxRQUFBQTtBQUE5QixPQUFiO0FBQ0gsS0E1STBCO0FBQUEscURBOElQLE1BQU07QUFDdEIsWUFBTUEsV0FBVyxHQUFHdkMsdUJBQWMzQyxRQUFkLENBQXVCMEUsMkJBQXZCLElBQXNEUyxNQUExRTs7QUFDQWhELDBCQUFJcEQsUUFBSixDQUFhO0FBQUVDLFFBQUFBLE1BQU0sRUFBRU8sZ0JBQU9vQixpQkFBakI7QUFBb0N1RSxRQUFBQTtBQUFwQyxPQUFiO0FBQ0gsS0FqSjBCO0FBQUEsOERBbUpFLE1BQU07QUFDL0IsWUFBTUEsV0FBVyxHQUFHdkMsdUJBQWMzQyxRQUFkLENBQXVCMEUsMkJBQXZCLElBQXNEUyxNQUExRTtBQUNBLGtDQUFnQixLQUFLNUQsS0FBTCxDQUFXdEIsV0FBM0IsRUFBd0NpRixXQUF4QztBQUNILEtBdEowQjtBQUd2QixTQUFLL0IsS0FBTCxHQUFhO0FBQ1RrQixNQUFBQSxRQUFRLEVBQUUsRUFERDtBQUVUSSxNQUFBQSxlQUFlLEVBQUUsQ0FBQyxDQUFDOUIsdUJBQWMzQyxRQUFkLENBQXVCMEUsMkJBQXZCLEVBRlY7QUFHVGQsTUFBQUEsY0FBYyxFQUFFN0Qsb0JBQVdDLFFBQVgsQ0FBb0I0RDtBQUgzQixLQUFiLENBSHVCLENBU3ZCOztBQUNBLFNBQUt3QixhQUFMLEdBQXFCLGlDQUFtQjNGLGNBQW5CLENBQXJCO0FBQ0EsU0FBSytDLHFCQUFMO0FBQ0g7O0FBRU02QyxFQUFBQSxpQkFBUDtBQUFBO0FBQWlDO0FBQzdCLFNBQUtDLGFBQUwsR0FBcUJ4RyxvQkFBa0J5RyxRQUFsQixDQUEyQixLQUFLQyxRQUFoQyxDQUFyQjtBQUNBLFNBQUtDLGNBQUwsR0FBc0IvRCx1QkFBY2dFLFdBQWQsQ0FBMEIsS0FBS0MscUJBQS9CLENBQXRCOztBQUNBNUYsd0JBQVdDLFFBQVgsQ0FBb0I0RixFQUFwQixDQUF1QkMsMkJBQXZCLEVBQXdDLEtBQUtDLG9CQUE3Qzs7QUFDQW5ELDJCQUFjM0MsUUFBZCxDQUF1QjRGLEVBQXZCLENBQTBCRyxpQ0FBMUIsRUFBOEMsS0FBS3RELFdBQW5EOztBQUNBLFNBQUt1RCxpQkFBTCxHQUF5QnpCLDRCQUFtQm1CLFdBQW5CLENBQStCLEtBQUtqRCxXQUFwQyxDQUF6QjtBQUNBLFNBQUtBLFdBQUwsR0FONkIsQ0FNVDtBQUN2Qjs7QUFFTXdELEVBQUFBLG9CQUFQLEdBQThCO0FBQzFCbEcsd0JBQVdDLFFBQVgsQ0FBb0JrRyxHQUFwQixDQUF3QkwsMkJBQXhCLEVBQXlDLEtBQUtDLG9CQUE5Qzs7QUFDQW5ELDJCQUFjM0MsUUFBZCxDQUF1QmtHLEdBQXZCLENBQTJCSCxpQ0FBM0IsRUFBK0MsS0FBS3RELFdBQXBEOztBQUNBM0Qsd0JBQWtCcUgsVUFBbEIsQ0FBNkIsS0FBS2IsYUFBbEM7O0FBQ0EsUUFBSSxLQUFLVSxpQkFBVCxFQUE0QixLQUFLQSxpQkFBTCxDQUF1QkksTUFBdkI7QUFDNUIsUUFBSSxLQUFLWCxjQUFULEVBQXlCLEtBQUtBLGNBQUwsQ0FBb0JXLE1BQXBCO0FBQzVCOztBQVFPNUQsRUFBQUEscUJBQVIsR0FBZ0M7QUFDNUIsVUFBTTZELGVBQWUsR0FBRyxpQ0FBbUI1RyxjQUFjLENBQUN4QixxQkFBYUcsRUFBZCxDQUFqQyxDQUF4Qjs7QUFDQSxRQUFJa0kscUJBQVlDLGNBQVosR0FBNkJDLHVCQUE3QixFQUFKLEVBQTREO0FBQ3hESCxNQUFBQSxlQUFlLENBQUN2RyxrQkFBaEIsR0FBcUNiLG9CQUFyQztBQUNILEtBRkQsTUFFTztBQUNIb0gsTUFBQUEsZUFBZSxDQUFDSSxTQUFoQixHQUE0QjdILFdBQTVCO0FBQ0g7O0FBRUQsU0FBS3dHLGFBQUwsQ0FBbUJuSCxxQkFBYUcsRUFBaEMsSUFBc0NpSSxlQUF0QztBQUNIOztBQTBHT0ssRUFBQUEsb0JBQVI7QUFBQTtBQUEwRTtBQUN0RSxXQUFPLEtBQUt2RCxLQUFMLENBQVdTLGNBQVgsQ0FBMEIrQyxHQUExQixDQUE4QjVFLElBQUksSUFBSTtBQUN6QyxZQUFNNkUsSUFBSSxHQUFHN0UsSUFBSSxDQUFDNkUsSUFBTCxJQUFhN0UsSUFBSSxDQUFDOEUsZUFBbEIsSUFBcUM5RSxJQUFJLENBQUMrRSxPQUFMLEdBQWUsQ0FBZixDQUFyQyxJQUEwRCx5QkFBRyxZQUFILENBQXZFOztBQUNBLFlBQU1DLE1BQU0sZ0JBQ1IsNkJBQUMsbUJBQUQ7QUFDSSxRQUFBLE9BQU8sRUFBRTtBQUNMSCxVQUFBQSxJQURLO0FBRUxJLFVBQUFBLFNBQVMsRUFBRWpGLElBQUksQ0FBQ2tGO0FBRlgsU0FEYjtBQUtJLFFBQUEsS0FBSyxFQUFFLEVBTFg7QUFNSSxRQUFBLE1BQU0sRUFBRSxFQU5aO0FBT0ksUUFBQSxZQUFZLEVBQUM7QUFQakIsUUFESjs7QUFXQSxZQUFNQyxRQUFRLEdBQUcsTUFBTTtBQUNuQnBJLDRCQUFrQkMsUUFBbEIsQ0FBMkI7QUFDdkJDLFVBQUFBLE1BQU0sRUFBRSxXQURlO0FBRXZCb0QsVUFBQUEsT0FBTyxFQUFFTCxJQUFJLENBQUNLLE9BRlM7QUFHdkIrRSxVQUFBQSxPQUFPLEVBQUU7QUFDTEgsWUFBQUEsU0FBUyxFQUFFakYsSUFBSSxDQUFDa0YsVUFEWDtBQUVMTCxZQUFBQTtBQUZLO0FBSGMsU0FBM0I7QUFRSCxPQVREOztBQVVBLDBCQUNJLDZCQUFDLGtCQUFEO0FBQ0ksUUFBQSxXQUFXLEVBQUUsS0FBS3JGLEtBQUwsQ0FBVzZGLFdBRDVCO0FBRUksUUFBQSxVQUFVLEVBQUUsS0FBS2pFLEtBQUwsQ0FBVzFCLGFBQVgsS0FBNkJNLElBQUksQ0FBQ0ssT0FGbEQ7QUFHSSxRQUFBLFdBQVcsRUFBRXdFLElBSGpCO0FBSUksUUFBQSxNQUFNLEVBQUVHLE1BSlo7QUFLSSxRQUFBLE9BQU8sRUFBRUcsUUFMYjtBQU1JLFFBQUEsR0FBRyxFQUFHLHFCQUFvQm5GLElBQUksQ0FBQ0ssT0FBUTtBQU4zQyxRQURKO0FBVUgsS0FqQ00sQ0FBUDtBQWtDSDs7QUFFT2lGLEVBQUFBLHNCQUFSO0FBQUE7QUFBNEU7QUFDeEU7QUFDQTtBQUNBLFdBQU85RyxpQ0FBZ0JDLEdBQWhCLEdBQXNCOEcsU0FBdEIsR0FBa0NyRSxNQUFsQyxDQUF5Q3NFLENBQUMsSUFBSTtBQUNqRCxhQUFPQSxDQUFDLENBQUNDLFlBQUYsS0FBbUIsUUFBMUI7QUFDSCxLQUZNLEVBRUpiLEdBRkksQ0FFQVksQ0FBQyxJQUFJO0FBQ1IsWUFBTVIsTUFBTSxnQkFDUiw2QkFBQyxvQkFBRDtBQUNJLFFBQUEsT0FBTyxFQUFFUSxDQUFDLENBQUNFLE9BRGY7QUFFSSxRQUFBLFNBQVMsRUFBRUYsQ0FBQyxDQUFDWCxJQUZqQjtBQUdJLFFBQUEsY0FBYyxFQUFFVyxDQUFDLENBQUNQLFNBSHRCO0FBSUksUUFBQSxLQUFLLEVBQUUsRUFKWDtBQUllLFFBQUEsTUFBTSxFQUFFLEVBSnZCO0FBSTJCLFFBQUEsWUFBWSxFQUFDO0FBSnhDLFFBREo7O0FBUUEsWUFBTVUsU0FBUyxHQUFHLE1BQU07QUFDcEI1SSw0QkFBa0JDLFFBQWxCLENBQTJCO0FBQ3ZCQyxVQUFBQSxNQUFNLEVBQUUsWUFEZTtBQUV2QjJJLFVBQUFBLFFBQVEsRUFBRUosQ0FBQyxDQUFDRTtBQUZXLFNBQTNCO0FBSUgsT0FMRDs7QUFNQSwwQkFDSSw2QkFBQyxrQkFBRDtBQUNJLFFBQUEsV0FBVyxFQUFFLEtBQUtsRyxLQUFMLENBQVc2RixXQUQ1QjtBQUVJLFFBQUEsVUFBVSxFQUFFLEtBRmhCO0FBR0ksUUFBQSxXQUFXLEVBQUVHLENBQUMsQ0FBQ1gsSUFIbkI7QUFJSSxRQUFBLE1BQU0sRUFBRUcsTUFKWjtBQUtJLFFBQUEsaUJBQWlCLEVBQUVhLGlEQUF3QkMsZUFML0M7QUFNSSxRQUFBLE9BQU8sRUFBRUgsU0FOYjtBQU9JLFFBQUEsR0FBRyxFQUFHLHNCQUFxQkgsQ0FBQyxDQUFDRSxPQUFRO0FBUHpDLFFBREo7QUFXSCxLQTVCTSxDQUFQO0FBNkJIOztBQUVPSyxFQUFBQSxjQUFSO0FBQUE7QUFBK0M7QUFDM0M7QUFDQSxVQUFNQyxZQUFZLEdBQUcsQ0FBQyxLQUFLNUUsS0FBTCxDQUFXc0IsZUFBWixJQUNqQk4sTUFBTSxDQUFDNkQsTUFBUCxDQUFjckYsdUJBQWMzQyxRQUFkLENBQXVCaUksZUFBckMsRUFBc0RDLEtBQXRELENBQTREQyxJQUFJLElBQUksQ0FBQ0EsSUFBSSxFQUFFeEUsTUFBM0UsQ0FESjtBQUdBLFdBQU8zRixTQUFTLENBQUNvSyxNQUFWLENBQWlCLENBQUNDLElBQUQsRUFBT3RILEtBQVAsS0FBaUI7QUFDckMsVUFBSUEsS0FBSyxLQUFLckMsc0JBQWQsRUFBc0M7QUFDbEMsY0FBTTRKLFVBQVUsR0FBR25FLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUtqQixLQUFMLENBQVdrQixRQUF2QixFQUNkcEIsTUFEYyxDQUNQbEMsS0FBSyxJQUFJLHlCQUFZQSxLQUFaLENBREYsQ0FBbkI7QUFFQXNILFFBQUFBLElBQUksQ0FBQzlFLElBQUwsQ0FBVSxHQUFHK0UsVUFBYjtBQUNIOztBQUNERCxNQUFBQSxJQUFJLENBQUM5RSxJQUFMLENBQVV4QyxLQUFWO0FBQ0EsYUFBT3NILElBQVA7QUFDSCxLQVJNLEVBUUosRUFSSSxFQVNGMUIsR0FURSxDQVNFNEIsWUFBWSxJQUFJO0FBQ2pCLFVBQUlDLFVBQVUsR0FBRyxJQUFqQjs7QUFDQSxVQUFJRCxZQUFZLEtBQUt0SyxxQkFBYUMsTUFBbEMsRUFBMEM7QUFDdENzSyxRQUFBQSxVQUFVLEdBQUcsS0FBS25CLHNCQUFMLEVBQWI7QUFDSCxPQUZELE1BRU8sSUFBSWtCLFlBQVksS0FBS3RLLHFCQUFhTyxTQUFsQyxFQUE2QztBQUNoRGdLLFFBQUFBLFVBQVUsR0FBRyxLQUFLOUIsb0JBQUwsRUFBYjtBQUNIOztBQUVELFlBQU0rQjtBQUEwQjtBQUFBLFFBQUcseUJBQVlGLFlBQVosSUFDN0J6SCxtQkFBbUIsQ0FBQ3lILFlBQUQsQ0FEVSxHQUU3QixLQUFLbkQsYUFBTCxDQUFtQm1ELFlBQW5CLENBRk47QUFHQSxVQUFJLENBQUNFLFVBQUwsRUFBaUIsTUFBTSxJQUFJQyxLQUFKLENBQVcsT0FBTUgsWUFBYSwyQkFBOUIsQ0FBTixDQVhBLENBYWpCO0FBQ0E7O0FBQ0EsMEJBQU8sNkJBQUMsb0JBQUQ7QUFDSCxRQUFBLEdBQUcsRUFBRyxXQUFVQSxZQUFhLEVBRDFCO0FBRUgsUUFBQSxLQUFLLEVBQUVBLFlBRko7QUFHSCxRQUFBLFFBQVEsRUFBRSxJQUhQO0FBSUgsUUFBQSxhQUFhLEVBQUVFLFVBQVUsQ0FBQzdJLGFBSnZCO0FBS0gsUUFBQSxLQUFLLEVBQUU2SSxVQUFVLENBQUN2SCxlQUFYLEdBQTZCdUgsVUFBVSxDQUFDdkgsZUFBeEMsR0FBMEQseUJBQUd1SCxVQUFVLENBQUMvSSxZQUFkLENBTDlEO0FBTUgsUUFBQSxTQUFTLEVBQUUrSSxVQUFVLENBQUNoQyxTQU5uQjtBQU9ILFFBQUEsWUFBWSxFQUFFZ0MsVUFBVSxDQUFDNUksWUFBWCxHQUEwQix5QkFBRzRJLFVBQVUsQ0FBQzVJLFlBQWQsQ0FBMUIsR0FBd0Q0SSxVQUFVLENBQUM1SSxZQVA5RTtBQVFILFFBQUEsa0JBQWtCLEVBQUU0SSxVQUFVLENBQUMzSSxrQkFSNUI7QUFTSCxRQUFBLFdBQVcsRUFBRSxLQUFLeUIsS0FBTCxDQUFXNkYsV0FUckI7QUFVSCxRQUFBLFFBQVEsRUFBRSxLQUFLN0YsS0FBTCxDQUFXMEQsUUFWbEI7QUFXSCxRQUFBLFlBQVksRUFBRThDLFlBWFg7QUFZSCxRQUFBLFVBQVUsRUFBRVMsVUFaVDtBQWFILFFBQUEsY0FBYyxFQUFFLEtBQUtqSCxLQUFMLENBQVdvSCxjQWJ4QjtBQWNILFFBQUEsYUFBYSxFQUFFaEssbUJBQW1CLENBQUNpSyxRQUFwQixDQUE2QkwsWUFBN0I7QUFkWixRQUFQO0FBZ0JILEtBeENFLENBQVA7QUF5Q0g7O0FBRU1NLEVBQUFBLE1BQVAsR0FBZ0I7QUFDWixVQUFNQyxHQUFHLEdBQUd2SSxpQ0FBZ0JDLEdBQWhCLEVBQVo7O0FBQ0EsVUFBTXVJLE1BQU0sR0FBR0QsR0FBRyxDQUFDckksU0FBSixFQUFmO0FBRUEsUUFBSXVJO0FBQTBCO0FBQTlCOztBQUNBLFFBQUksQ0FBQyxLQUFLekgsS0FBTCxDQUFXNkYsV0FBaEIsRUFBNkI7QUFDekIsVUFBSSxLQUFLakUsS0FBTCxDQUFXc0IsZUFBZixFQUFnQztBQUM1QnVFLFFBQUFBLGFBQWEsZ0JBQUc7QUFBSyxVQUFBLFNBQVMsRUFBQztBQUFmLHdCQUNaLDBDQUFNLHlCQUFHLG9DQUFILENBQU4sQ0FEWSxlQUVaLDZCQUFDLHlCQUFEO0FBQ0ksVUFBQSxTQUFTLEVBQUMscUNBRGQ7QUFFSSxVQUFBLElBQUksRUFBQyxNQUZUO0FBR0ksVUFBQSxPQUFPLEVBQUUsS0FBS0M7QUFIbEIsV0FLSyx5QkFBRyxrQkFBSCxDQUxMLENBRlksZUFTWiw2QkFBQyx5QkFBRDtBQUNJLFVBQUEsU0FBUyxFQUFDLG1DQURkO0FBRUksVUFBQSxJQUFJLEVBQUMsTUFGVDtBQUdJLFVBQUEsT0FBTyxFQUFFLEtBQUtDO0FBSGxCLFdBS00sS0FBSzNILEtBQUwsQ0FBV3RCLFdBQVgsR0FBeUIseUJBQUcsZUFBSCxDQUF6QixHQUErQyx5QkFBRywwQkFBSCxDQUxyRCxDQVRZLENBQWhCO0FBaUJILE9BbEJELE1Ba0JPLElBQ0gsS0FBS3NCLEtBQUwsQ0FBV3RCLFdBQVgsRUFBd0JrSixTQUF4QixDQUFrQ0osTUFBbEMsS0FBNkMsS0FBS3hILEtBQUwsQ0FBV3RCLFdBQVgsRUFBd0JtSixlQUF4QixPQUE4QyxNQUR4RixFQUVMO0FBQ0VKLFFBQUFBLGFBQWEsZ0JBQUc7QUFBSyxVQUFBLFNBQVMsRUFBQztBQUFmLHdCQUNaLDBDQUFPLHlCQUFHLGVBQUgsQ0FBUCxDQURZLEVBRVYsS0FBS3pILEtBQUwsQ0FBV3RCLFdBQVgsQ0FBdUJrSixTQUF2QixDQUFpQ0osTUFBakMsa0JBQTRDLDZCQUFDLHlCQUFEO0FBQzFDLFVBQUEsU0FBUyxFQUFDLHVDQURnQztBQUUxQyxVQUFBLE9BQU8sRUFBRSxLQUFLTTtBQUY0QixXQUl6Qyx5QkFBRyxlQUFILENBSnlDLENBRmxDLEVBUVYsS0FBSzlILEtBQUwsQ0FBV3RCLFdBQVgsQ0FBdUJtSixlQUF2QixPQUE2QyxNQUE3QyxpQkFBdUQsNkJBQUMseUJBQUQ7QUFDckQsVUFBQSxTQUFTLEVBQUMsd0NBRDJDO0FBRXJELFVBQUEsT0FBTyxFQUFFLEtBQUtGO0FBRnVDLFdBSXBELHlCQUFHLGVBQUgsQ0FKb0QsQ0FSN0MsQ0FBaEI7QUFlSCxPQWxCTSxNQWtCQSxJQUFJL0UsTUFBTSxDQUFDNkQsTUFBUCxDQUFjLEtBQUs3RSxLQUFMLENBQVdrQixRQUF6QixFQUFtQ2lGLElBQW5DLENBQXdDbkIsSUFBSSxJQUFJQSxJQUFJLENBQUN4RSxNQUFMLEdBQWMsQ0FBOUQsQ0FBSixFQUFzRTtBQUN6RSxjQUFNc0UsZUFBZSxHQUFHdEYsdUJBQWMzQyxRQUFkLENBQXVCaUksZUFBL0M7QUFDQSxjQUFNc0IsZUFBZSxHQUFHdEIsZUFBZSxDQUFDaEsscUJBQWFJLFFBQWQsQ0FBZixJQUEwQyxFQUFsRTtBQUNBLGNBQU1tTCxvQkFBb0IsR0FBR3ZCLGVBQWUsQ0FBQ2hLLHFCQUFhUSxRQUFkLENBQWYsSUFBMEMsRUFBdkU7QUFDQSxjQUFNZ0wsbUJBQW1CLEdBQUd4QixlQUFlLENBQUNoSyxxQkFBYUUsU0FBZCxDQUFmLElBQTJDLEVBQXZFLENBSnlFLENBS3pFOztBQUNBLFlBQUlvTCxlQUFlLENBQUM1RixNQUFoQixHQUF5QixDQUF6QixJQUE4QjZGLG9CQUFvQixHQUFHLENBQXJELElBQTBEQyxtQkFBbUIsR0FBRyxDQUFwRixFQUF1RjtBQUNuRlQsVUFBQUEsYUFBYSxnQkFBRztBQUFLLFlBQUEsU0FBUyxFQUFDO0FBQWYsMEJBQ1osMENBQU0seUJBQUcsNkRBQUgsQ0FBTixDQURZLGVBRVosNkJBQUMseUJBQUQ7QUFDSSxZQUFBLFNBQVMsRUFBQyxxQ0FEZDtBQUVJLFlBQUEsSUFBSSxFQUFDLE1BRlQ7QUFHSSxZQUFBLE9BQU8sRUFBRSxLQUFLQztBQUhsQixhQUtLLHlCQUFHLGtCQUFILENBTEwsQ0FGWSxlQVNaLDZCQUFDLHlCQUFEO0FBQ0ksWUFBQSxTQUFTLEVBQUMsbUNBRGQ7QUFFSSxZQUFBLElBQUksRUFBQyxNQUZUO0FBR0ksWUFBQSxPQUFPLEVBQUUsS0FBS0M7QUFIbEIsYUFLSyx5QkFBRywwQkFBSCxDQUxMLENBVFksQ0FBaEI7QUFpQkg7QUFDSjtBQUNKOztBQUVELFVBQU03RSxRQUFRLEdBQUcsS0FBS3lELGNBQUwsRUFBakI7QUFDQSx3QkFDSSw2QkFBQyxzQ0FBRDtBQUF3QixNQUFBLGFBQWEsRUFBRSxJQUF2QztBQUE2QyxNQUFBLFNBQVMsRUFBRSxLQUFLdkcsS0FBTCxDQUFXbUk7QUFBbkUsT0FDSyxDQUFDO0FBQUNDLE1BQUFBO0FBQUQsS0FBRCxrQkFDRztBQUNJLE1BQUEsT0FBTyxFQUFFLEtBQUtwSSxLQUFMLENBQVdxSSxPQUR4QjtBQUVJLE1BQUEsTUFBTSxFQUFFLEtBQUtySSxLQUFMLENBQVdzSSxNQUZ2QjtBQUdJLE1BQUEsU0FBUyxFQUFFRixnQkFIZjtBQUlJLE1BQUEsU0FBUyxFQUFDLGFBSmQ7QUFLSSxNQUFBLElBQUksRUFBQyxNQUxUO0FBTUksb0JBQVkseUJBQUcsT0FBSDtBQU5oQixPQVFLdEYsUUFSTCxFQVNLMkUsYUFUTCxDQUZSLENBREo7QUFpQkg7O0FBN1dxRSxDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE1LTIwMTgsIDIwMjAsIDIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgUmVhY3RDb21wb25lbnRFbGVtZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBEaXNwYXRjaGVyIH0gZnJvbSBcImZsdXhcIjtcbmltcG9ydCB7IFJvb20gfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbW9kZWxzL3Jvb21cIjtcbmltcG9ydCAqIGFzIGZiRW1pdHRlciBmcm9tIFwiZmJlbWl0dGVyXCI7XG5pbXBvcnQgeyBFdmVudFR5cGUgf