com.phloxui
Version:
PhloxUI Ng2+ Framework
1,101 lines (1,100 loc) • 96.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
var /** @type {?} */ KEY_MODIFIER = ["ctrl", "shift", "option", "alt", "command", "control"];
var /** @type {?} */ KEY_MODIFIER_CODE = [17, 16, 18, 91, 93, 224];
var KeyboardShortcutService = /** @class */ (function () {
function KeyboardShortcutService() {
var _this = this;
this.DEFAULT_KEYDOWN_MS = 1000;
this.DEFAULT_BADGE_SPACE = 3;
this.DEFAULT_FADEOUT_MS = 300;
this.nameMapping = {};
this.nameHandler = {};
this.keyHandler = {};
this.keyHintAnchor = {};
this.bindedKeys = [];
// check key up & down
$(document).on('keydown', function (keyEvent) {
if (_this.keydownTimer === undefined) {
_this.keydownTimer = setTimeout(function () {
for (var /** @type {?} */ keyHint in _this.keyHintAnchor) {
var /** @type {?} */ shortcutArray = _this.keyHintAnchor[keyHint];
var /** @type {?} */ pass = (keyHint === KEY_MODIFIER[0] && key.control) || (keyHint === KEY_MODIFIER[1] && key.shift)
|| (keyHint === KEY_MODIFIER[2] && key.option) || (keyHint === KEY_MODIFIER[3] && key.alt)
|| (keyHint === KEY_MODIFIER[4] && key.command);
var /** @type {?} */ outOfModify = true;
var /** @type {?} */ passedArray = key.getPressedKeyCodes();
try {
for (var passedArray_1 = tslib_1.__values(passedArray), passedArray_1_1 = passedArray_1.next(); !passedArray_1_1.done; passedArray_1_1 = passedArray_1.next()) {
var passed = passedArray_1_1.value;
if (KEY_MODIFIER_CODE.indexOf(passed) < 0) {
outOfModify = false;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (passedArray_1_1 && !passedArray_1_1.done && (_a = passedArray_1.return)) _a.call(passedArray_1);
}
finally { if (e_1) throw e_1.error; }
}
if (pass && outOfModify) {
try {
for (var shortcutArray_1 = tslib_1.__values(shortcutArray), shortcutArray_1_1 = shortcutArray_1.next(); !shortcutArray_1_1.done; shortcutArray_1_1 = shortcutArray_1.next()) {
var shortcut = shortcutArray_1_1.value;
var /** @type {?} */ keysArray = _this.getNameKeyControls(shortcut.shortcut);
// shortcut as name
if (keysArray !== null && keysArray !== undefined) {
try {
for (var keysArray_1 = tslib_1.__values(keysArray), keysArray_1_1 = keysArray_1.next(); !keysArray_1_1.done; keysArray_1_1 = keysArray_1.next()) {
var keyCtrl = keysArray_1_1.value;
if (_this.isModifierKeyEqual(keyCtrl, keyEvent)) {
_this.addHintKey(shortcut.hintAnchorElements, keyCtrl, shortcut.hintLabel);
}
/* open here if u want to show all */
// this.addHintKey(shortcut.hintAnchorElements, keyCtrl, shortcut.hintLabel);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (keysArray_1_1 && !keysArray_1_1.done && (_b = keysArray_1.return)) _b.call(keysArray_1);
}
finally { if (e_2) throw e_2.error; }
}
}
else {
// keyCtrl as shortcut
var /** @type {?} */ keyCtrl = shortcut.shortcut;
_this.addHintKey(shortcut.hintAnchorElements, keyCtrl, shortcut.hintLabel);
}
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (shortcutArray_1_1 && !shortcutArray_1_1.done && (_c = shortcutArray_1.return)) _c.call(shortcutArray_1);
}
finally { if (e_3) throw e_3.error; }
}
}
}
var e_1, _a, e_3, _c, e_2, _b;
}, _this.DEFAULT_KEYDOWN_MS);
}
});
$(document).on('keyup', function () {
if (_this.keydownTimer !== null && typeof _this.keydownTimer !== 'undefined') {
clearTimeout(_this.keydownTimer);
}
// remove all hint key
for (var /** @type {?} */ keyHint in _this.keyHintAnchor) {
var /** @type {?} */ shortcutArray = _this.keyHintAnchor[keyHint];
try {
for (var shortcutArray_2 = tslib_1.__values(shortcutArray), shortcutArray_2_1 = shortcutArray_2.next(); !shortcutArray_2_1.done; shortcutArray_2_1 = shortcutArray_2.next()) {
var shortcut = shortcutArray_2_1.value;
_this.removeHintKey(shortcut.hintAnchorElements);
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (shortcutArray_2_1 && !shortcutArray_2_1.done && (_a = shortcutArray_2.return)) _a.call(shortcutArray_2);
}
finally { if (e_4) throw e_4.error; }
}
}
_this.keydownTimer = undefined;
var e_4, _a;
});
}
/**
* @param {?} modKey
* @return {?}
*/
KeyboardShortcutService.prototype.isModifierKey = /**
* @param {?} modKey
* @return {?}
*/
function (modKey) {
if (modKey === null || modKey === undefined) {
return;
}
return KEY_MODIFIER.indexOf(modKey) >= 0;
};
/**
* @param {?} keyCtrl
* @param {?} keyEvent
* @return {?}
*/
KeyboardShortcutService.prototype.isModifierKeyEqual = /**
* @param {?} keyCtrl
* @param {?} keyEvent
* @return {?}
*/
function (keyCtrl, keyEvent) {
if (keyEvent === undefined || keyCtrl === undefined) {
return false;
}
var /** @type {?} */ index = keyCtrl.indexOf('+');
if (index >= 0) {
// has +
var /** @type {?} */ split = keyCtrl.split("+");
var /** @type {?} */ singleKey = split[0].toLowerCase();
var /** @type {?} */ currentKey = (keyEvent.key !== undefined) ? keyEvent.key.toLowerCase() : undefined;
if (singleKey === 'ctrl') {
singleKey = "control";
}
else if (singleKey === 'cmd') {
singleKey = "command";
}
// check cmd btn
if (currentKey === 'meta' && (keyEvent.keyCode === 91 || keyEvent.keyCode === 93)) {
// for chrome
currentKey = "command";
}
else if (currentKey === 'meta' && (keyEvent.keyCode === 224)) {
// for firefox
currentKey = "command";
}
if (singleKey === currentKey) {
return true;
}
}
return false;
};
/**
* @param {?} value
* @return {?}
*/
KeyboardShortcutService.prototype.capitalizeFirstLetter = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value === null || value === undefined) {
return value;
}
return value.charAt(0).toUpperCase() + value.slice(1);
};
/**
* @param {?} shortcut
* @return {?}
*/
KeyboardShortcutService.prototype.addNameHintAnchorMap = /**
* @param {?} shortcut
* @return {?}
*/
function (shortcut) {
if (shortcut === null || shortcut === undefined) {
return;
}
var /** @type {?} */ name = shortcut.shortcut;
if (name === null || name === undefined) {
return;
}
name = name.toLowerCase();
var /** @type {?} */ keysArray = this.getNameKeyControls(name);
if (keysArray !== null && keysArray !== undefined) {
try {
for (var keysArray_2 = tslib_1.__values(keysArray), keysArray_2_1 = keysArray_2.next(); !keysArray_2_1.done; keysArray_2_1 = keysArray_2.next()) {
var keyCtrl = keysArray_2_1.value;
this.addKeyHintAnchorMap(keyCtrl, shortcut);
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (keysArray_2_1 && !keysArray_2_1.done && (_a = keysArray_2.return)) _a.call(keysArray_2);
}
finally { if (e_5) throw e_5.error; }
}
}
var e_5, _a;
};
/**
* @param {?} shortcut
* @return {?}
*/
KeyboardShortcutService.prototype.removeNameHintAnchorMap = /**
* @param {?} shortcut
* @return {?}
*/
function (shortcut) {
if (shortcut === null || shortcut === undefined) {
return;
}
var /** @type {?} */ name = shortcut.shortcut;
if (name === null || name === undefined) {
return;
}
name = name.toLowerCase();
var /** @type {?} */ keysArray = this.getNameKeyControls(name);
if (keysArray !== null && keysArray !== undefined) {
try {
for (var keysArray_3 = tslib_1.__values(keysArray), keysArray_3_1 = keysArray_3.next(); !keysArray_3_1.done; keysArray_3_1 = keysArray_3.next()) {
var keyCtrl = keysArray_3_1.value;
this.removeKeyHintAnchorMap(keyCtrl, shortcut);
}
}
catch (e_6_1) { e_6 = { error: e_6_1 }; }
finally {
try {
if (keysArray_3_1 && !keysArray_3_1.done && (_a = keysArray_3.return)) _a.call(keysArray_3);
}
finally { if (e_6) throw e_6.error; }
}
}
var e_6, _a;
};
/**
* @param {?} keyCtrl
* @param {?} shortcut
* @return {?}
*/
KeyboardShortcutService.prototype.addKeyHintAnchorMap = /**
* @param {?} keyCtrl
* @param {?} shortcut
* @return {?}
*/
function (keyCtrl, shortcut) {
if (keyCtrl === null || keyCtrl === undefined) {
return;
}
keyCtrl = keyCtrl.toLowerCase();
if (shortcut === null || shortcut === undefined) {
return;
}
var /** @type {?} */ index = keyCtrl.indexOf('+');
if (index >= 0) {
// has +
var /** @type {?} */ split = keyCtrl.split("+");
try {
for (var split_1 = tslib_1.__values(split), split_1_1 = split_1.next(); !split_1_1.done; split_1_1 = split_1.next()) {
var sKey = split_1_1.value;
if (this.isModifierKey(sKey)) {
// add hintAnchor
var /** @type {?} */ anchors = this.keyHintAnchor[sKey];
if (anchors === null || anchors === undefined) {
this.keyHintAnchor[sKey] = [];
}
this.keyHintAnchor[sKey].push(shortcut);
}
}
}
catch (e_7_1) { e_7 = { error: e_7_1 }; }
finally {
try {
if (split_1_1 && !split_1_1.done && (_a = split_1.return)) _a.call(split_1);
}
finally { if (e_7) throw e_7.error; }
}
}
var e_7, _a;
};
/**
* @param {?} keyCtrl
* @param {?} shortcut
* @return {?}
*/
KeyboardShortcutService.prototype.removeKeyHintAnchorMap = /**
* @param {?} keyCtrl
* @param {?} shortcut
* @return {?}
*/
function (keyCtrl, shortcut) {
if (keyCtrl === null || keyCtrl === undefined) {
return;
}
keyCtrl = keyCtrl.toLowerCase();
var /** @type {?} */ index = keyCtrl.indexOf('+');
if (index >= 0) {
// has +
var /** @type {?} */ split = keyCtrl.split("+");
var /** @type {?} */ handler = shortcut.handler;
try {
for (var split_2 = tslib_1.__values(split), split_2_1 = split_2.next(); !split_2_1.done; split_2_1 = split_2.next()) {
var sKey = split_2_1.value;
if (this.isModifierKey(sKey)) {
// add hintAnchor
var /** @type {?} */ anchors = this.keyHintAnchor[sKey];
if (anchors === null || anchors === undefined) {
continue;
}
var /** @type {?} */ toDeleteObjs = [];
try {
for (var _a = tslib_1.__values(this.keyHintAnchor[sKey]), _b = _a.next(); !_b.done; _b = _a.next()) {
var check = _b.value;
if ((check.shortcut === shortcut.shortcut) && (check.handler.toString() === handler.toString())) {
toDeleteObjs.push(check);
}
}
}
catch (e_8_1) { e_8 = { error: e_8_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_8) throw e_8.error; }
}
try {
// remove
for (var toDeleteObjs_1 = tslib_1.__values(toDeleteObjs), toDeleteObjs_1_1 = toDeleteObjs_1.next(); !toDeleteObjs_1_1.done; toDeleteObjs_1_1 = toDeleteObjs_1.next()) {
var delObj = toDeleteObjs_1_1.value;
var /** @type {?} */ index_1 = this.keyHintAnchor[sKey].indexOf(delObj);
this.keyHintAnchor[sKey].splice(index_1, 1);
}
}
catch (e_9_1) { e_9 = { error: e_9_1 }; }
finally {
try {
if (toDeleteObjs_1_1 && !toDeleteObjs_1_1.done && (_d = toDeleteObjs_1.return)) _d.call(toDeleteObjs_1);
}
finally { if (e_9) throw e_9.error; }
}
if (this.keyHintAnchor[sKey].length <= 0) {
delete this.keyHintAnchor[sKey];
}
}
}
}
catch (e_10_1) { e_10 = { error: e_10_1 }; }
finally {
try {
if (split_2_1 && !split_2_1.done && (_e = split_2.return)) _e.call(split_2);
}
finally { if (e_10) throw e_10.error; }
}
}
var e_10, _e, e_8, _c, e_9, _d;
};
/**
* @param {?} name
* @return {?}
*/
KeyboardShortcutService.prototype.bindName = /**
* @param {?} name
* @return {?}
*/
function (name) {
if (name === null || name === undefined) {
return;
}
name = name.toLowerCase();
var /** @type {?} */ keysArray = this.getNameKeyControls(name);
if (keysArray === null || keysArray === undefined || keysArray.length <= 0) {
return;
}
try {
for (var keysArray_4 = tslib_1.__values(keysArray), keysArray_4_1 = keysArray_4.next(); !keysArray_4_1.done; keysArray_4_1 = keysArray_4.next()) {
var keyCtrl = keysArray_4_1.value;
// no bind if key already bind overide nameHandler with key
if (this.keyHandler[keyCtrl] !== undefined) {
continue;
}
if (this.nameHandler[name] !== undefined) {
this.bind(keyCtrl, this.nameHandler[name]);
}
}
}
catch (e_11_1) { e_11 = { error: e_11_1 }; }
finally {
try {
if (keysArray_4_1 && !keysArray_4_1.done && (_a = keysArray_4.return)) _a.call(keysArray_4);
}
finally { if (e_11) throw e_11.error; }
}
var e_11, _a;
};
/**
* @param {?} keyCtrl
* @return {?}
*/
KeyboardShortcutService.prototype.bindKey = /**
* @param {?} keyCtrl
* @return {?}
*/
function (keyCtrl) {
if (this.keyHandler[keyCtrl] !== undefined) {
this.bind(keyCtrl, this.keyHandler[keyCtrl]);
}
};
/**
* @param {?} keyCtrl
* @param {?} handlers
* @return {?}
*/
KeyboardShortcutService.prototype.bind = /**
* @param {?} keyCtrl
* @param {?} handlers
* @return {?}
*/
function (keyCtrl, handlers) {
var _this = this;
if (keyCtrl === null || keyCtrl === undefined) {
return;
}
keyCtrl = keyCtrl.toLowerCase();
key(keyCtrl, function () {
if (handlers !== null && handlers !== undefined) {
try {
for (var handlers_1 = tslib_1.__values(handlers), handlers_1_1 = handlers_1.next(); !handlers_1_1.done; handlers_1_1 = handlers_1.next()) {
var func = handlers_1_1.value;
if (typeof func === 'function') {
func.call(_this, _this); // inject keyboard service
}
}
}
catch (e_12_1) { e_12 = { error: e_12_1 }; }
finally {
try {
if (handlers_1_1 && !handlers_1_1.done && (_a = handlers_1.return)) _a.call(handlers_1);
}
finally { if (e_12) throw e_12.error; }
}
}
var e_12, _a;
});
};
/**
* @param {?} name
* @return {?}
*/
KeyboardShortcutService.prototype.unbindName = /**
* @param {?} name
* @return {?}
*/
function (name) {
if (name === null || name === undefined) {
return;
}
var /** @type {?} */ keysArray = this.getNameKeyControls(name);
if (keysArray !== null && keysArray !== undefined) {
try {
for (var keysArray_5 = tslib_1.__values(keysArray), keysArray_5_1 = keysArray_5.next(); !keysArray_5_1.done; keysArray_5_1 = keysArray_5.next()) {
var keyCtrl = keysArray_5_1.value;
this.unbindKey(keyCtrl);
}
}
catch (e_13_1) { e_13 = { error: e_13_1 }; }
finally {
try {
if (keysArray_5_1 && !keysArray_5_1.done && (_a = keysArray_5.return)) _a.call(keysArray_5);
}
finally { if (e_13) throw e_13.error; }
}
}
var e_13, _a;
};
/**
* @param {?} keyCtrl
* @return {?}
*/
KeyboardShortcutService.prototype.unbindKey = /**
* @param {?} keyCtrl
* @return {?}
*/
function (keyCtrl) {
if (keyCtrl === null || keyCtrl === undefined) {
return;
}
keyCtrl = keyCtrl.toLowerCase();
key.unbind(keyCtrl);
};
/**
* @param {?} hintAnchorElements
* @param {?} name
* @param {?} hintLabel
* @return {?}
*/
KeyboardShortcutService.prototype.addHintName = /**
* @param {?} hintAnchorElements
* @param {?} name
* @param {?} hintLabel
* @return {?}
*/
function (hintAnchorElements, name, hintLabel) {
if (hintAnchorElements === null || hintAnchorElements === undefined) {
return;
}
if (name === null || name === undefined) {
return;
}
var /** @type {?} */ keysArray = this.getNameKeyControls(name);
if (keysArray !== null && keysArray !== undefined) {
try {
for (var keysArray_6 = tslib_1.__values(keysArray), keysArray_6_1 = keysArray_6.next(); !keysArray_6_1.done; keysArray_6_1 = keysArray_6.next()) {
var keyCtrl = keysArray_6_1.value;
this.addHintKey(hintAnchorElements, keyCtrl, hintLabel);
}
}
catch (e_14_1) { e_14 = { error: e_14_1 }; }
finally {
try {
if (keysArray_6_1 && !keysArray_6_1.done && (_a = keysArray_6.return)) _a.call(keysArray_6);
}
finally { if (e_14) throw e_14.error; }
}
}
var e_14, _a;
};
/**
* @param {?} hintAnchorElements
* @param {?} keyCtrl
* @param {?} hintLabel
* @return {?}
*/
KeyboardShortcutService.prototype.addHintKey = /**
* @param {?} hintAnchorElements
* @param {?} keyCtrl
* @param {?} hintLabel
* @return {?}
*/
function (hintAnchorElements, keyCtrl, hintLabel) {
if (hintAnchorElements === null || hintAnchorElements === undefined) {
return;
}
if (keyCtrl === null || keyCtrl === undefined) {
return;
}
keyCtrl = keyCtrl.toLowerCase();
var /** @type {?} */ elements = [];
if (Array.isArray(hintAnchorElements)) {
elements = hintAnchorElements;
}
else {
elements.push(hintAnchorElements);
}
var /** @type {?} */ title = hintLabel;
// default if no hintLabel
if (title === null || title === undefined) {
title = this.capitalizeFirstLetter(keyCtrl);
var /** @type {?} */ name_1 = this.getKeyMappingName(keyCtrl);
if (name_1 !== null && name_1 !== undefined) {
title = this.capitalizeFirstLetter(name_1) + "</br>(" + title + ")";
}
}
try {
for (var elements_1 = tslib_1.__values(elements), elements_1_1 = elements_1.next(); !elements_1_1.done; elements_1_1 = elements_1.next()) {
var anyElement = elements_1_1.value;
var /** @type {?} */ badgeHTML = '<span class="badge scService">' + title + '</span>';
if (typeof anyElement === 'string') {
// jqSelector: String
var /** @type {?} */ width = $(anyElement).width() - this.DEFAULT_BADGE_SPACE;
var /** @type {?} */ badgeElement = $(badgeHTML);
badgeElement.css({ "max-width": width });
$(anyElement).append(badgeElement);
}
else if (anyElement !== undefined && typeof anyElement.innerHTML === 'function') {
// DOM/Native Element
var /** @type {?} */ width = $(anyElement).width() - this.DEFAULT_BADGE_SPACE;
var /** @type {?} */ badgeElement = $(badgeHTML);
badgeElement.css({ "max-width": width });
$(anyElement).append(badgeElement);
}
else if (anyElement !== undefined) {
// NgComp
if (typeof anyElement["getElementRef"] === 'function') {
var /** @type {?} */ eleRef = anyElement.getElementRef();
if (eleRef !== null && eleRef !== undefined) {
var /** @type {?} */ width = $(eleRef.nativeElement).width() - this.DEFAULT_BADGE_SPACE;
var /** @type {?} */ badgeElement = $(badgeHTML);
badgeElement.css({ "max-width": width });
$(eleRef.nativeElement).append(badgeElement);
}
}
}
}
}
catch (e_15_1) { e_15 = { error: e_15_1 }; }
finally {
try {
if (elements_1_1 && !elements_1_1.done && (_a = elements_1.return)) _a.call(elements_1);
}
finally { if (e_15) throw e_15.error; }
}
var e_15, _a;
};
/**
* @param {?} hintAnchorElements
* @return {?}
*/
KeyboardShortcutService.prototype.removeHintKey = /**
* @param {?} hintAnchorElements
* @return {?}
*/
function (hintAnchorElements) {
if (hintAnchorElements === null || hintAnchorElements === undefined) {
return;
}
var /** @type {?} */ elements = [];
if (Array.isArray(hintAnchorElements)) {
elements = hintAnchorElements;
}
else {
elements.push(hintAnchorElements);
}
var _loop_1 = function (anyElement) {
if (typeof anyElement === 'string') {
// jqSelector: String
$(anyElement).find(".scService").addClass("fadeout");
setTimeout(function () {
$(anyElement).find(".scService.fadeout").remove();
}, this_1.DEFAULT_FADEOUT_MS);
}
else if (anyElement !== undefined && typeof anyElement.innerHTML === 'function') {
// DOM/Native Element
$(anyElement).find(".scService").addClass("fadeout");
setTimeout(function () {
$(anyElement).find(".scService.fadeout").remove();
}, this_1.DEFAULT_FADEOUT_MS);
}
else if (anyElement !== undefined) {
// NgComp
if (typeof anyElement["getElementRef"] === 'function') {
var /** @type {?} */ eleRef_1 = anyElement.getElementRef();
if (eleRef_1 !== null && eleRef_1 !== undefined) {
$(eleRef_1.nativeElement).find(".scService").addClass("fadeout");
setTimeout(function () {
$(eleRef_1.nativeElement).find(".scService.fadeout").remove();
}, this_1.DEFAULT_FADEOUT_MS);
}
}
}
};
var this_1 = this;
try {
for (var elements_2 = tslib_1.__values(elements), elements_2_1 = elements_2.next(); !elements_2_1.done; elements_2_1 = elements_2.next()) {
var anyElement = elements_2_1.value;
_loop_1(anyElement);
}
}
catch (e_16_1) { e_16 = { error: e_16_1 }; }
finally {
try {
if (elements_2_1 && !elements_2_1.done && (_a = elements_2.return)) _a.call(elements_2);
}
finally { if (e_16) throw e_16.error; }
}
var e_16, _a;
};
/**
* @param {?} key
* @param {?} handler
* @return {?}
*/
KeyboardShortcutService.prototype._addKeyHandler = /**
* @param {?} key
* @param {?} handler
* @return {?}
*/
function (key, handler) {
if (key === null || key === undefined) {
return;
}
var /** @type {?} */ handlers = this.keyHandler[key];
if (handlers === null || handlers === undefined) {
handlers = [];
this.keyHandler[key] = handlers;
}
this.keyHandler[key].push(handler);
if (this.bindedKeys.indexOf(key) >= 0) {
// unbind then bind
this.unbindKey(key);
this.bindKey(key);
}
else {
// bind and add bindedKeys
this.bindKey(key);
this.bindedKeys.push(key);
}
};
/**
* @param {?} key
* @return {?}
*/
KeyboardShortcutService.prototype.getKeyMappingName = /**
* @param {?} key
* @return {?}
*/
function (key) {
for (var /** @type {?} */ name_2 in this.nameMapping) {
var /** @type {?} */ keyArray = this.nameMapping[name_2];
if (keyArray.indexOf(key) >= 0) {
return name_2;
}
}
return null;
};
/**
* @param {?} name
* @param {?} key
* @return {?}
*/
KeyboardShortcutService.prototype.setNameMapping = /**
* @param {?} name
* @param {?} key
* @return {?}
*/
function (name, key) {
var /** @type {?} */ keysArray = this.nameMapping[name];
if (keysArray === null || keysArray === undefined) {
this.nameMapping[name] = [];
this.nameMapping[name].push(key);
}
else {
// if no key just push it
if (this.nameMapping[name].indexOf(key) < 0) {
this.nameMapping[name].push(key);
}
}
};
/**
* @param {?} name
* @return {?}
*/
KeyboardShortcutService.prototype.getNameKeyControls = /**
* @param {?} name
* @return {?}
*/
function (name) {
return this.nameMapping[name];
};
/**
* @param {?} mappings
* @return {?}
*/
KeyboardShortcutService.prototype.mergeNameMappings = /**
* @param {?} mappings
* @return {?}
*/
function (mappings) {
if (mappings === null || mappings === undefined) {
return;
}
for (var /** @type {?} */ name_3 in mappings) {
var /** @type {?} */ val = mappings[name_3];
if (typeof val === 'string') {
this.setNameMapping(name_3, val);
}
else if (Array.isArray(val)) {
try {
for (var val_1 = tslib_1.__values(val), val_1_1 = val_1.next(); !val_1_1.done; val_1_1 = val_1.next()) {
var innerVal = val_1_1.value;
this.setNameMapping(name_3, innerVal);
}
}
catch (e_17_1) { e_17 = { error: e_17_1 }; }
finally {
try {
if (val_1_1 && !val_1_1.done && (_a = val_1.return)) _a.call(val_1);
}
finally { if (e_17) throw e_17.error; }
}
}
}
var e_17, _a;
};
/**
* @return {?}
*/
KeyboardShortcutService.prototype.getNameMapping = /**
* @return {?}
*/
function () {
return this.nameMapping;
};
/**
* @return {?}
*/
KeyboardShortcutService.prototype.getNames = /**
* @return {?}
*/
function () {
var /** @type {?} */ result = [];
for (var /** @type {?} */ key_1 in this.nameMapping) {
result.push(key_1);
}
return result;
};
/**
* @return {?}
*/
KeyboardShortcutService.prototype.clearNameMappings = /**
* @return {?}
*/
function () {
this.nameMapping = {};
};
/**
* @param {?} shortcut
* @return {?}
*/
KeyboardShortcutService.prototype.addNameHandler = /**
* @param {?} shortcut
* @return {?}
*/
function (shortcut) {
if (shortcut === null || shortcut === undefined) {
return;
}
var /** @type {?} */ name = shortcut.shortcut;
if (name === null || name === undefined) {
return;
}
name = name.toLowerCase();
if (name === null || name === undefined) {
return;
}
var /** @type {?} */ handlers = this.nameHandler[name];
if (handlers === null || handlers === undefined) {
handlers = [];
this.nameHandler[name] = handlers;
}
this.nameHandler[name].push(shortcut.handler);
// add hint
this.addNameHintAnchorMap(shortcut);
this.bindName(name);
};
/**
* @param {?} shortcut
* @return {?}
*/
KeyboardShortcutService.prototype.removeNameHandler = /**
* @param {?} shortcut
* @return {?}
*/
function (shortcut) {
if (shortcut === null || shortcut === undefined) {
return;
}
var /** @type {?} */ name = shortcut.shortcut;
var /** @type {?} */ handler = shortcut.handler;
if (name === null || name === undefined) {
return;
}
name = name.toLowerCase();
var /** @type {?} */ handlers = this.nameHandler[name];
if (handlers === null || handlers === undefined) {
return;
}
var /** @type {?} */ index = -1;
try {
for (var handlers_2 = tslib_1.__values(handlers), handlers_2_1 = handlers_2.next(); !handlers_2_1.done; handlers_2_1 = handlers_2.next()) {
var h = handlers_2_1.value;
index += 1;
if (h.toString() === handler.toString()) {
break;
}
}
}
catch (e_18_1) { e_18 = { error: e_18_1 }; }
finally {
try {
if (handlers_2_1 && !handlers_2_1.done && (_a = handlers_2.return)) _a.call(handlers_2);
}
finally { if (e_18) throw e_18.error; }
}
if (index >= 0) {
handlers.splice(index, 1);
}
// remove name hint
this.removeNameHintAnchorMap(shortcut);
this.unbindName(name);
if (handlers.length > 0) {
this.bindName(name);
}
var e_18, _a;
};
/**
* @param {?} name
* @return {?}
*/
KeyboardShortcutService.prototype.removeAllNameHandler = /**
* @param {?} name
* @return {?}
*/
function (name) {
if (name === null || name === undefined) {
return;
}
delete this.nameHandler[name];
this.unbindName(name);
// remove binded Key
var /** @type {?} */ keysArray = this.getNameKeyControls(name);
if (keysArray !== null && keysArray !== undefined) {
try {
for (var keysArray_7 = tslib_1.__values(keysArray), keysArray_7_1 = keysArray_7.next(); !keysArray_7_1.done; keysArray_7_1 = keysArray_7.next()) {
var keyCtrl = keysArray_7_1.value;
if (keyCtrl !== null && keyCtrl !== undefined) {
if (this.bindedKeys.indexOf(keyCtrl) >= 0) {
this.bindedKeys.splice(this.bindedKeys.indexOf(keyCtrl), 1);
}
}
}
}
catch (e_19_1) { e_19 = { error: e_19_1 }; }
finally {
try {
if (keysArray_7_1 && !keysArray_7_1.done && (_a = keysArray_7.return)) _a.call(keysArray_7);
}
finally { if (e_19) throw e_19.error; }
}
}
var e_19, _a;
};
/**
* @param {?} name
* @return {?}
*/
KeyboardShortcutService.prototype.getNameHandlers = /**
* @param {?} name
* @return {?}
*/
function (name) {
if (name === null || name === undefined) {
return null;
}
return this.nameHandler[name];
};
/**
* @param {?} shortcut
* @return {?}
*/
KeyboardShortcutService.prototype.addKeyHandler = /**
* @param {?} shortcut
* @return {?}
*/
function (shortcut) {
var /** @type {?} */ key = shortcut.shortcut;
var /** @type {?} */ handler = shortcut.handler;
var /** @type {?} */ hintAnchorElements = shortcut.hintAnchorElements;
this._addKeyHandler(key, handler);
// add hint
this.addKeyHintAnchorMap(key, shortcut);
};
/**
* @param {?} shortcut
* @return {?}
*/
KeyboardShortcutService.prototype.removeKeyHandler = /**
* @param {?} shortcut
* @return {?}
*/
function (shortcut) {
if (shortcut === null || shortcut === undefined) {
return;
}
var /** @type {?} */ key = shortcut.shortcut;
var /** @type {?} */ handler = shortcut.handler;
var /** @type {?} */ hintAnchorElements = shortcut.hintAnchorElements;
if (key === null || key === undefined) {
return;
}
var /** @type {?} */ handlers = this.keyHandler[key];
if (handlers === null || handlers === undefined) {
return;
}
var /** @type {?} */ index = -1;
try {
for (var handlers_3 = tslib_1.__values(handlers), handlers_3_1 = handlers_3.next(); !handlers_3_1.done; handlers_3_1 = handlers_3.next()) {
var h = handlers_3_1.value;
index += 1;
if (h.toString() === handler.toString()) {
break;
}
}
}
catch (e_20_1) { e_20 = { error: e_20_1 }; }
finally {
try {
if (handlers_3_1 && !handlers_3_1.done && (_a = handlers_3.return)) _a.call(handlers_3);
}
finally { if (e_20) throw e_20.error; }
}
if (index >= 0) {
handlers.splice(index, 1);
}
// remove hint
this.removeKeyHintAnchorMap(key, shortcut);
this.unbindKey(key);
if (handlers.length > 0) {
this.bindKey(key);
}
var e_20, _a;
};
/**
* @param {?} key
* @return {?}
*/
KeyboardShortcutService.prototype.removeAllKeyHandler = /**
* @param {?} key
* @return {?}
*/
function (key) {
if (key === null || key === undefined) {
return;
}
delete this.keyHandler[key];
delete this.keyHintAnchor[key];
this.unbindKey(key);
// remove binded Key
if (this.bindedKeys.indexOf(key) >= 0) {
this.bindedKeys.splice(this.bindedKeys.indexOf(key), 1);
}
};
/**
* @param {?} key
* @return {?}
*/
KeyboardShortcutService.prototype.getKeyHandlers = /**
* @param {?} key
* @return {?}
*/
function (key) {
if (key === null || key === undefined) {
return null;
}
return this.keyHandler[key];
};
KeyboardShortcutService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
KeyboardShortcutService.ctorParameters = function () { return []; };
return KeyboardShortcutService;
}());
export { KeyboardShortcutService };
function KeyboardShortcutService_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
KeyboardShortcutService.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
KeyboardShortcutService.ctorParameters;
/** @type {?} */
KeyboardShortcutService.prototype.DEFAULT_KEYDOWN_MS;
/** @type {?} */
KeyboardShortcutService.prototype.DEFAULT_BADGE_SPACE;
/** @type {?} */
KeyboardShortcutService.prototype.DEFAULT_FADEOUT_MS;
/** @type {?} */
KeyboardShortcutService.prototype.nameMapping;
/** @type {?} */
KeyboardShortcutService.prototype.nameHandler;
/** @type {?} */
KeyboardShortcutService.prototype.keyHandler;
/** @type {?} */
KeyboardShortcutService.prototype.keyHintAnchor;
/** @type {?} */
KeyboardShortcutService.prototype.bindedKeys;
/** @type {?} */
KeyboardShortcutService.prototype.keydownTimer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2V5Ym9hcmRTaG9ydGN1dFNlcnZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2UvS2V5Ym9hcmRTaG9ydGN1dFNlcnZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBVSxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFLN0QscUJBQU0sWUFBWSxHQUFhLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN4RixxQkFBTSxpQkFBaUIsR0FBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0lBZTVEO1FBQUEsaUJBaUVDO2tDQTNFb0MsSUFBSTttQ0FDSCxDQUFDO2tDQUNGLEdBQUc7UUFTdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7O1FBR3JCLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFVBQUMsUUFBYTtZQUN0QyxFQUFFLENBQUMsQ0FBQyxLQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLEtBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDO29CQUM3QixHQUFHLENBQUMsQ0FBQyxxQkFBSSxPQUFPLElBQUksS0FBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLHFCQUFJLGFBQWEsR0FBRyxLQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUVoRCxxQkFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQzsrQkFDaEcsQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQzsrQkFDdkYsQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFFbEQscUJBQUksV0FBVyxHQUFHLElBQUksQ0FBQzt3QkFDdkIscUJBQUksV0FBVyxHQUFHLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOzs0QkFDM0MsR0FBRyxDQUFDLENBQWUsSUFBQSxnQkFBQSxpQkFBQSxXQUFXLENBQUEsd0NBQUE7Z0NBQXpCLElBQUksTUFBTSx3QkFBQTtnQ0FDYixFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQ0FDMUMsV0FBVyxHQUFHLEtBQUssQ0FBQztpQ0FDckI7NkJBQ0Y7Ozs7Ozs7Ozt3QkFFRCxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQzs7Z0NBQ3hCLEdBQUcsQ0FBQyxDQUFpQixJQUFBLGtCQUFBLGlCQUFBLGFBQWEsQ0FBQSw0Q0FBQTtvQ0FBN0IsSUFBSSxRQUFRLDBCQUFBO29DQUNmLHFCQUFJLFNBQVMsR0FBRyxLQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztvQ0FFM0QsRUFBRSxDQUFDLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQzs7NENBQ2xELEdBQUcsQ0FBQyxDQUFnQixJQUFBLGNBQUEsaUJBQUEsU0FBUyxDQUFBLG9DQUFBO2dEQUF4QixJQUFJLE9BQU8sc0JBQUE7Z0RBQ2QsRUFBRSxDQUFDLENBQUMsS0FBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7b0RBQy9DLEtBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7aURBQzNFOzs7NkNBR0Y7Ozs7Ozs7OztxQ0FDRjtvQ0FBQyxJQUFJLENBQUMsQ0FBQzs7d0NBRU4scUJBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7d0NBQ2hDLEtBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7cUNBQzNFO2lDQUNGOzs7Ozs7Ozs7eUJBQ0Y7cUJBQ0Y7O2lCQUNGLEVBQUUsS0FBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDN0I7U0FDRixDQUFDLENBQUM7UUFDSCxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRTtZQUN0QixFQUFFLENBQUMsQ0FBQyxLQUFJLENBQUMsWUFBWSxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUksQ0FBQyxZQUFZLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDM0UsWUFBWSxDQUFDLEtBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNqQzs7WUFHRCxHQUFHLENBQUMsQ0FBQyxxQkFBSSxPQUFPLElBQUksS0FBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLHFCQUFJLGFBQWEsR0FBRyxLQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDOztvQkFFaEQsR0FBRyxDQUFDLENBQWlCLElBQUEsa0JBQUEsaUJBQUEsYUFBYSxDQUFBLDRDQUFBO3dCQUE3QixJQUFJLFFBQVEsMEJBQUE7d0JBQ2YsS0FBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztxQkFDakQ7Ozs7Ozs7OzthQUNGO1lBRUQsS0FBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7O1NBQy9CLENBQUMsQ0FBQztLQUNKOzs7OztJQUVPLCtDQUFhOzs7O2NBQUMsTUFBYztRQUNsQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQztTQUNSO1FBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDOzs7Ozs7O0lBR25DLG9EQUFrQjs7Ozs7Y0FBQyxPQUFlLEVBQUUsUUFBYTtRQUN2RCxFQUFFLENBQUMsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDZDtRQUVELHFCQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUVmLHFCQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLHFCQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkMscUJBQUksVUFBVSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBRXZGLEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixTQUFTLEdBQUcsU0FBUyxDQUFDO2FBQ3ZCO1lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixTQUFTLEdBQUcsU0FBUyxDQUFDO2FBQ3ZCOztZQUdELEVBQUUsQ0FBQyxDQUFDLFVBQVUsS0FBSyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxLQUFLLEVBQUUsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Z0JBRWxGLFVBQVUsR0FBRyxTQUFTLENBQUM7YUFDeEI7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxLQUFLLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFFL0QsVUFBVSxHQUFHLFNBQVMsQ0FBQzthQUN4QjtZQUVELEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUVELE1BQU0sQ0FBQyxLQUFLLENBQUM7Ozs7OztJQUdQLHVEQUFxQjs7OztjQUFDLEtBQWE7UUFDekMsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMxQyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7SUFHaEQsc0RBQW9COzs7O2NBQUMsUUFBdUI7UUFDbEQsRUFBRSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUM7U0FDUjtRQUVELHFCQUFJLElBQUksR0FBVyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3JDLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsTUFBTSxDQUFDO1NBQ1I7UUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTFCLHFCQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsRUFBRSxDQUFDLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQzs7Z0JBQ2xELEdBQUcsQ0FBQyxDQUFnQixJQUFBLGNBQUEsaUJBQUEsU0FBUyxDQUFBLG9DQUFBO29CQUF4QixJQUFJLE9BQU8sc0JBQUE7b0JBQ2QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztpQkFDN0M7Ozs7Ozs7OztTQUNGOzs7Ozs7O0lBR0sseURBQXVCOzs7O2NBQUMsUUFBdUI7UUFDckQsRUFBRSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUM7U0FDUjtRQUVELHFCQUFJLElBQUksR0FBVyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3JDLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsTUFBTSxDQUFDO1NBQ1I7UUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTFCLHFCQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsRUFBRSxDQUFDLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQzs7Z0JBQ2xELEdBQUcsQ0FBQyxDQUFnQixJQUFBLGNBQUEsaUJBQUEsU0FBUyxDQUFBLG9DQUFBO29CQUF4QixJQUFJLE9BQU8sc0JBQUE7b0JBQ2QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztpQkFDaEQ7Ozs7Ozs7OztTQUNGOzs7Ozs7OztJQUlLLHFEQUFtQjs7Ozs7Y0FBQyxPQUFlLEVBQUUsUUFBdUI7UUFDbEUsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUM7U0FDUjtRQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFaEMsRUFBRSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUM7U0FDUjtRQUVELHFCQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUVmLHFCQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztnQkFFL0IsR0FBRyxDQUFDLENBQWEsSUFBQSxVQUFBLGlCQUFBLEtBQUssQ0FBQSw0QkFBQTtvQkFBakIsSUFBSSxJQUFJLGtCQUFBO29CQUNYLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOzt3QkFFN0IscUJBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3ZDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7NEJBQzlDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO3lCQUMvQjt3QkFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDekM7aUJBQ0Y7Ozs7Ozs7OztTQUNGOzs7Ozs7OztJQUdLLHdEQUFzQjs7Ozs7Y0FBQyxPQUFlLEVBQUUsUUFBdUI7UUFDckUsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUM7U0FDUjtRQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFaEMscUJBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsRUFBRS