UNPKG

matrix-react-sdk

Version:
188 lines (184 loc) 32 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.VectorPushRulesDefinitions = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _matrix = require("matrix-js-sdk/src/matrix"); var _logger = require("matrix-js-sdk/src/logger"); var _languageHandler = require("../languageHandler"); var _StandardActions = require("./StandardActions"); var _PushRuleVectorState = require("./PushRuleVectorState"); var _NotificationUtils = require("./NotificationUtils"); /* Copyright 2024 New Vector Ltd. Copyright 2016-2022 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. */ class VectorPushRuleDefinition { constructor(opts) { (0, _defineProperty2.default)(this, "description", void 0); (0, _defineProperty2.default)(this, "vectorStateToActions", void 0); (0, _defineProperty2.default)(this, "syncedRuleIds", void 0); this.description = opts.description; this.vectorStateToActions = opts.vectorStateToActions; this.syncedRuleIds = opts.syncedRuleIds; } // Translate the rule actions and its enabled value into vector state ruleToVectorState(rule) { let enabled = false; if (rule) { enabled = rule.enabled; } for (const state of Object.values(_PushRuleVectorState.PushRuleVectorState.states)) { const vectorStateToActions = this.vectorStateToActions[state]; if (!vectorStateToActions) { // No defined actions means that this vector state expects a disabled (or absent) rule if (!enabled) { return state; } } else { // The actions must match to the ones expected by vector state. // Use `decodeActions` on both sides to canonicalize things like // value: true vs. unspecified for highlight (which defaults to // true, making them equivalent). if (enabled && JSON.stringify(_NotificationUtils.NotificationUtils.decodeActions(rule.actions)) === JSON.stringify(_NotificationUtils.NotificationUtils.decodeActions(vectorStateToActions))) { return state; } } } _logger.logger.error(`Cannot translate rule actions into Vector rule state. ` + `Rule: ${JSON.stringify(rule)}, ` + `Expected: ${JSON.stringify(this.vectorStateToActions)}`); return undefined; } } /** * The descriptions of rules managed by the Vector UI. */ const VectorPushRulesDefinitions = exports.VectorPushRulesDefinitions = { // Messages containing user's display name ".m.rule.contains_display_name": new VectorPushRuleDefinition({ description: (0, _languageHandler._td)("settings|notifications|rule_contains_display_name"), // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { // The actions for each vector state, or null to disable the rule. [_PushRuleVectorState.VectorState.On]: _StandardActions.StandardActions.ACTION_NOTIFY, [_PushRuleVectorState.VectorState.Loud]: _StandardActions.StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND, [_PushRuleVectorState.VectorState.Off]: _StandardActions.StandardActions.ACTION_DISABLED } }), // Messages containing user's username (localpart/MXID) ".m.rule.contains_user_name": new VectorPushRuleDefinition({ description: (0, _languageHandler._td)("settings|notifications|rule_contains_user_name"), // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { // The actions for each vector state, or null to disable the rule. [_PushRuleVectorState.VectorState.On]: _StandardActions.StandardActions.ACTION_NOTIFY, [_PushRuleVectorState.VectorState.Loud]: _StandardActions.StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND, [_PushRuleVectorState.VectorState.Off]: _StandardActions.StandardActions.ACTION_DISABLED }, syncedRuleIds: [_matrix.RuleId.IsUserMention] }), // Messages containing @room ".m.rule.roomnotif": new VectorPushRuleDefinition({ description: (0, _languageHandler._td)("settings|notifications|rule_roomnotif"), // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { // The actions for each vector state, or null to disable the rule. [_PushRuleVectorState.VectorState.On]: _StandardActions.StandardActions.ACTION_NOTIFY, [_PushRuleVectorState.VectorState.Loud]: _StandardActions.StandardActions.ACTION_HIGHLIGHT, [_PushRuleVectorState.VectorState.Off]: _StandardActions.StandardActions.ACTION_DISABLED }, syncedRuleIds: [_matrix.RuleId.IsRoomMention] }), // Messages just sent to the user in a 1:1 room ".m.rule.room_one_to_one": new VectorPushRuleDefinition({ description: (0, _languageHandler._td)("settings|notifications|rule_room_one_to_one"), // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { [_PushRuleVectorState.VectorState.On]: _StandardActions.StandardActions.ACTION_NOTIFY, [_PushRuleVectorState.VectorState.Loud]: _StandardActions.StandardActions.ACTION_NOTIFY_DEFAULT_SOUND, [_PushRuleVectorState.VectorState.Off]: _StandardActions.StandardActions.ACTION_DONT_NOTIFY }, syncedRuleIds: [_matrix.RuleId.PollStartOneToOne, _matrix.RuleId.PollStartOneToOneUnstable, _matrix.RuleId.PollEndOneToOne, _matrix.RuleId.PollEndOneToOneUnstable] }), // Encrypted messages just sent to the user in a 1:1 room ".m.rule.encrypted_room_one_to_one": new VectorPushRuleDefinition({ description: (0, _languageHandler._td)("settings|notifications|rule_encrypted_room_one_to_one"), // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { [_PushRuleVectorState.VectorState.On]: _StandardActions.StandardActions.ACTION_NOTIFY, [_PushRuleVectorState.VectorState.Loud]: _StandardActions.StandardActions.ACTION_NOTIFY_DEFAULT_SOUND, [_PushRuleVectorState.VectorState.Off]: _StandardActions.StandardActions.ACTION_DONT_NOTIFY } }), // Messages just sent to a group chat room // 1:1 room messages are caught by the .m.rule.room_one_to_one rule if any defined // By opposition, all other room messages are from group chat rooms. ".m.rule.message": new VectorPushRuleDefinition({ description: (0, _languageHandler._td)("settings|notifications|rule_message"), // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { [_PushRuleVectorState.VectorState.On]: _StandardActions.StandardActions.ACTION_NOTIFY, [_PushRuleVectorState.VectorState.Loud]: _StandardActions.StandardActions.ACTION_NOTIFY_DEFAULT_SOUND, [_PushRuleVectorState.VectorState.Off]: _StandardActions.StandardActions.ACTION_DONT_NOTIFY }, syncedRuleIds: [_matrix.RuleId.PollStart, _matrix.RuleId.PollStartUnstable, _matrix.RuleId.PollEnd, _matrix.RuleId.PollEndUnstable] }), // Encrypted messages just sent to a group chat room // Encrypted 1:1 room messages are caught by the .m.rule.encrypted_room_one_to_one rule if any defined // By opposition, all other room messages are from group chat rooms. ".m.rule.encrypted": new VectorPushRuleDefinition({ description: (0, _languageHandler._td)("settings|notifications|rule_encrypted"), // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { [_PushRuleVectorState.VectorState.On]: _StandardActions.StandardActions.ACTION_NOTIFY, [_PushRuleVectorState.VectorState.Loud]: _StandardActions.StandardActions.ACTION_NOTIFY_DEFAULT_SOUND, [_PushRuleVectorState.VectorState.Off]: _StandardActions.StandardActions.ACTION_DONT_NOTIFY } }), // Invitation for the user ".m.rule.invite_for_me": new VectorPushRuleDefinition({ description: (0, _languageHandler._td)("settings|notifications|rule_invite_for_me"), // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { [_PushRuleVectorState.VectorState.On]: _StandardActions.StandardActions.ACTION_NOTIFY, [_PushRuleVectorState.VectorState.Loud]: _StandardActions.StandardActions.ACTION_NOTIFY_DEFAULT_SOUND, [_PushRuleVectorState.VectorState.Off]: _StandardActions.StandardActions.ACTION_DISABLED } }), // Incoming call ".m.rule.call": new VectorPushRuleDefinition({ description: (0, _languageHandler._td)("settings|notifications|rule_call"), // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { [_PushRuleVectorState.VectorState.On]: _StandardActions.StandardActions.ACTION_NOTIFY, [_PushRuleVectorState.VectorState.Loud]: _StandardActions.StandardActions.ACTION_NOTIFY_RING_SOUND, [_PushRuleVectorState.VectorState.Off]: _StandardActions.StandardActions.ACTION_DISABLED } }), // Notifications from bots ".m.rule.suppress_notices": new VectorPushRuleDefinition({ description: (0, _languageHandler._td)("settings|notifications|rule_suppress_notices"), // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { // .m.rule.suppress_notices is a "negative" rule, we have to invert its enabled value for vector UI [_PushRuleVectorState.VectorState.On]: _StandardActions.StandardActions.ACTION_DISABLED, [_PushRuleVectorState.VectorState.Loud]: _StandardActions.StandardActions.ACTION_NOTIFY_DEFAULT_SOUND, [_PushRuleVectorState.VectorState.Off]: _StandardActions.StandardActions.ACTION_DONT_NOTIFY } }), // Room upgrades (tombstones) ".m.rule.tombstone": new VectorPushRuleDefinition({ description: (0, _languageHandler._td)("settings|notifications|rule_tombstone"), // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { // The actions for each vector state, or null to disable the rule. [_PushRuleVectorState.VectorState.On]: _StandardActions.StandardActions.ACTION_NOTIFY, [_PushRuleVectorState.VectorState.Loud]: _StandardActions.StandardActions.ACTION_HIGHLIGHT, [_PushRuleVectorState.VectorState.Off]: _StandardActions.StandardActions.ACTION_DISABLED } }) }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX1N0YW5kYXJkQWN0aW9ucyIsIl9QdXNoUnVsZVZlY3RvclN0YXRlIiwiX05vdGlmaWNhdGlvblV0aWxzIiwiVmVjdG9yUHVzaFJ1bGVEZWZpbml0aW9uIiwiY29uc3RydWN0b3IiLCJvcHRzIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJkZXNjcmlwdGlvbiIsInZlY3RvclN0YXRlVG9BY3Rpb25zIiwic3luY2VkUnVsZUlkcyIsInJ1bGVUb1ZlY3RvclN0YXRlIiwicnVsZSIsImVuYWJsZWQiLCJzdGF0ZSIsIk9iamVjdCIsInZhbHVlcyIsIlB1c2hSdWxlVmVjdG9yU3RhdGUiLCJzdGF0ZXMiLCJKU09OIiwic3RyaW5naWZ5IiwiTm90aWZpY2F0aW9uVXRpbHMiLCJkZWNvZGVBY3Rpb25zIiwiYWN0aW9ucyIsImxvZ2dlciIsImVycm9yIiwidW5kZWZpbmVkIiwiVmVjdG9yUHVzaFJ1bGVzRGVmaW5pdGlvbnMiLCJleHBvcnRzIiwiX3RkIiwiVmVjdG9yU3RhdGUiLCJPbiIsIlN0YW5kYXJkQWN0aW9ucyIsIkFDVElPTl9OT1RJRlkiLCJMb3VkIiwiQUNUSU9OX0hJR0hMSUdIVF9ERUZBVUxUX1NPVU5EIiwiT2ZmIiwiQUNUSU9OX0RJU0FCTEVEIiwiUnVsZUlkIiwiSXNVc2VyTWVudGlvbiIsIkFDVElPTl9ISUdITElHSFQiLCJJc1Jvb21NZW50aW9uIiwiQUNUSU9OX05PVElGWV9ERUZBVUxUX1NPVU5EIiwiQUNUSU9OX0RPTlRfTk9USUZZIiwiUG9sbFN0YXJ0T25lVG9PbmUiLCJQb2xsU3RhcnRPbmVUb09uZVVuc3RhYmxlIiwiUG9sbEVuZE9uZVRvT25lIiwiUG9sbEVuZE9uZVRvT25lVW5zdGFibGUiLCJQb2xsU3RhcnQiLCJQb2xsU3RhcnRVbnN0YWJsZSIsIlBvbGxFbmQiLCJQb2xsRW5kVW5zdGFibGUiLCJBQ1RJT05fTk9USUZZX1JJTkdfU09VTkQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbm90aWZpY2F0aW9ucy9WZWN0b3JQdXNoUnVsZXNEZWZpbml0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxNi0yMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IElBbm5vdGF0ZWRQdXNoUnVsZSwgUHVzaFJ1bGVBY3Rpb24sIFJ1bGVJZCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcblxuaW1wb3J0IHsgX3RkLCBUcmFuc2xhdGlvbktleSB9IGZyb20gXCIuLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IFN0YW5kYXJkQWN0aW9ucyB9IGZyb20gXCIuL1N0YW5kYXJkQWN0aW9uc1wiO1xuaW1wb3J0IHsgUHVzaFJ1bGVWZWN0b3JTdGF0ZSwgVmVjdG9yU3RhdGUgfSBmcm9tIFwiLi9QdXNoUnVsZVZlY3RvclN0YXRlXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25VdGlscyB9IGZyb20gXCIuL05vdGlmaWNhdGlvblV0aWxzXCI7XG5cbnR5cGUgU3RhdGVUb0FjdGlvbnNNYXAgPSB7XG4gICAgW3N0YXRlIGluIFZlY3RvclN0YXRlXT86IFB1c2hSdWxlQWN0aW9uW107XG59O1xuXG5pbnRlcmZhY2UgSVZlY3RvclB1c2hSdWxlRGVmaW5pdGlvbiB7XG4gICAgZGVzY3JpcHRpb246IFRyYW5zbGF0aW9uS2V5O1xuICAgIHZlY3RvclN0YXRlVG9BY3Rpb25zOiBTdGF0ZVRvQWN0aW9uc01hcDtcbiAgICAvKipcbiAgICAgKiBSdWxlcyB0aGF0IHNob3VsZCBiZSB1cGRhdGVkIHRvIGJlIGtlcHQgaW4gc3luY1xuICAgICAqIHdoZW4gdGhpcyBydWxlIGNoYW5nZXNcbiAgICAgKi9cbiAgICBzeW5jZWRSdWxlSWRzPzogKFJ1bGVJZCB8IHN0cmluZylbXTtcbn1cblxuY2xhc3MgVmVjdG9yUHVzaFJ1bGVEZWZpbml0aW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IFRyYW5zbGF0aW9uS2V5O1xuICAgIHB1YmxpYyByZWFkb25seSB2ZWN0b3JTdGF0ZVRvQWN0aW9uczogU3RhdGVUb0FjdGlvbnNNYXA7XG4gICAgcHVibGljIHJlYWRvbmx5IHN5bmNlZFJ1bGVJZHM/OiAoUnVsZUlkIHwgc3RyaW5nKVtdO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG9wdHM6IElWZWN0b3JQdXNoUnVsZURlZmluaXRpb24pIHtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IG9wdHMuZGVzY3JpcHRpb247XG4gICAgICAgIHRoaXMudmVjdG9yU3RhdGVUb0FjdGlvbnMgPSBvcHRzLnZlY3RvclN0YXRlVG9BY3Rpb25zO1xuICAgICAgICB0aGlzLnN5bmNlZFJ1bGVJZHMgPSBvcHRzLnN5bmNlZFJ1bGVJZHM7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNsYXRlIHRoZSBydWxlIGFjdGlvbnMgYW5kIGl0cyBlbmFibGVkIHZhbHVlIGludG8gdmVjdG9yIHN0YXRlXG4gICAgcHVibGljIHJ1bGVUb1ZlY3RvclN0YXRlKHJ1bGU6IElBbm5vdGF0ZWRQdXNoUnVsZSk6IFZlY3RvclN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJ1bGUpIHtcbiAgICAgICAgICAgIGVuYWJsZWQgPSBydWxlLmVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIE9iamVjdC52YWx1ZXMoUHVzaFJ1bGVWZWN0b3JTdGF0ZS5zdGF0ZXMpKSB7XG4gICAgICAgICAgICBjb25zdCB2ZWN0b3JTdGF0ZVRvQWN0aW9ucyA9IHRoaXMudmVjdG9yU3RhdGVUb0FjdGlvbnNbc3RhdGVdO1xuXG4gICAgICAgICAgICBpZiAoIXZlY3RvclN0YXRlVG9BY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gZGVmaW5lZCBhY3Rpb25zIG1lYW5zIHRoYXQgdGhpcyB2ZWN0b3Igc3RhdGUgZXhwZWN0cyBhIGRpc2FibGVkIChvciBhYnNlbnQpIHJ1bGVcbiAgICAgICAgICAgICAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGFjdGlvbnMgbXVzdCBtYXRjaCB0byB0aGUgb25lcyBleHBlY3RlZCBieSB2ZWN0b3Igc3RhdGUuXG4gICAgICAgICAgICAgICAgLy8gVXNlIGBkZWNvZGVBY3Rpb25zYCBvbiBib3RoIHNpZGVzIHRvIGNhbm9uaWNhbGl6ZSB0aGluZ3MgbGlrZVxuICAgICAgICAgICAgICAgIC8vIHZhbHVlOiB0cnVlIHZzLiB1bnNwZWNpZmllZCBmb3IgaGlnaGxpZ2h0ICh3aGljaCBkZWZhdWx0cyB0b1xuICAgICAgICAgICAgICAgIC8vIHRydWUsIG1ha2luZyB0aGVtIGVxdWl2YWxlbnQpLlxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShOb3RpZmljYXRpb25VdGlscy5kZWNvZGVBY3Rpb25zKHJ1bGUuYWN0aW9ucykpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoTm90aWZpY2F0aW9uVXRpbHMuZGVjb2RlQWN0aW9ucyh2ZWN0b3JTdGF0ZVRvQWN0aW9ucykpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IHRyYW5zbGF0ZSBydWxlIGFjdGlvbnMgaW50byBWZWN0b3IgcnVsZSBzdGF0ZS4gYCArXG4gICAgICAgICAgICAgICAgYFJ1bGU6ICR7SlNPTi5zdHJpbmdpZnkocnVsZSl9LCBgICtcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQ6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy52ZWN0b3JTdGF0ZVRvQWN0aW9ucyl9YCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5leHBvcnQgdHlwZSB7IFZlY3RvclB1c2hSdWxlRGVmaW5pdGlvbiB9O1xuXG4vKipcbiAqIFRoZSBkZXNjcmlwdGlvbnMgb2YgcnVsZXMgbWFuYWdlZCBieSB0aGUgVmVjdG9yIFVJLlxuICovXG5leHBvcnQgY29uc3QgVmVjdG9yUHVzaFJ1bGVzRGVmaW5pdGlvbnM6IFJlY29yZDxzdHJpbmcsIFZlY3RvclB1c2hSdWxlRGVmaW5pdGlvbj4gPSB7XG4gICAgLy8gTWVzc2FnZXMgY29udGFpbmluZyB1c2VyJ3MgZGlzcGxheSBuYW1lXG4gICAgXCIubS5ydWxlLmNvbnRhaW5zX2Rpc3BsYXlfbmFtZVwiOiBuZXcgVmVjdG9yUHVzaFJ1bGVEZWZpbml0aW9uKHtcbiAgICAgICAgZGVzY3JpcHRpb246IF90ZChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cnVsZV9jb250YWluc19kaXNwbGF5X25hbWVcIiksIC8vIHBhc3NlZCB0aHJvdWdoIF90KCkgdHJhbnNsYXRpb24gaW4gc3JjL2NvbXBvbmVudHMvdmlld3Mvc2V0dGluZ3MvTm90aWZpY2F0aW9ucy5qc1xuICAgICAgICB2ZWN0b3JTdGF0ZVRvQWN0aW9uczoge1xuICAgICAgICAgICAgLy8gVGhlIGFjdGlvbnMgZm9yIGVhY2ggdmVjdG9yIHN0YXRlLCBvciBudWxsIHRvIGRpc2FibGUgdGhlIHJ1bGUuXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuT25dOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX05PVElGWSxcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Mb3VkXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9ISUdITElHSFRfREVGQVVMVF9TT1VORCxcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5PZmZdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX0RJU0FCTEVELFxuICAgICAgICB9LFxuICAgIH0pLFxuXG4gICAgLy8gTWVzc2FnZXMgY29udGFpbmluZyB1c2VyJ3MgdXNlcm5hbWUgKGxvY2FscGFydC9NWElEKVxuICAgIFwiLm0ucnVsZS5jb250YWluc191c2VyX25hbWVcIjogbmV3IFZlY3RvclB1c2hSdWxlRGVmaW5pdGlvbih7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfHJ1bGVfY29udGFpbnNfdXNlcl9uYW1lXCIpLCAvLyBwYXNzZWQgdGhyb3VnaCBfdCgpIHRyYW5zbGF0aW9uIGluIHNyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL05vdGlmaWNhdGlvbnMuanNcbiAgICAgICAgdmVjdG9yU3RhdGVUb0FjdGlvbnM6IHtcbiAgICAgICAgICAgIC8vIFRoZSBhY3Rpb25zIGZvciBlYWNoIHZlY3RvciBzdGF0ZSwgb3IgbnVsbCB0byBkaXNhYmxlIHRoZSBydWxlLlxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLk9uXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9OT1RJRlksXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuTG91ZF06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fSElHSExJR0hUX0RFRkFVTFRfU09VTkQsXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuT2ZmXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9ESVNBQkxFRCxcbiAgICAgICAgfSxcbiAgICAgICAgc3luY2VkUnVsZUlkczogW1J1bGVJZC5Jc1VzZXJNZW50aW9uXSxcbiAgICB9KSxcblxuICAgIC8vIE1lc3NhZ2VzIGNvbnRhaW5pbmcgQHJvb21cbiAgICBcIi5tLnJ1bGUucm9vbW5vdGlmXCI6IG5ldyBWZWN0b3JQdXNoUnVsZURlZmluaXRpb24oe1xuICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xydWxlX3Jvb21ub3RpZlwiKSwgLy8gcGFzc2VkIHRocm91Z2ggX3QoKSB0cmFuc2xhdGlvbiBpbiBzcmMvY29tcG9uZW50cy92aWV3cy9zZXR0aW5ncy9Ob3RpZmljYXRpb25zLmpzXG4gICAgICAgIHZlY3RvclN0YXRlVG9BY3Rpb25zOiB7XG4gICAgICAgICAgICAvLyBUaGUgYWN0aW9ucyBmb3IgZWFjaCB2ZWN0b3Igc3RhdGUsIG9yIG51bGwgdG8gZGlzYWJsZSB0aGUgcnVsZS5cbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Pbl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZLFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLkxvdWRdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX0hJR0hMSUdIVCxcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5PZmZdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX0RJU0FCTEVELFxuICAgICAgICB9LFxuICAgICAgICBzeW5jZWRSdWxlSWRzOiBbUnVsZUlkLklzUm9vbU1lbnRpb25dLFxuICAgIH0pLFxuXG4gICAgLy8gTWVzc2FnZXMganVzdCBzZW50IHRvIHRoZSB1c2VyIGluIGEgMToxIHJvb21cbiAgICBcIi5tLnJ1bGUucm9vbV9vbmVfdG9fb25lXCI6IG5ldyBWZWN0b3JQdXNoUnVsZURlZmluaXRpb24oe1xuICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xydWxlX3Jvb21fb25lX3RvX29uZVwiKSwgLy8gcGFzc2VkIHRocm91Z2ggX3QoKSB0cmFuc2xhdGlvbiBpbiBzcmMvY29tcG9uZW50cy92aWV3cy9zZXR0aW5ncy9Ob3RpZmljYXRpb25zLmpzXG4gICAgICAgIHZlY3RvclN0YXRlVG9BY3Rpb25zOiB7XG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuT25dOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX05PVElGWSxcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Mb3VkXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9OT1RJRllfREVGQVVMVF9TT1VORCxcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5PZmZdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX0RPTlRfTk9USUZZLFxuICAgICAgICB9LFxuICAgICAgICBzeW5jZWRSdWxlSWRzOiBbXG4gICAgICAgICAgICBSdWxlSWQuUG9sbFN0YXJ0T25lVG9PbmUsXG4gICAgICAgICAgICBSdWxlSWQuUG9sbFN0YXJ0T25lVG9PbmVVbnN0YWJsZSxcbiAgICAgICAgICAgIFJ1bGVJZC5Qb2xsRW5kT25lVG9PbmUsXG4gICAgICAgICAgICBSdWxlSWQuUG9sbEVuZE9uZVRvT25lVW5zdGFibGUsXG4gICAgICAgIF0sXG4gICAgfSksXG5cbiAgICAvLyBFbmNyeXB0ZWQgbWVzc2FnZXMganVzdCBzZW50IHRvIHRoZSB1c2VyIGluIGEgMToxIHJvb21cbiAgICBcIi5tLnJ1bGUuZW5jcnlwdGVkX3Jvb21fb25lX3RvX29uZVwiOiBuZXcgVmVjdG9yUHVzaFJ1bGVEZWZpbml0aW9uKHtcbiAgICAgICAgZGVzY3JpcHRpb246IF90ZChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cnVsZV9lbmNyeXB0ZWRfcm9vbV9vbmVfdG9fb25lXCIpLCAvLyBwYXNzZWQgdGhyb3VnaCBfdCgpIHRyYW5zbGF0aW9uIGluIHNyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL05vdGlmaWNhdGlvbnMuanNcbiAgICAgICAgdmVjdG9yU3RhdGVUb0FjdGlvbnM6IHtcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Pbl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZLFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLkxvdWRdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX05PVElGWV9ERUZBVUxUX1NPVU5ELFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLk9mZl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fRE9OVF9OT1RJRlksXG4gICAgICAgIH0sXG4gICAgfSksXG5cbiAgICAvLyBNZXNzYWdlcyBqdXN0IHNlbnQgdG8gYSBncm91cCBjaGF0IHJvb21cbiAgICAvLyAxOjEgcm9vbSBtZXNzYWdlcyBhcmUgY2F1Z2h0IGJ5IHRoZSAubS5ydWxlLnJvb21fb25lX3RvX29uZSBydWxlIGlmIGFueSBkZWZpbmVkXG4gICAgLy8gQnkgb3Bwb3NpdGlvbiwgYWxsIG90aGVyIHJvb20gbWVzc2FnZXMgYXJlIGZyb20gZ3JvdXAgY2hhdCByb29tcy5cbiAgICBcIi5tLnJ1bGUubWVzc2FnZVwiOiBuZXcgVmVjdG9yUHVzaFJ1bGVEZWZpbml0aW9uKHtcbiAgICAgICAgZGVzY3JpcHRpb246IF90ZChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cnVsZV9tZXNzYWdlXCIpLCAvLyBwYXNzZWQgdGhyb3VnaCBfdCgpIHRyYW5zbGF0aW9uIGluIHNyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL05vdGlmaWNhdGlvbnMuanNcbiAgICAgICAgdmVjdG9yU3RhdGVUb0FjdGlvbnM6IHtcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Pbl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZLFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLkxvdWRdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX05PVElGWV9ERUZBVUxUX1NPVU5ELFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLk9mZl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fRE9OVF9OT1RJRlksXG4gICAgICAgIH0sXG4gICAgICAgIHN5bmNlZFJ1bGVJZHM6IFtSdWxlSWQuUG9sbFN0YXJ0LCBSdWxlSWQuUG9sbFN0YXJ0VW5zdGFibGUsIFJ1bGVJZC5Qb2xsRW5kLCBSdWxlSWQuUG9sbEVuZFVuc3RhYmxlXSxcbiAgICB9KSxcblxuICAgIC8vIEVuY3J5cHRlZCBtZXNzYWdlcyBqdXN0IHNlbnQgdG8gYSBncm91cCBjaGF0IHJvb21cbiAgICAvLyBFbmNyeXB0ZWQgMToxIHJvb20gbWVzc2FnZXMgYXJlIGNhdWdodCBieSB0aGUgLm0ucnVsZS5lbmNyeXB0ZWRfcm9vbV9vbmVfdG9fb25lIHJ1bGUgaWYgYW55IGRlZmluZWRcbiAgICAvLyBCeSBvcHBvc2l0aW9uLCBhbGwgb3RoZXIgcm9vbSBtZXNzYWdlcyBhcmUgZnJvbSBncm91cCBjaGF0IHJvb21zLlxuICAgIFwiLm0ucnVsZS5lbmNyeXB0ZWRcIjogbmV3IFZlY3RvclB1c2hSdWxlRGVmaW5pdGlvbih7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfHJ1bGVfZW5jcnlwdGVkXCIpLCAvLyBwYXNzZWQgdGhyb3VnaCBfdCgpIHRyYW5zbGF0aW9uIGluIHNyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL05vdGlmaWNhdGlvbnMuanNcbiAgICAgICAgdmVjdG9yU3RhdGVUb0FjdGlvbnM6IHtcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Pbl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZLFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLkxvdWRdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX05PVElGWV9ERUZBVUxUX1NPVU5ELFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLk9mZl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fRE9OVF9OT1RJRlksXG4gICAgICAgIH0sXG4gICAgfSksXG5cbiAgICAvLyBJbnZpdGF0aW9uIGZvciB0aGUgdXNlclxuICAgIFwiLm0ucnVsZS5pbnZpdGVfZm9yX21lXCI6IG5ldyBWZWN0b3JQdXNoUnVsZURlZmluaXRpb24oe1xuICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xydWxlX2ludml0ZV9mb3JfbWVcIiksIC8vIHBhc3NlZCB0aHJvdWdoIF90KCkgdHJhbnNsYXRpb24gaW4gc3JjL2NvbXBvbmVudHMvdmlld3Mvc2V0dGluZ3MvTm90aWZpY2F0aW9ucy5qc1xuICAgICAgICB2ZWN0b3JTdGF0ZVRvQWN0aW9uczoge1xuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLk9uXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9OT1RJRlksXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuTG91ZF06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZX0RFRkFVTFRfU09VTkQsXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuT2ZmXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9ESVNBQkxFRCxcbiAgICAgICAgfSxcbiAgICB9KSxcblxuICAgIC8vIEluY29taW5nIGNhbGxcbiAgICBcIi5tLnJ1bGUuY2FsbFwiOiBuZXcgVmVjdG9yUHVzaFJ1bGVEZWZpbml0aW9uKHtcbiAgICAgICAgZGVzY3JpcHRpb246IF90ZChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cnVsZV9jYWxsXCIpLCAvLyBwYXNzZWQgdGhyb3VnaCBfdCgpIHRyYW5zbGF0aW9uIGluIHNyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL05vdGlmaWNhdGlvbnMuanNcbiAgICAgICAgdmVjdG9yU3RhdGVUb0FjdGlvbnM6IHtcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Pbl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZLFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLkxvdWRdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX05PVElGWV9SSU5HX1NPVU5ELFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLk9mZl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fRElTQUJMRUQsXG4gICAgICAgIH0sXG4gICAgfSksXG5cbiAgICAvLyBOb3RpZmljYXRpb25zIGZyb20gYm90c1xuICAgIFwiLm0ucnVsZS5zdXBwcmVzc19ub3RpY2VzXCI6IG5ldyBWZWN0b3JQdXNoUnVsZURlZmluaXRpb24oe1xuICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xydWxlX3N1cHByZXNzX25vdGljZXNcIiksIC8vIHBhc3NlZCB0aHJvdWdoIF90KCkgdHJhbnNsYXRpb24gaW4gc3JjL2NvbXBvbmVudHMvdmlld3Mvc2V0dGluZ3MvTm90aWZpY2F0aW9ucy5qc1xuICAgICAgICB2ZWN0b3JTdGF0ZVRvQWN0aW9uczoge1xuICAgICAgICAgICAgLy8gLm0ucnVsZS5zdXBwcmVzc19ub3RpY2VzIGlzIGEgXCJuZWdhdGl2ZVwiIHJ1bGUsIHdlIGhhdmUgdG8gaW52ZXJ0IGl0cyBlbmFibGVkIHZhbHVlIGZvciB2ZWN0b3IgVUlcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Pbl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fRElTQUJMRUQsXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuTG91ZF06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZX0RFRkFVTFRfU09VTkQsXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuT2ZmXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9ET05UX05PVElGWSxcbiAgICAgICAgfSxcbiAgICB9KSxcblxuICAgIC8vIFJvb20gdXBncmFkZXMgKHRvbWJzdG9uZXMpXG4gICAgXCIubS5ydWxlLnRvbWJzdG9uZVwiOiBuZXcgVmVjdG9yUHVzaFJ1bGVEZWZpbml0aW9uKHtcbiAgICAgICAgZGVzY3JpcHRpb246IF90ZChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cnVsZV90b21ic3RvbmVcIiksIC8vIHBhc3NlZCB0aHJvdWdoIF90KCkgdHJhbnNsYXRpb24gaW4gc3JjL2NvbXBvbmVudHMvdmlld3Mvc2V0dGluZ3MvTm90aWZpY2F0aW9ucy5qc1xuICAgICAgICB2ZWN0b3JTdGF0ZVRvQWN0aW9uczoge1xuICAgICAgICAgICAgLy8gVGhlIGFjdGlvbnMgZm9yIGVhY2ggdmVjdG9yIHN0YXRlLCBvciBudWxsIHRvIGRpc2FibGUgdGhlIHJ1bGUuXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuT25dOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX05PVElGWSxcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Mb3VkXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9ISUdITElHSFQsXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuT2ZmXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9ESVNBQkxFRCxcbiAgICAgICAgfSxcbiAgICB9KSxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsZ0JBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLGdCQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxvQkFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssa0JBQUEsR0FBQUwsT0FBQTtBQWRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQXdCQSxNQUFNTSx3QkFBd0IsQ0FBQztFQUtwQkMsV0FBV0EsQ0FBQ0MsSUFBK0IsRUFBRTtJQUFBLElBQUFDLGdCQUFBLENBQUFDLE9BQUE7SUFBQSxJQUFBRCxnQkFBQSxDQUFBQyxPQUFBO0lBQUEsSUFBQUQsZ0JBQUEsQ0FBQUMsT0FBQTtJQUNoRCxJQUFJLENBQUNDLFdBQVcsR0FBR0gsSUFBSSxDQUFDRyxXQUFXO0lBQ25DLElBQUksQ0FBQ0Msb0JBQW9CLEdBQUdKLElBQUksQ0FBQ0ksb0JBQW9CO0lBQ3JELElBQUksQ0FBQ0MsYUFBYSxHQUFHTCxJQUFJLENBQUNLLGFBQWE7RUFDM0M7O0VBRUE7RUFDT0MsaUJBQWlCQSxDQUFDQyxJQUF3QixFQUEyQjtJQUN4RSxJQUFJQyxPQUFPLEdBQUcsS0FBSztJQUNuQixJQUFJRCxJQUFJLEVBQUU7TUFDTkMsT0FBTyxHQUFHRCxJQUFJLENBQUNDLE9BQU87SUFDMUI7SUFFQSxLQUFLLE1BQU1DLEtBQUssSUFBSUMsTUFBTSxDQUFDQyxNQUFNLENBQUNDLHdDQUFtQixDQUFDQyxNQUFNLENBQUMsRUFBRTtNQUMzRCxNQUFNVCxvQkFBb0IsR0FBRyxJQUFJLENBQUNBLG9CQUFvQixDQUFDSyxLQUFLLENBQUM7TUFFN0QsSUFBSSxDQUFDTCxvQkFBb0IsRUFBRTtRQUN2QjtRQUNBLElBQUksQ0FBQ0ksT0FBTyxFQUFFO1VBQ1YsT0FBT0MsS0FBSztRQUNoQjtNQUNKLENBQUMsTUFBTTtRQUNIO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsSUFDSUQsT0FBTyxJQUNQTSxJQUFJLENBQUNDLFNBQVMsQ0FBQ0Msb0NBQWlCLENBQUNDLGFBQWEsQ0FBQ1YsSUFBSSxDQUFDVyxPQUFPLENBQUMsQ0FBQyxLQUN6REosSUFBSSxDQUFDQyxTQUFTLENBQUNDLG9DQUFpQixDQUFDQyxhQUFhLENBQUNiLG9CQUFvQixDQUFDLENBQUMsRUFDM0U7VUFDRSxPQUFPSyxLQUFLO1FBQ2hCO01BQ0o7SUFDSjtJQUVBVSxjQUFNLENBQUNDLEtBQUssQ0FDUix3REFBd0QsR0FDcEQsU0FBU04sSUFBSSxDQUFDQyxTQUFTLENBQUNSLElBQUksQ0FBQyxJQUFJLEdBQ2pDLGFBQWFPLElBQUksQ0FBQ0MsU0FBUyxDQUFDLElBQUksQ0FBQ1gsb0JBQW9CLENBQUMsRUFDOUQsQ0FBQztJQUNELE9BQU9pQixTQUFTO0VBQ3BCO0FBQ0o7QUFHQTtBQUNBO0FBQ0E7QUFDTyxNQUFNQywwQkFBb0UsR0FBQUMsT0FBQSxDQUFBRCwwQkFBQSxHQUFHO0VBQ2hGO0VBQ0EsK0JBQStCLEVBQUUsSUFBSXhCLHdCQUF3QixDQUFDO0lBQzFESyxXQUFXLEVBQUUsSUFBQXFCLG9CQUFHLEVBQUMsbURBQW1ELENBQUM7SUFBRTtJQUN2RXBCLG9CQUFvQixFQUFFO01BQ2xCO01BQ0EsQ0FBQ3FCLGdDQUFXLENBQUNDLEVBQUUsR0FBR0MsZ0NBQWUsQ0FBQ0MsYUFBYTtNQUMvQyxDQUFDSCxnQ0FBVyxDQUFDSSxJQUFJLEdBQUdGLGdDQUFlLENBQUNHLDhCQUE4QjtNQUNsRSxDQUFDTCxnQ0FBVyxDQUFDTSxHQUFHLEdBQUdKLGdDQUFlLENBQUNLO0lBQ3ZDO0VBQ0osQ0FBQyxDQUFDO0VBRUY7RUFDQSw0QkFBNEIsRUFBRSxJQUFJbEMsd0JBQXdCLENBQUM7SUFDdkRLLFdBQVcsRUFBRSxJQUFBcUIsb0JBQUcsRUFBQyxnREFBZ0QsQ0FBQztJQUFFO0lBQ3BFcEIsb0JBQW9CLEVBQUU7TUFDbEI7TUFDQSxDQUFDcUIsZ0NBQVcsQ0FBQ0MsRUFBRSxHQUFHQyxnQ0FBZSxDQUFDQyxhQUFhO01BQy9DLENBQUNILGdDQUFXLENBQUNJLElBQUksR0FBR0YsZ0NBQWUsQ0FBQ0csOEJBQThCO01BQ2xFLENBQUNMLGdDQUFXLENBQUNNLEdBQUcsR0FBR0osZ0NBQWUsQ0FBQ0s7SUFDdkMsQ0FBQztJQUNEM0IsYUFBYSxFQUFFLENBQUM0QixjQUFNLENBQUNDLGFBQWE7RUFDeEMsQ0FBQyxDQUFDO0VBRUY7RUFDQSxtQkFBbUIsRUFBRSxJQUFJcEMsd0JBQXdCLENBQUM7SUFDOUNLLFdBQVcsRUFBRSxJQUFBcUIsb0JBQUcsRUFBQyx1Q0FBdUMsQ0FBQztJQUFFO0lBQzNEcEIsb0JBQW9CLEVBQUU7TUFDbEI7TUFDQSxDQUFDcUIsZ0NBQVcsQ0FBQ0MsRUFBRSxHQUFHQyxnQ0FBZSxDQUFDQyxhQUFhO01BQy9DLENBQUNILGdDQUFXLENBQUNJLElBQUksR0FBR0YsZ0NBQWUsQ0FBQ1EsZ0JBQWdCO01BQ3BELENBQUNWLGdDQUFXLENBQUNNLEdBQUcsR0FBR0osZ0NBQWUsQ0FBQ0s7SUFDdkMsQ0FBQztJQUNEM0IsYUFBYSxFQUFFLENBQUM0QixjQUFNLENBQUNHLGFBQWE7RUFDeEMsQ0FBQyxDQUFDO0VBRUY7RUFDQSx5QkFBeUIsRUFBRSxJQUFJdEMsd0JBQXdCLENBQUM7SUFDcERLLFdBQVcsRUFBRSxJQUFBcUIsb0JBQUcsRUFBQyw2Q0FBNkMsQ0FBQztJQUFFO0lBQ2pFcEIsb0JBQW9CLEVBQUU7TUFDbEIsQ0FBQ3FCLGdDQUFXLENBQUNDLEVBQUUsR0FBR0MsZ0NBQWUsQ0FBQ0MsYUFBYTtNQUMvQyxDQUFDSCxnQ0FBVyxDQUFDSSxJQUFJLEdBQUdGLGdDQUFlLENBQUNVLDJCQUEyQjtNQUMvRCxDQUFDWixnQ0FBVyxDQUFDTSxHQUFHLEdBQUdKLGdDQUFlLENBQUNXO0lBQ3ZDLENBQUM7SUFDRGpDLGFBQWEsRUFBRSxDQUNYNEIsY0FBTSxDQUFDTSxpQkFBaUIsRUFDeEJOLGNBQU0sQ0FBQ08seUJBQXlCLEVBQ2hDUCxjQUFNLENBQUNRLGVBQWUsRUFDdEJSLGNBQU0sQ0FBQ1MsdUJBQXVCO0VBRXRDLENBQUMsQ0FBQztFQUVGO0VBQ0EsbUNBQW1DLEVBQUUsSUFBSTVDLHdCQUF3QixDQUFDO0lBQzlESyxXQUFXLEVBQUUsSUFBQXFCLG9CQUFHLEVBQUMsdURBQXVELENBQUM7SUFBRTtJQUMzRXBCLG9CQUFvQixFQUFFO01BQ2xCLENBQUNxQixnQ0FBVyxDQUFDQyxFQUFFLEdBQUdDLGdDQUFlLENBQUNDLGFBQWE7TUFDL0MsQ0FBQ0gsZ0NBQVcsQ0FBQ0ksSUFBSSxHQUFHRixnQ0FBZSxDQUFDVSwyQkFBMkI7TUFDL0QsQ0FBQ1osZ0NBQVcsQ0FBQ00sR0FBRyxHQUFHSixnQ0FBZSxDQUFDVztJQUN2QztFQUNKLENBQUMsQ0FBQztFQUVGO0VBQ0E7RUFDQTtFQUNBLGlCQUFpQixFQUFFLElBQUl4Qyx3QkFBd0IsQ0FBQztJQUM1Q0ssV0FBVyxFQUFFLElBQUFxQixvQkFBRyxFQUFDLHFDQUFxQyxDQUFDO0lBQUU7SUFDekRwQixvQkFBb0IsRUFBRTtNQUNsQixDQUFDcUIsZ0NBQVcsQ0FBQ0MsRUFBRSxHQUFHQyxnQ0FBZSxDQUFDQyxhQUFhO01BQy9DLENBQUNILGdDQUFXLENBQUNJLElBQUksR0FBR0YsZ0NBQWUsQ0FBQ1UsMkJBQTJCO01BQy9ELENBQUNaLGdDQUFXLENBQUNNLEdBQUcsR0FBR0osZ0NBQWUsQ0FBQ1c7SUFDdkMsQ0FBQztJQUNEakMsYUFBYSxFQUFFLENBQUM0QixjQUFNLENBQUNVLFNBQVMsRUFBRVYsY0FBTSxDQUFDVyxpQkFBaUIsRUFBRVgsY0FBTSxDQUFDWSxPQUFPLEVBQUVaLGNBQU0sQ0FBQ2EsZUFBZTtFQUN0RyxDQUFDLENBQUM7RUFFRjtFQUNBO0VBQ0E7RUFDQSxtQkFBbUIsRUFBRSxJQUFJaEQsd0JBQXdCLENBQUM7SUFDOUNLLFdBQVcsRUFBRSxJQUFBcUIsb0JBQUcsRUFBQyx1Q0FBdUMsQ0FBQztJQUFFO0lBQzNEcEIsb0JBQW9CLEVBQUU7TUFDbEIsQ0FBQ3FCLGdDQUFXLENBQUNDLEVBQUUsR0FBR0MsZ0NBQWUsQ0FBQ0MsYUFBYTtNQUMvQyxDQUFDSCxnQ0FBVyxDQUFDSSxJQUFJLEdBQUdGLGdDQUFlLENBQUNVLDJCQUEyQjtNQUMvRCxDQUFDWixnQ0FBVyxDQUFDTSxHQUFHLEdBQUdKLGdDQUFlLENBQUNXO0lBQ3ZDO0VBQ0osQ0FBQyxDQUFDO0VBRUY7RUFDQSx1QkFBdUIsRUFBRSxJQUFJeEMsd0JBQXdCLENBQUM7SUFDbERLLFdBQVcsRUFBRSxJQUFBcUIsb0JBQUcsRUFBQywyQ0FBMkMsQ0FBQztJQUFFO0lBQy9EcEIsb0JBQW9CLEVBQUU7TUFDbEIsQ0FBQ3FCLGdDQUFXLENBQUNDLEVBQUUsR0FBR0MsZ0NBQWUsQ0FBQ0MsYUFBYTtNQUMvQyxDQUFDSCxnQ0FBVyxDQUFDSSxJQUFJLEdBQUdGLGdDQUFlLENBQUNVLDJCQUEyQjtNQUMvRCxDQUFDWixnQ0FBVyxDQUFDTSxHQUFHLEdBQUdKLGdDQUFlLENBQUNLO0lBQ3ZDO0VBQ0osQ0FBQyxDQUFDO0VBRUY7RUFDQSxjQUFjLEVBQUUsSUFBSWxDLHdCQUF3QixDQUFDO0lBQ3pDSyxXQUFXLEVBQUUsSUFBQXFCLG9CQUFHLEVBQUMsa0NBQWtDLENBQUM7SUFBRTtJQUN0RHBCLG9CQUFvQixFQUFFO01BQ2xCLENBQUNxQixnQ0FBVyxDQUFDQyxFQUFFLEdBQUdDLGdDQUFlLENBQUNDLGFBQWE7TUFDL0MsQ0FBQ0gsZ0NBQVcsQ0FBQ0ksSUFBSSxHQUFHRixnQ0FBZSxDQUFDb0Isd0JBQXdCO01BQzVELENBQUN0QixnQ0FBVyxDQUFDTSxHQUFHLEdBQUdKLGdDQUFlLENBQUNLO0lBQ3ZDO0VBQ0osQ0FBQyxDQUFDO0VBRUY7RUFDQSwwQkFBMEIsRUFBRSxJQUFJbEMsd0JBQXdCLENBQUM7SUFDckRLLFdBQVcsRUFBRSxJQUFBcUIsb0JBQUcsRUFBQyw4Q0FBOEMsQ0FBQztJQUFFO0lBQ2xFcEIsb0JBQW9CLEVBQUU7TUFDbEI7TUFDQSxDQUFDcUIsZ0NBQVcsQ0FBQ0MsRUFBRSxHQUFHQyxnQ0FBZSxDQUFDSyxlQUFlO01BQ2pELENBQUNQLGdDQUFXLENBQUNJLElBQUksR0FBR0YsZ0NBQWUsQ0FBQ1UsMkJBQTJCO01BQy9ELENBQUNaLGdDQUFXLENBQUNNLEdBQUcsR0FBR0osZ0NBQWUsQ0FBQ1c7SUFDdkM7RUFDSixDQUFDLENBQUM7RUFFRjtFQUNBLG1CQUFtQixFQUFFLElBQUl4Qyx3QkFBd0IsQ0FBQztJQUM5Q0ssV0FBVyxFQUFFLElBQUFxQixvQkFBRyxFQUFDLHVDQUF1QyxDQUFDO0lBQUU7SUFDM0RwQixvQkFBb0IsRUFBRTtNQUNsQjtNQUNBLENBQUNxQixnQ0FBVyxDQUFDQyxFQUFFLEdBQUdDLGdDQUFlLENBQUNDLGFBQWE7TUFDL0MsQ0FBQ0gsZ0NBQVcsQ0FBQ0ksSUFBSSxHQUFHRixnQ0FBZSxDQUFDUSxnQkFBZ0I7TUFDcEQsQ0FBQ1YsZ0NBQVcsQ0FBQ00sR0FBRyxHQUFHSixnQ0FBZSxDQUFDSztJQUN2QztFQUNKLENBQUM7QUFDTCxDQUFDIiwiaWdub3JlTGlzdCI6W119