matrix-react-sdk
Version:
SDK for matrix.org using React
306 lines (303 loc) • 60.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = NotificationSettings2;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _newAndImproved = _interopRequireDefault(require("../../../../../res/img/element-icons/new-and-improved.svg"));
var _MatrixClientContext = require("../../../../contexts/MatrixClientContext");
var _useNotificationSettings = require("../../../../hooks/useNotificationSettings");
var _useSettings = require("../../../../hooks/useSettings");
var _languageHandler = require("../../../../languageHandler");
var _NotificationSettings = require("../../../../models/notificationsettings/NotificationSettings");
var _RoomNotifs = require("../../../../RoomNotifs");
var _SettingLevel = require("../../../../settings/SettingLevel");
var _SettingsStore = _interopRequireDefault(require("../../../../settings/SettingsStore"));
var _NotificationLevel = require("../../../../stores/notifications/NotificationLevel");
var _notifications = require("../../../../utils/notifications");
var _AccessibleButton = _interopRequireDefault(require("../../elements/AccessibleButton"));
var _ExternalLink = _interopRequireDefault(require("../../elements/ExternalLink"));
var _LabelledCheckbox = _interopRequireDefault(require("../../elements/LabelledCheckbox"));
var _LabelledToggleSwitch = _interopRequireDefault(require("../../elements/LabelledToggleSwitch"));
var _StyledRadioGroup = _interopRequireDefault(require("../../elements/StyledRadioGroup"));
var _TagComposer = _interopRequireDefault(require("../../elements/TagComposer"));
var _StatelessNotificationBadge = require("../../rooms/NotificationBadge/StatelessNotificationBadge");
var _SettingsBanner = require("../shared/SettingsBanner");
var _SettingsSection = require("../shared/SettingsSection");
var _SettingsSubsection = _interopRequireDefault(require("../shared/SettingsSubsection"));
var _NotificationPusherSettings = require("./NotificationPusherSettings");
var _SettingsFlag = _interopRequireDefault(require("../../elements/SettingsFlag"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /*
Copyright 2024 New Vector Ltd.
Copyright 2023 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
var NotificationDefaultLevels = /*#__PURE__*/function (NotificationDefaultLevels) {
NotificationDefaultLevels["AllMessages"] = "all_messages";
NotificationDefaultLevels["PeopleMentionsKeywords"] = "people_mentions_keywords";
NotificationDefaultLevels["MentionsKeywords"] = "mentions_keywords";
return NotificationDefaultLevels;
}(NotificationDefaultLevels || {});
function toDefaultLevels(levels) {
if (levels.room === _RoomNotifs.RoomNotifState.AllMessages) {
return NotificationDefaultLevels.AllMessages;
} else if (levels.dm === _RoomNotifs.RoomNotifState.AllMessages) {
return NotificationDefaultLevels.PeopleMentionsKeywords;
} else {
return NotificationDefaultLevels.MentionsKeywords;
}
}
function boldText(text) {
return /*#__PURE__*/_react.default.createElement("strong", null, text);
}
function helpLink(sub) {
return /*#__PURE__*/_react.default.createElement(_ExternalLink.default, {
href: "https://element.io/help#settings2"
}, sub);
}
function useHasUnreadNotifications() {
const cli = (0, _MatrixClientContext.useMatrixClientContext)();
return cli.getRooms().some(room => room.getUnreadNotificationCount() > 0);
}
/**
* The new notification settings tab view, only displayed if the user has Features.NotificationSettings2 enabled
*/
function NotificationSettings2() {
const cli = (0, _MatrixClientContext.useMatrixClientContext)();
const desktopNotifications = (0, _useSettings.useSettingValue)("notificationsEnabled");
const desktopShowBody = (0, _useSettings.useSettingValue)("notificationBodyEnabled");
const audioNotifications = (0, _useSettings.useSettingValue)("audioNotificationsEnabled");
const {
model,
hasPendingChanges,
reconcile
} = (0, _useNotificationSettings.useNotificationSettings)(cli);
const disabled = model === null || hasPendingChanges;
const settings = model ?? _NotificationSettings.DefaultNotificationSettings;
const [updatingUnread, setUpdatingUnread] = (0, _react.useState)(false);
const hasUnreadNotifications = useHasUnreadNotifications();
const NotificationOptions = [{
value: NotificationDefaultLevels.AllMessages,
label: (0, _languageHandler._t)("notifications|all_messages")
}, {
value: NotificationDefaultLevels.PeopleMentionsKeywords,
label: (0, _languageHandler._t)("settings|notifications|people_mentions_keywords")
}, {
value: NotificationDefaultLevels.MentionsKeywords,
label: (0, _languageHandler._t)("settings|notifications|mentions_keywords_only")
}];
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_NotificationSettings2"
}, hasPendingChanges && model !== null && /*#__PURE__*/_react.default.createElement(_SettingsBanner.SettingsBanner, {
icon: /*#__PURE__*/_react.default.createElement("img", {
src: _newAndImproved.default,
alt: "",
width: 12
}),
action: (0, _languageHandler._t)("action|proceed"),
onAction: () => reconcile(model)
}, (0, _languageHandler._t)("settings|notifications|labs_notice_prompt", {}, {
strong: boldText,
a: helpLink
})), /*#__PURE__*/_react.default.createElement(_SettingsSection.SettingsSection, null, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsSubsection_content mx_NotificationSettings2_flags"
}, /*#__PURE__*/_react.default.createElement(_LabelledToggleSwitch.default, {
label: (0, _languageHandler._t)("settings|notifications|enable_notifications_account"),
value: !settings.globalMute,
disabled: disabled,
onChange: value => {
reconcile(_objectSpread(_objectSpread({}, model), {}, {
globalMute: !value
}));
}
}), /*#__PURE__*/_react.default.createElement(_LabelledToggleSwitch.default, {
label: (0, _languageHandler._t)("settings|notifications|enable_desktop_notifications_session"),
value: desktopNotifications,
onChange: value => _SettingsStore.default.setValue("notificationsEnabled", null, _SettingLevel.SettingLevel.DEVICE, value)
}), /*#__PURE__*/_react.default.createElement(_LabelledToggleSwitch.default, {
label: (0, _languageHandler._t)("settings|notifications|desktop_notification_message_preview"),
value: desktopShowBody,
onChange: value => _SettingsStore.default.setValue("notificationBodyEnabled", null, _SettingLevel.SettingLevel.DEVICE, value)
}), /*#__PURE__*/_react.default.createElement(_LabelledToggleSwitch.default, {
label: (0, _languageHandler._t)("settings|notifications|enable_audible_notifications_session"),
value: audioNotifications,
onChange: value => _SettingsStore.default.setValue("audioNotificationsEnabled", null, _SettingLevel.SettingLevel.DEVICE, value)
})), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("settings|notifications|default_setting_section"),
description: (0, _languageHandler._t)("settings|notifications|default_setting_description")
}, /*#__PURE__*/_react.default.createElement(_StyledRadioGroup.default, {
name: "defaultNotificationLevel",
value: toDefaultLevels(settings.defaultLevels),
disabled: disabled,
definitions: NotificationOptions,
onChange: value => {
reconcile(_objectSpread(_objectSpread({}, model), {}, {
defaultLevels: _objectSpread(_objectSpread({}, model.defaultLevels), {}, {
dm: value !== NotificationDefaultLevels.MentionsKeywords ? _RoomNotifs.RoomNotifState.AllMessages : _RoomNotifs.RoomNotifState.MentionsOnly,
room: value === NotificationDefaultLevels.AllMessages ? _RoomNotifs.RoomNotifState.AllMessages : _RoomNotifs.RoomNotifState.MentionsOnly
})
}));
}
})), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("settings|notifications|play_sound_for_section"),
description: (0, _languageHandler._t)("settings|notifications|play_sound_for_description")
}, /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, {
label: "People",
value: settings.sound.people !== undefined,
disabled: disabled || settings.defaultLevels.dm === _RoomNotifs.RoomNotifState.MentionsOnly,
onChange: value => {
reconcile(_objectSpread(_objectSpread({}, model), {}, {
sound: _objectSpread(_objectSpread({}, model.sound), {}, {
people: value ? "default" : undefined
})
}));
}
}), /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, {
label: (0, _languageHandler._t)("settings|notifications|mentions_keywords"),
value: settings.sound.mentions !== undefined,
disabled: disabled,
onChange: value => {
reconcile(_objectSpread(_objectSpread({}, model), {}, {
sound: _objectSpread(_objectSpread({}, model.sound), {}, {
mentions: value ? "default" : undefined
})
}));
}
}), /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, {
label: (0, _languageHandler._t)("settings|notifications|voip"),
value: settings.sound.calls !== undefined,
disabled: disabled,
onChange: value => {
reconcile(_objectSpread(_objectSpread({}, model), {}, {
sound: _objectSpread(_objectSpread({}, model.sound), {}, {
calls: value ? "ring" : undefined
})
}));
}
})), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("settings|notifications|other_section")
}, /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, {
label: (0, _languageHandler._t)("settings|notifications|invites"),
value: settings.activity.invite,
disabled: disabled,
onChange: value => {
reconcile(_objectSpread(_objectSpread({}, model), {}, {
activity: _objectSpread(_objectSpread({}, model.activity), {}, {
invite: value
})
}));
}
}), /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, {
label: (0, _languageHandler._t)("settings|notifications|room_activity"),
value: settings.activity.status_event,
disabled: disabled,
onChange: value => {
reconcile(_objectSpread(_objectSpread({}, model), {}, {
activity: _objectSpread(_objectSpread({}, model.activity), {}, {
status_event: value
})
}));
}
}), /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, {
label: (0, _languageHandler._t)("settings|notifications|notices"),
value: settings.activity.bot_notices,
disabled: disabled,
onChange: value => {
reconcile(_objectSpread(_objectSpread({}, model), {}, {
activity: _objectSpread(_objectSpread({}, model.activity), {}, {
bot_notices: value
})
}));
}
})), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("settings|notifications|mentions_keywords"),
description: (0, _languageHandler._t)("settings|notifications|keywords", {}, {
badge: /*#__PURE__*/_react.default.createElement(_StatelessNotificationBadge.StatelessNotificationBadge, {
symbol: "1",
count: 1,
level: _NotificationLevel.NotificationLevel.Notification
})
})
}, /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, {
label: (0, _languageHandler._t)("settings|notifications|notify_at_room"),
value: settings.mentions.room,
disabled: disabled,
onChange: value => {
reconcile(_objectSpread(_objectSpread({}, model), {}, {
mentions: _objectSpread(_objectSpread({}, model.mentions), {}, {
room: value
})
}));
}
}), /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, {
label: (0, _languageHandler._t)("settings|notifications|notify_mention", {
mxid: cli.getUserId()
}),
value: settings.mentions.user,
disabled: disabled,
onChange: value => {
reconcile(_objectSpread(_objectSpread({}, model), {}, {
mentions: _objectSpread(_objectSpread({}, model.mentions), {}, {
user: value
})
}));
}
}), /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, {
label: (0, _languageHandler._t)("settings|notifications|notify_keyword"),
byline: (0, _languageHandler._t)("settings|notifications|keywords_prompt"),
value: settings.mentions.keywords,
disabled: disabled,
onChange: value => {
reconcile(_objectSpread(_objectSpread({}, model), {}, {
mentions: _objectSpread(_objectSpread({}, model.mentions), {}, {
keywords: value
})
}));
}
}), /*#__PURE__*/_react.default.createElement(_TagComposer.default, {
id: "mx_NotificationSettings2_Keywords",
tags: model?.keywords ?? [],
disabled: disabled,
onAdd: keyword => {
reconcile(_objectSpread(_objectSpread({}, model), {}, {
keywords: [keyword, ...model.keywords]
}));
},
onRemove: keyword => {
reconcile(_objectSpread(_objectSpread({}, model), {}, {
keywords: model.keywords.filter(it => it !== keyword)
}));
},
label: (0, _languageHandler._t)("notifications|keyword"),
placeholder: (0, _languageHandler._t)("notifications|keyword_new")
}), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, {
name: "Notifications.showbold",
level: _SettingLevel.SettingLevel.DEVICE
}), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, {
name: "Notifications.tac_only_notifications",
level: _SettingLevel.SettingLevel.DEVICE
})), /*#__PURE__*/_react.default.createElement(_NotificationPusherSettings.NotificationPusherSettings, null), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("settings|notifications|quick_actions_section")
}, hasUnreadNotifications && /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "primary_outline",
disabled: updatingUnread,
onClick: async () => {
setUpdatingUnread(true);
await (0, _notifications.clearAllNotifications)(cli);
setUpdatingUnread(false);
}
}, (0, _languageHandler._t)("settings|notifications|quick_actions_mark_all_read")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "danger_outline",
disabled: model === null,
onClick: () => {
reconcile(_NotificationSettings.DefaultNotificationSettings);
}
}, (0, _languageHandler._t)("settings|notifications|quick_actions_reset")))));
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbmV3QW5kSW1wcm92ZWQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfdXNlTm90aWZpY2F0aW9uU2V0dGluZ3MiLCJfdXNlU2V0dGluZ3MiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX05vdGlmaWNhdGlvblNldHRpbmdzIiwiX1Jvb21Ob3RpZnMiLCJfU2V0dGluZ0xldmVsIiwiX1NldHRpbmdzU3RvcmUiLCJfTm90aWZpY2F0aW9uTGV2ZWwiLCJfbm90aWZpY2F0aW9ucyIsIl9BY2Nlc3NpYmxlQnV0dG9uIiwiX0V4dGVybmFsTGluayIsIl9MYWJlbGxlZENoZWNrYm94IiwiX0xhYmVsbGVkVG9nZ2xlU3dpdGNoIiwiX1N0eWxlZFJhZGlvR3JvdXAiLCJfVGFnQ29tcG9zZXIiLCJfU3RhdGVsZXNzTm90aWZpY2F0aW9uQmFkZ2UiLCJfU2V0dGluZ3NCYW5uZXIiLCJfU2V0dGluZ3NTZWN0aW9uIiwiX1NldHRpbmdzU3Vic2VjdGlvbiIsIl9Ob3RpZmljYXRpb25QdXNoZXJTZXR0aW5ncyIsIl9TZXR0aW5nc0ZsYWciLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJOb3RpZmljYXRpb25EZWZhdWx0TGV2ZWxzIiwidG9EZWZhdWx0TGV2ZWxzIiwibGV2ZWxzIiwicm9vbSIsIlJvb21Ob3RpZlN0YXRlIiwiQWxsTWVzc2FnZXMiLCJkbSIsIlBlb3BsZU1lbnRpb25zS2V5d29yZHMiLCJNZW50aW9uc0tleXdvcmRzIiwiYm9sZFRleHQiLCJ0ZXh0IiwiY3JlYXRlRWxlbWVudCIsImhlbHBMaW5rIiwic3ViIiwiaHJlZiIsInVzZUhhc1VucmVhZE5vdGlmaWNhdGlvbnMiLCJjbGkiLCJ1c2VNYXRyaXhDbGllbnRDb250ZXh0IiwiZ2V0Um9vbXMiLCJzb21lIiwiZ2V0VW5yZWFkTm90aWZpY2F0aW9uQ291bnQiLCJOb3RpZmljYXRpb25TZXR0aW5nczIiLCJkZXNrdG9wTm90aWZpY2F0aW9ucyIsInVzZVNldHRpbmdWYWx1ZSIsImRlc2t0b3BTaG93Qm9keSIsImF1ZGlvTm90aWZpY2F0aW9ucyIsIm1vZGVsIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJyZWNvbmNpbGUiLCJ1c2VOb3RpZmljYXRpb25TZXR0aW5ncyIsImRpc2FibGVkIiwic2V0dGluZ3MiLCJEZWZhdWx0Tm90aWZpY2F0aW9uU2V0dGluZ3MiLCJ1cGRhdGluZ1VucmVhZCIsInNldFVwZGF0aW5nVW5yZWFkIiwidXNlU3RhdGUiLCJoYXNVbnJlYWROb3RpZmljYXRpb25zIiwiTm90aWZpY2F0aW9uT3B0aW9ucyIsInZhbHVlIiwibGFiZWwiLCJfdCIsImNsYXNzTmFtZSIsIlNldHRpbmdzQmFubmVyIiwiaWNvbiIsInNyYyIsIk5ld0FuZEltcHJvdmVkSWNvbiIsImFsdCIsIndpZHRoIiwiYWN0aW9uIiwib25BY3Rpb24iLCJzdHJvbmciLCJTZXR0aW5nc1NlY3Rpb24iLCJnbG9iYWxNdXRlIiwib25DaGFuZ2UiLCJTZXR0aW5nc1N0b3JlIiwic2V0VmFsdWUiLCJTZXR0aW5nTGV2ZWwiLCJERVZJQ0UiLCJoZWFkaW5nIiwiZGVzY3JpcHRpb24iLCJuYW1lIiwiZGVmYXVsdExldmVscyIsImRlZmluaXRpb25zIiwiTWVudGlvbnNPbmx5Iiwic291bmQiLCJwZW9wbGUiLCJ1bmRlZmluZWQiLCJtZW50aW9ucyIsImNhbGxzIiwiYWN0aXZpdHkiLCJpbnZpdGUiLCJzdGF0dXNfZXZlbnQiLCJib3Rfbm90aWNlcyIsImJhZGdlIiwiU3RhdGVsZXNzTm90aWZpY2F0aW9uQmFkZ2UiLCJzeW1ib2wiLCJjb3VudCIsImxldmVsIiwiTm90aWZpY2F0aW9uTGV2ZWwiLCJOb3RpZmljYXRpb24iLCJteGlkIiwiZ2V0VXNlcklkIiwidXNlciIsImJ5bGluZSIsImtleXdvcmRzIiwiaWQiLCJ0YWdzIiwib25BZGQiLCJrZXl3b3JkIiwib25SZW1vdmUiLCJpdCIsInBsYWNlaG9sZGVyIiwiTm90aWZpY2F0aW9uUHVzaGVyU2V0dGluZ3MiLCJraW5kIiwib25DbGljayIsImNsZWFyQWxsTm90aWZpY2F0aW9ucyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL25vdGlmaWNhdGlvbnMvTm90aWZpY2F0aW9uU2V0dGluZ3MyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMyBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IE5ld0FuZEltcHJvdmVkSWNvbiBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vcmVzL2ltZy9lbGVtZW50LWljb25zL25ldy1hbmQtaW1wcm92ZWQuc3ZnXCI7XG5pbXBvcnQgeyB1c2VNYXRyaXhDbGllbnRDb250ZXh0IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvbnRleHRzL01hdHJpeENsaWVudENvbnRleHRcIjtcbmltcG9ydCB7IHVzZU5vdGlmaWNhdGlvblNldHRpbmdzIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2hvb2tzL3VzZU5vdGlmaWNhdGlvblNldHRpbmdzXCI7XG5pbXBvcnQgeyB1c2VTZXR0aW5nVmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vaG9va3MvdXNlU2V0dGluZ3NcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBEZWZhdWx0Tm90aWZpY2F0aW9uU2V0dGluZ3MsXG4gICAgTm90aWZpY2F0aW9uU2V0dGluZ3MsXG59IGZyb20gXCIuLi8uLi8uLi8uLi9tb2RlbHMvbm90aWZpY2F0aW9uc2V0dGluZ3MvTm90aWZpY2F0aW9uU2V0dGluZ3NcIjtcbmltcG9ydCB7IFJvb21Ob3RpZlN0YXRlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL1Jvb21Ob3RpZnNcIjtcbmltcG9ydCB7IFNldHRpbmdMZXZlbCB9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nTGV2ZWxcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi8uLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25MZXZlbCB9IGZyb20gXCIuLi8uLi8uLi8uLi9zdG9yZXMvbm90aWZpY2F0aW9ucy9Ob3RpZmljYXRpb25MZXZlbFwiO1xuaW1wb3J0IHsgY2xlYXJBbGxOb3RpZmljYXRpb25zIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3V0aWxzL25vdGlmaWNhdGlvbnNcIjtcbmltcG9ydCBBY2Nlc3NpYmxlQnV0dG9uIGZyb20gXCIuLi8uLi9lbGVtZW50cy9BY2Nlc3NpYmxlQnV0dG9uXCI7XG5pbXBvcnQgRXh0ZXJuYWxMaW5rIGZyb20gXCIuLi8uLi9lbGVtZW50cy9FeHRlcm5hbExpbmtcIjtcbmltcG9ydCBMYWJlbGxlZENoZWNrYm94IGZyb20gXCIuLi8uLi9lbGVtZW50cy9MYWJlbGxlZENoZWNrYm94XCI7XG5pbXBvcnQgTGFiZWxsZWRUb2dnbGVTd2l0Y2ggZnJvbSBcIi4uLy4uL2VsZW1lbnRzL0xhYmVsbGVkVG9nZ2xlU3dpdGNoXCI7XG5pbXBvcnQgU3R5bGVkUmFkaW9Hcm91cCBmcm9tIFwiLi4vLi4vZWxlbWVudHMvU3R5bGVkUmFkaW9Hcm91cFwiO1xuaW1wb3J0IFRhZ0NvbXBvc2VyIGZyb20gXCIuLi8uLi9lbGVtZW50cy9UYWdDb21wb3NlclwiO1xuaW1wb3J0IHsgU3RhdGVsZXNzTm90aWZpY2F0aW9uQmFkZ2UgfSBmcm9tIFwiLi4vLi4vcm9vbXMvTm90aWZpY2F0aW9uQmFkZ2UvU3RhdGVsZXNzTm90aWZpY2F0aW9uQmFkZ2VcIjtcbmltcG9ydCB7IFNldHRpbmdzQmFubmVyIH0gZnJvbSBcIi4uL3NoYXJlZC9TZXR0aW5nc0Jhbm5lclwiO1xuaW1wb3J0IHsgU2V0dGluZ3NTZWN0aW9uIH0gZnJvbSBcIi4uL3NoYXJlZC9TZXR0aW5nc1NlY3Rpb25cIjtcbmltcG9ydCBTZXR0aW5nc1N1YnNlY3Rpb24gZnJvbSBcIi4uL3NoYXJlZC9TZXR0aW5nc1N1YnNlY3Rpb25cIjtcbmltcG9ydCB7IE5vdGlmaWNhdGlvblB1c2hlclNldHRpbmdzIH0gZnJvbSBcIi4vTm90aWZpY2F0aW9uUHVzaGVyU2V0dGluZ3NcIjtcbmltcG9ydCBTZXR0aW5nc0ZsYWcgZnJvbSBcIi4uLy4uL2VsZW1lbnRzL1NldHRpbmdzRmxhZ1wiO1xuXG5lbnVtIE5vdGlmaWNhdGlvbkRlZmF1bHRMZXZlbHMge1xuICAgIEFsbE1lc3NhZ2VzID0gXCJhbGxfbWVzc2FnZXNcIixcbiAgICBQZW9wbGVNZW50aW9uc0tleXdvcmRzID0gXCJwZW9wbGVfbWVudGlvbnNfa2V5d29yZHNcIixcbiAgICBNZW50aW9uc0tleXdvcmRzID0gXCJtZW50aW9uc19rZXl3b3Jkc1wiLFxufVxuXG5mdW5jdGlvbiB0b0RlZmF1bHRMZXZlbHMobGV2ZWxzOiBOb3RpZmljYXRpb25TZXR0aW5nc1tcImRlZmF1bHRMZXZlbHNcIl0pOiBOb3RpZmljYXRpb25EZWZhdWx0TGV2ZWxzIHtcbiAgICBpZiAobGV2ZWxzLnJvb20gPT09IFJvb21Ob3RpZlN0YXRlLkFsbE1lc3NhZ2VzKSB7XG4gICAgICAgIHJldHVybiBOb3RpZmljYXRpb25EZWZhdWx0TGV2ZWxzLkFsbE1lc3NhZ2VzO1xuICAgIH0gZWxzZSBpZiAobGV2ZWxzLmRtID09PSBSb29tTm90aWZTdGF0ZS5BbGxNZXNzYWdlcykge1xuICAgICAgICByZXR1cm4gTm90aWZpY2F0aW9uRGVmYXVsdExldmVscy5QZW9wbGVNZW50aW9uc0tleXdvcmRzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBOb3RpZmljYXRpb25EZWZhdWx0TGV2ZWxzLk1lbnRpb25zS2V5d29yZHM7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBib2xkVGV4dCh0ZXh0OiBzdHJpbmcpOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIDxzdHJvbmc+e3RleHR9PC9zdHJvbmc+O1xufVxuXG5mdW5jdGlvbiBoZWxwTGluayhzdWI6IHN0cmluZyk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gPEV4dGVybmFsTGluayBocmVmPVwiaHR0cHM6Ly9lbGVtZW50LmlvL2hlbHAjc2V0dGluZ3MyXCI+e3N1Yn08L0V4dGVybmFsTGluaz47XG59XG5cbmZ1bmN0aW9uIHVzZUhhc1VucmVhZE5vdGlmaWNhdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2xpID0gdXNlTWF0cml4Q2xpZW50Q29udGV4dCgpO1xuICAgIHJldHVybiBjbGkuZ2V0Um9vbXMoKS5zb21lKChyb29tKSA9PiByb29tLmdldFVucmVhZE5vdGlmaWNhdGlvbkNvdW50KCkgPiAwKTtcbn1cblxuLyoqXG4gKiBUaGUgbmV3IG5vdGlmaWNhdGlvbiBzZXR0aW5ncyB0YWIgdmlldywgb25seSBkaXNwbGF5ZWQgaWYgdGhlIHVzZXIgaGFzIEZlYXR1cmVzLk5vdGlmaWNhdGlvblNldHRpbmdzMiBlbmFibGVkXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE5vdGlmaWNhdGlvblNldHRpbmdzMigpOiBKU1guRWxlbWVudCB7XG4gICAgY29uc3QgY2xpID0gdXNlTWF0cml4Q2xpZW50Q29udGV4dCgpO1xuXG4gICAgY29uc3QgZGVza3RvcE5vdGlmaWNhdGlvbnMgPSB1c2VTZXR0aW5nVmFsdWU8Ym9vbGVhbj4oXCJub3RpZmljYXRpb25zRW5hYmxlZFwiKTtcbiAgICBjb25zdCBkZXNrdG9wU2hvd0JvZHkgPSB1c2VTZXR0aW5nVmFsdWU8Ym9vbGVhbj4oXCJub3RpZmljYXRpb25Cb2R5RW5hYmxlZFwiKTtcbiAgICBjb25zdCBhdWRpb05vdGlmaWNhdGlvbnMgPSB1c2VTZXR0aW5nVmFsdWU8Ym9vbGVhbj4oXCJhdWRpb05vdGlmaWNhdGlvbnNFbmFibGVkXCIpO1xuXG4gICAgY29uc3QgeyBtb2RlbCwgaGFzUGVuZGluZ0NoYW5nZXMsIHJlY29uY2lsZSB9ID0gdXNlTm90aWZpY2F0aW9uU2V0dGluZ3MoY2xpKTtcblxuICAgIGNvbnN0IGRpc2FibGVkID0gbW9kZWwgPT09IG51bGwgfHwgaGFzUGVuZGluZ0NoYW5nZXM7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBtb2RlbCA/PyBEZWZhdWx0Tm90aWZpY2F0aW9uU2V0dGluZ3M7XG5cbiAgICBjb25zdCBbdXBkYXRpbmdVbnJlYWQsIHNldFVwZGF0aW5nVW5yZWFkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgICBjb25zdCBoYXNVbnJlYWROb3RpZmljYXRpb25zID0gdXNlSGFzVW5yZWFkTm90aWZpY2F0aW9ucygpO1xuXG4gICAgY29uc3QgTm90aWZpY2F0aW9uT3B0aW9ucyA9IFtcbiAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IE5vdGlmaWNhdGlvbkRlZmF1bHRMZXZlbHMuQWxsTWVzc2FnZXMsXG4gICAgICAgICAgICBsYWJlbDogX3QoXCJub3RpZmljYXRpb25zfGFsbF9tZXNzYWdlc1wiKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IE5vdGlmaWNhdGlvbkRlZmF1bHRMZXZlbHMuUGVvcGxlTWVudGlvbnNLZXl3b3JkcyxcbiAgICAgICAgICAgIGxhYmVsOiBfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cGVvcGxlX21lbnRpb25zX2tleXdvcmRzXCIpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogTm90aWZpY2F0aW9uRGVmYXVsdExldmVscy5NZW50aW9uc0tleXdvcmRzLFxuICAgICAgICAgICAgbGFiZWw6IF90KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xtZW50aW9uc19rZXl3b3Jkc19vbmx5XCIpLFxuICAgICAgICB9LFxuICAgIF07XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X05vdGlmaWNhdGlvblNldHRpbmdzMlwiPlxuICAgICAgICAgICAge2hhc1BlbmRpbmdDaGFuZ2VzICYmIG1vZGVsICE9PSBudWxsICYmIChcbiAgICAgICAgICAgICAgICA8U2V0dGluZ3NCYW5uZXJcbiAgICAgICAgICAgICAgICAgICAgaWNvbj17PGltZyBzcmM9e05ld0FuZEltcHJvdmVkSWNvbn0gYWx0PVwiXCIgd2lkdGg9ezEyfSAvPn1cbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uPXtfdChcImFjdGlvbnxwcm9jZWVkXCIpfVxuICAgICAgICAgICAgICAgICAgICBvbkFjdGlvbj17KCkgPT4gcmVjb25jaWxlKG1vZGVsISl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7X3QoXG4gICAgICAgICAgICAgICAgICAgICAgICBcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8bGFic19ub3RpY2VfcHJvbXB0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJvbmc6IGJvbGRUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE6IGhlbHBMaW5rLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L1NldHRpbmdzQmFubmVyPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDxTZXR0aW5nc1NlY3Rpb24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9TZXR0aW5nc1N1YnNlY3Rpb25fY29udGVudCBteF9Ob3RpZmljYXRpb25TZXR0aW5nczJfZmxhZ3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPExhYmVsbGVkVG9nZ2xlU3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfGVuYWJsZV9ub3RpZmljYXRpb25zX2FjY291bnRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17IXNldHRpbmdzLmdsb2JhbE11dGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxNdXRlOiAhdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8TGFiZWxsZWRUb2dnbGVTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8ZW5hYmxlX2Rlc2t0b3Bfbm90aWZpY2F0aW9uc19zZXNzaW9uXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2Rlc2t0b3BOb3RpZmljYXRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKFwibm90aWZpY2F0aW9uc0VuYWJsZWRcIiwgbnVsbCwgU2V0dGluZ0xldmVsLkRFVklDRSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbGxlZFRvZ2dsZVN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xkZXNrdG9wX25vdGlmaWNhdGlvbl9tZXNzYWdlX3ByZXZpZXdcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17ZGVza3RvcFNob3dCb2R5fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKFwibm90aWZpY2F0aW9uQm9keUVuYWJsZWRcIiwgbnVsbCwgU2V0dGluZ0xldmVsLkRFVklDRSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbGxlZFRvZ2dsZVN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xlbmFibGVfYXVkaWJsZV9ub3RpZmljYXRpb25zX3Nlc3Npb25cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YXVkaW9Ob3RpZmljYXRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKFwiYXVkaW9Ob3RpZmljYXRpb25zRW5hYmxlZFwiLCBudWxsLCBTZXR0aW5nTGV2ZWwuREVWSUNFLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIGhlYWRpbmc9e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xkZWZhdWx0X3NldHRpbmdfc2VjdGlvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xkZWZhdWx0X3NldHRpbmdfZGVzY3JpcHRpb25cIil9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkUmFkaW9Hcm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRlZmF1bHROb3RpZmljYXRpb25MZXZlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dG9EZWZhdWx0TGV2ZWxzKHNldHRpbmdzLmRlZmF1bHRMZXZlbHMpfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnM9e05vdGlmaWNhdGlvbk9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TGV2ZWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tb2RlbCEuZGVmYXVsdExldmVscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICE9PSBOb3RpZmljYXRpb25EZWZhdWx0TGV2ZWxzLk1lbnRpb25zS2V5d29yZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBSb29tTm90aWZTdGF0ZS5BbGxNZXNzYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFJvb21Ob3RpZlN0YXRlLk1lbnRpb25zT25seSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb206XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPT09IE5vdGlmaWNhdGlvbkRlZmF1bHRMZXZlbHMuQWxsTWVzc2FnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBSb29tTm90aWZTdGF0ZS5BbGxNZXNzYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFJvb21Ob3RpZlN0YXRlLk1lbnRpb25zT25seSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9TZXR0aW5nc1N1YnNlY3Rpb24+XG4gICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvblxuICAgICAgICAgICAgICAgICAgICBoZWFkaW5nPXtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cGxheV9zb3VuZF9mb3Jfc2VjdGlvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xwbGF5X3NvdW5kX2Zvcl9kZXNjcmlwdGlvblwiKX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbGxlZENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIlBlb3BsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c2V0dGluZ3Muc291bmQucGVvcGxlICE9PSB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgc2V0dGluZ3MuZGVmYXVsdExldmVscy5kbSA9PT0gUm9vbU5vdGlmU3RhdGUuTWVudGlvbnNPbmx5fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uY2lsZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1vZGVsISxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1vZGVsIS5zb3VuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlb3BsZTogdmFsdWUgPyBcImRlZmF1bHRcIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbGxlZENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfG1lbnRpb25zX2tleXdvcmRzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NldHRpbmdzLnNvdW5kLm1lbnRpb25zICE9PSB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLnNvdW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudGlvbnM6IHZhbHVlID8gXCJkZWZhdWx0XCIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8TGFiZWxsZWRDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3x2b2lwXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NldHRpbmdzLnNvdW5kLmNhbGxzICE9PSB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLnNvdW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbHM6IHZhbHVlID8gXCJyaW5nXCIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uPlxuICAgICAgICAgICAgICAgIDxTZXR0aW5nc1N1YnNlY3Rpb24gaGVhZGluZz17X3QoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfG90aGVyX3NlY3Rpb25cIil9PlxuICAgICAgICAgICAgICAgICAgICA8TGFiZWxsZWRDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xpbnZpdGVzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NldHRpbmdzLmFjdGl2aXR5Lmludml0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbmNpbGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tb2RlbCEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tb2RlbCEuYWN0aXZpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZpdGU6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPExhYmVsbGVkQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cm9vbV9hY3Rpdml0eVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzZXR0aW5ncy5hY3Rpdml0eS5zdGF0dXNfZXZlbnR9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLmFjdGl2aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2V2ZW50OiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbGxlZENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfG5vdGljZXNcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c2V0dGluZ3MuYWN0aXZpdHkuYm90X25vdGljZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLmFjdGl2aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90X25vdGljZXM6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cbiAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIGhlYWRpbmc9e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xtZW50aW9uc19rZXl3b3Jkc1wiKX1cbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249e190KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfGtleXdvcmRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZTogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3RhdGVsZXNzTm90aWZpY2F0aW9uQmFkZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ9ezF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbD17Tm90aWZpY2F0aW9uTGV2ZWwuTm90aWZpY2F0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPExhYmVsbGVkQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8bm90aWZ5X2F0X3Jvb21cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c2V0dGluZ3MubWVudGlvbnMucm9vbX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbmNpbGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tb2RlbCEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tb2RlbCEubWVudGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb29tOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbGxlZENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfG5vdGlmeV9tZW50aW9uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteGlkOiBjbGkuZ2V0VXNlcklkKCkhLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c2V0dGluZ3MubWVudGlvbnMudXNlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbmNpbGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tb2RlbCEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tb2RlbCEubWVudGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbGxlZENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfG5vdGlmeV9rZXl3b3JkXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnlsaW5lPXtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8a2V5d29yZHNfcHJvbXB0XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NldHRpbmdzLm1lbnRpb25zLmtleXdvcmRzfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uY2lsZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1vZGVsISxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1vZGVsIS5tZW50aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxUYWdDb21wb3NlclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJteF9Ob3RpZmljYXRpb25TZXR0aW5nczJfS2V5d29yZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFncz17bW9kZWw/LmtleXdvcmRzID8/IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25BZGQ9eyhrZXl3b3JkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkczogW2tleXdvcmQsIC4uLm1vZGVsIS5rZXl3b3Jkc10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25SZW1vdmU9eyhrZXl3b3JkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkczogbW9kZWwhLmtleXdvcmRzLmZpbHRlcigoaXQpID0+IGl0ICE9PSBrZXl3b3JkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJub3RpZmljYXRpb25zfGtleXdvcmRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17X3QoXCJub3RpZmljYXRpb25zfGtleXdvcmRfbmV3XCIpfVxuICAgICAgICAgICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICAgICAgICAgIDxTZXR0aW5nc0ZsYWcgbmFtZT1cIk5vdGlmaWNhdGlvbnMuc2hvd2JvbGRcIiBsZXZlbD17U2V0dGluZ0xldmVsLkRFVklDRX0gLz5cbiAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzRmxhZyBuYW1lPVwiTm90aWZpY2F0aW9ucy50YWNfb25seV9ub3RpZmljYXRpb25zXCIgbGV2ZWw9e1NldHRpbmdMZXZlbC5ERVZJQ0V9IC8+XG4gICAgICAgICAgICAgICAgPC9TZXR0aW5nc1N1YnNlY3Rpb24+XG4gICAgICAgICAgICAgICAgPE5vdGlmaWNhdGlvblB1c2hlclNldHRpbmdzIC8+XG4gICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvbiBoZWFkaW5nPXtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cXVpY2tfYWN0aW9uc19zZWN0aW9uXCIpfT5cbiAgICAgICAgICAgICAgICAgICAge2hhc1VucmVhZE5vdGlmaWNhdGlvbnMgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kPVwicHJpbWFyeV9vdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dXBkYXRpbmdVbnJlYWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRVcGRhdGluZ1VucmVhZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xlYXJBbGxOb3RpZmljYXRpb25zKGNsaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFVwZGF0aW5nVW5yZWFkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cXVpY2tfYWN0aW9uc19tYXJrX2FsbF9yZWFkXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAga2luZD1cImRhbmdlcl9vdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXttb2RlbCA9PT0gbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbmNpbGUoRGVmYXVsdE5vdGlmaWNhdGlvblNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cXVpY2tfYWN0aW9uc19yZXNldFwiKX1cbiAgICAgICAgICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uPlxuICAgICAgICAgICAgPC9TZXR0aW5nc1NlY3Rpb24+XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsZUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsb0JBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLHdCQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxZQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxnQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8scUJBQUEsR0FBQVAsT0FBQTtBQUlBLElBQUFRLFdBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLGFBQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLGNBQUEsR0FBQVIsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFXLGtCQUFBLEdBQUFYLE9BQUE7QUFDQSxJQUFBWSxjQUFBLEdBQUFaLE9BQUE7QUFDQSxJ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