diff --git a/apps/common/embed/resources/less/common.less b/apps/common/embed/resources/less/common.less index b32a2acca..d19c6bde5 100644 --- a/apps/common/embed/resources/less/common.less +++ b/apps/common/embed/resources/less/common.less @@ -563,6 +563,10 @@ background-position: 0 -22px; } } + + a { + cursor: pointer; + } } .masked { diff --git a/apps/common/main/lib/component/Button.js b/apps/common/main/lib/component/Button.js index 4fe884223..7a3176804 100644 --- a/apps/common/main/lib/component/Button.js +++ b/apps/common/main/lib/component/Button.js @@ -487,12 +487,12 @@ define([ this.caption = caption; if (this.rendered) { - var captionNode = this.cmpEl.find('button:first > .caption').andSelf().filter('button > .caption'); + var captionNode = this.cmpEl.find('button:first > .caption').addBack().filter('button > .caption'); if (captionNode.length > 0) { captionNode.text(caption); } else { - this.cmpEl.find('button:first').andSelf().filter('button').text(caption); + this.cmpEl.find('button:first').addBack().filter('button').text(caption); } } } diff --git a/apps/common/main/lib/component/ComboBox.js b/apps/common/main/lib/component/ComboBox.js index d45a3054c..d24a0181c 100644 --- a/apps/common/main/lib/component/ComboBox.js +++ b/apps/common/main/lib/component/ComboBox.js @@ -547,7 +547,7 @@ define([ '<% _.each(items, function(item) { %>', '
  • <%= scope.getDisplayValue(item) %>
  • ', '<% }); %>' - ].join(''), { + ].join(''))({ items: this.store.toJSON(), scope: this })); diff --git a/apps/common/main/lib/component/ComboBoxFonts.js b/apps/common/main/lib/component/ComboBoxFonts.js index af7cd2351..e58f26d70 100644 --- a/apps/common/main/lib/component/ComboBoxFonts.js +++ b/apps/common/main/lib/component/ComboBoxFonts.js @@ -353,7 +353,7 @@ define([ '
  • ', '', '
  • ' - ].join(''), { + ].join(''))({ item: item.attributes, scope: this })); diff --git a/apps/common/main/lib/component/ComboDataView.js b/apps/common/main/lib/component/ComboDataView.js index e51f05f27..421f85653 100644 --- a/apps/common/main/lib/component/ComboDataView.js +++ b/apps/common/main/lib/component/ComboDataView.js @@ -456,6 +456,10 @@ define([ } }, + clearComboView: function() { + this.fieldPicker.store.reset([]); + }, + selectByIndex: function(index) { if (index < 0) this.fieldPicker.deselectAll(); diff --git a/apps/common/main/lib/component/DataView.js b/apps/common/main/lib/component/DataView.js index 90b51aeaa..5aa890434 100644 --- a/apps/common/main/lib/component/DataView.js +++ b/apps/common/main/lib/component/DataView.js @@ -297,7 +297,7 @@ define([ if (_.isUndefined(this.scroller) && this.allowScrollbar) { this.scroller = new Common.UI.Scroller({ - el: $(this.el).find('.inner').andSelf().filter('.inner'), + el: $(this.el).find('.inner').addBack().filter('.inner'), useKeyboard: this.enableKeyEvents && !this.handleSelect, minScrollbarLength : 40, wheelSpeed: 10 @@ -394,7 +394,7 @@ define([ }); if (view) { - var innerEl = $(this.el).find('.inner').andSelf().filter('.inner'); + var innerEl = $(this.el).find('.inner').addBack().filter('.inner'); if (this.groups && this.groups.length > 0) { var group = this.groups.findWhere({id: record.get('group')}); @@ -452,7 +452,7 @@ define([ } if (this.store.length < 1 && this.emptyText.length > 0) - $(this.el).find('.inner').andSelf().filter('.inner').append('
    ' + this.emptyText + '
    '); + $(this.el).find('.inner').addBack().filter('.inner').append('
    ' + this.emptyText + '
    '); _.each(this.dataViewItems, function(item) { this.stopListening(item); @@ -464,7 +464,7 @@ define([ if (this.allowScrollbar) { this.scroller = new Common.UI.Scroller({ - el: $(this.el).find('.inner').andSelf().filter('.inner'), + el: $(this.el).find('.inner').addBack().filter('.inner'), useKeyboard: this.enableKeyEvents && !this.handleSelect, minScrollbarLength : 40, wheelSpeed: 10 @@ -487,7 +487,7 @@ define([ view.stopListening(); if (this.store.length < 1 && this.emptyText.length > 0) { - var el = $(this.el).find('.inner').andSelf().filter('.inner'); + var el = $(this.el).find('.inner').addBack().filter('.inner'); if ( el.find('.empty-text').length<=0 ) el.append('
    ' + this.emptyText + '
    '); } @@ -653,7 +653,7 @@ define([ attachKeyEvents: function() { if (this.enableKeyEvents && this.handleSelect) { - var el = $(this.el).find('.inner').andSelf().filter('.inner'); + var el = $(this.el).find('.inner').addBack().filter('.inner'); el.addClass('canfocused'); el.attr('tabindex', '0'); el.on((this.parentMenu && this.useBSKeydown) ? 'dataview:keydown' : 'keydown', _.bind(this.onKeyDown, this)); @@ -673,7 +673,7 @@ define([ setDisabled: function(disabled) { this.disabled = disabled; - $(this.el).find('.inner').andSelf().filter('.inner').toggleClass('disabled', disabled); + $(this.el).find('.inner').addBack().filter('.inner').toggleClass('disabled', disabled); }, isDisabled: function() { @@ -688,7 +688,7 @@ define([ var menuRoot = (this.parentMenu.cmpEl.attr('role') === 'menu') ? this.parentMenu.cmpEl : this.parentMenu.cmpEl.find('[role=menu]'), - innerEl = $(this.el).find('.inner').andSelf().filter('.inner'), + innerEl = $(this.el).find('.inner').addBack().filter('.inner'), docH = Common.Utils.innerHeight(), menuH = menuRoot.outerHeight(), top = parseInt(menuRoot.css('top')); diff --git a/apps/common/main/lib/component/InputField.js b/apps/common/main/lib/component/InputField.js index 6c44ba7ae..faf1c662a 100644 --- a/apps/common/main/lib/component/InputField.js +++ b/apps/common/main/lib/component/InputField.js @@ -150,7 +150,7 @@ define([ if (!me.rendered) { var el = this.cmpEl; - this._input = this.cmpEl.find('input').andSelf().filter('input'); + this._input = this.cmpEl.find('input').addBack().filter('input'); if (this.editable) { this._input.on('blur', _.bind(this.onInputChanged, this)); diff --git a/apps/common/main/lib/component/Menu.js b/apps/common/main/lib/component/Menu.js index 5cbd8a087..cf6917e6a 100644 --- a/apps/common/main/lib/component/Menu.js +++ b/apps/common/main/lib/component/Menu.js @@ -405,6 +405,7 @@ define([ item.off('click').off('toggle'); item.remove(); }); + this.rendered && this.cmpEl.find('.menu-scroll').off('click').remove(); me.items = []; }, diff --git a/apps/common/main/lib/component/Window.js b/apps/common/main/lib/component/Window.js index b9750e2ad..37f78a80e 100644 --- a/apps/common/main/lib/component/Window.js +++ b/apps/common/main/lib/component/Window.js @@ -421,7 +421,7 @@ define([ _.extend(options, { cls: 'alert', onprimary: onKeyDown, - tpl: _.template(template, options) + tpl: _.template(template)(options) }); var win = new Common.UI.Window(options), @@ -433,7 +433,8 @@ define([ var footer = window.getChild('.footer'); var header = window.getChild('.header'); var body = window.getChild('.body'); - var icon = window.getChild('.icon'); + var icon = window.getChild('.icon'), + icon_height = (icon.length>0) ? icon.height() : 0; var check = window.getChild('.info-box .dont-show-checkbox'); if (!options.dontshow) body.css('padding-bottom', '10px'); @@ -443,19 +444,19 @@ define([ options.width = options.maxwidth; } if (options.width=='auto') { - text_cnt.height(Math.max(text.height() + ((check.length>0) ? (check.height() + parseInt(check.css('margin-top'))) : 0), icon.height())); + text_cnt.height(Math.max(text.height() + ((check.length>0) ? (check.height() + parseInt(check.css('margin-top'))) : 0), icon_height)); body.height(parseInt(text_cnt.css('height')) + parseInt(footer.css('height'))); window.setSize(text.position().left + text.width() + parseInt(text_cnt.css('padding-right')), parseInt(body.css('height')) + parseInt(header.css('height'))); } else { text.css('white-space', 'normal'); window.setWidth(options.width); - text_cnt.height(Math.max(text.height() + ((check.length>0) ? (check.height() + parseInt(check.css('margin-top'))) : 0), icon.height())); + text_cnt.height(Math.max(text.height() + ((check.length>0) ? (check.height() + parseInt(check.css('margin-top'))) : 0), icon_height)); body.height(parseInt(text_cnt.css('height')) + parseInt(footer.css('height'))); window.setHeight(parseInt(body.css('height')) + parseInt(header.css('height'))); } - if (text.height() < icon.height()-10) - text.css({'vertical-align': 'baseline', 'line-height': icon.height()+'px'}); + if (text.height() < icon_height-10) + text.css({'vertical-align': 'baseline', 'line-height': icon_height+'px'}); } function onBtnClick(event) { @@ -556,7 +557,7 @@ define([ render : function() { var renderto = this.initConfig.renderTo || document.body; $(renderto).append( - _.template(template, this.initConfig) + _.template(template)(this.initConfig) ); this.$window = $('#' + this.initConfig.id); @@ -695,7 +696,7 @@ define([ hide_mask = true; mask.attr('counter', parseInt(mask.attr('counter'))-1); - if (this.$lastmodal.size() > 0) { + if (this.$lastmodal.length > 0) { this.$lastmodal.removeClass('dethrone'); hide_mask = !(this.$lastmodal.hasClass('modal') && this.$lastmodal.is(':visible')); } @@ -736,7 +737,7 @@ define([ hide_mask = true; mask.attr('counter', parseInt(mask.attr('counter'))-1); - if (this.$lastmodal.size() > 0) { + if (this.$lastmodal.length > 0) { this.$lastmodal.removeClass('dethrone'); hide_mask = !(this.$lastmodal.hasClass('modal') && this.$lastmodal.is(':visible')); } diff --git a/apps/common/main/lib/extend/Bootstrap.js b/apps/common/main/lib/extend/Bootstrap.js index 62ce6b868..dc9498a60 100755 --- a/apps/common/main/lib/extend/Bootstrap.js +++ b/apps/common/main/lib/extend/Bootstrap.js @@ -81,8 +81,8 @@ function patchDropDownKeyDown(e) { if (!isActive || (isActive && e.keyCode == 27)) { if (e.which == 27) { $items = $('[role=menu] li.dropdown-submenu.over:visible', $parent); - if ($items.size()) { - $items.eq($items.size()-1).removeClass('over'); + if ($items.length) { + $items.eq($items.length-1).removeClass('over'); return false; } else if ($parent.hasClass('dropdown-submenu') && $parent.hasClass('over')) { $parent.removeClass('over'); diff --git a/apps/common/main/lib/view/AdvancedSettingsWindow.js b/apps/common/main/lib/view/AdvancedSettingsWindow.js index 9b87f1b71..693fbc094 100644 --- a/apps/common/main/lib/view/AdvancedSettingsWindow.js +++ b/apps/common/main/lib/view/AdvancedSettingsWindow.js @@ -71,7 +71,7 @@ define([ '' ].join(''); - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.handler = _options.handler; this.toggleGroup = _options.toggleGroup; @@ -102,9 +102,10 @@ define([ btn.on('click', _.bind(me.onCategoryClick, me)); me.btnsCategory.push(btn); }); - var cnt_panel = $window.find('.content-panel'); + var cnt_panel = $window.find('.content-panel'), + menu_panel = $window.find('.menu-panel'); cnt_panel.width(this.contentWidth); - $window.width($window.find('.menu-panel').width() + cnt_panel.outerWidth() + 2); + $window.width(((menu_panel.length>0) ? menu_panel.width() : 0) + cnt_panel.outerWidth() + 2); this.content_panels = $window.find('.settings-panel'); if (this.btnsCategory.length>0) diff --git a/apps/common/main/lib/view/Chat.js b/apps/common/main/lib/view/Chat.js index 308854791..d84448032 100644 --- a/apps/common/main/lib/view/Chat.js +++ b/apps/common/main/lib/view/Chat.js @@ -67,7 +67,7 @@ define([ templateUserList: _.template(''), @@ -82,7 +82,7 @@ define([ templateMsgList: _.template(''), @@ -162,7 +162,7 @@ define([ _onAddUser: function(m, c, opts) { if (this.panelUsers) { - this.panelUsers.find('ul').append(_.template(this.tplUser, {user: m, scope: this})); + this.panelUsers.find('ul').append(_.template(this.tplUser)({user: m, scope: this})); this.panelUsers.scroller.update({minScrollbarLength : 25, alwaysVisibleY: true}); } }, @@ -186,7 +186,7 @@ define([ var content = this.panelMessages.find('ul'); if (content && content.length) { this._prepareMessage(m); - content.append(_.template(this.tplMsg, {msg: m, scope: this})); + content.append(_.template(this.tplMsg)({msg: m, scope: this})); // scroll to end diff --git a/apps/common/main/lib/view/Comments.js b/apps/common/main/lib/view/Comments.js index 7b9389e4a..e238a5eb3 100644 --- a/apps/common/main/lib/view/Comments.js +++ b/apps/common/main/lib/view/Comments.js @@ -98,7 +98,7 @@ define([ this.store = options.store; this.delegate = options.delegate; - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.arrow = {margin: 20, width: 12, height: 34}; this.sdkBounds = {width: 0, height: 0, padding: 10, paddingTop: 20}; diff --git a/apps/common/main/lib/view/CopyWarningDialog.js b/apps/common/main/lib/view/CopyWarningDialog.js index b98fc3e78..7d8fff28c 100644 --- a/apps/common/main/lib/view/CopyWarningDialog.js +++ b/apps/common/main/lib/view/CopyWarningDialog.js @@ -83,7 +83,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/common/main/lib/view/DocumentAccessDialog.js b/apps/common/main/lib/view/DocumentAccessDialog.js index e79ce6bf1..30fc76d9c 100644 --- a/apps/common/main/lib/view/DocumentAccessDialog.js +++ b/apps/common/main/lib/view/DocumentAccessDialog.js @@ -48,7 +48,7 @@ define([ var _options = {}; _.extend(_options, { title: this.textTitle, - width: 850, + width: 600, height: 536, header: true }, options); @@ -57,7 +57,7 @@ define([ '
    ' ].join(''); - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.settingsurl = options.settingsurl || ''; Common.UI.Window.prototype.initialize.call(this, _options); diff --git a/apps/common/main/lib/view/ExternalDiagramEditor.js b/apps/common/main/lib/view/ExternalDiagramEditor.js index fa55e24b0..5f917b156 100644 --- a/apps/common/main/lib/view/ExternalDiagramEditor.js +++ b/apps/common/main/lib/view/ExternalDiagramEditor.js @@ -66,7 +66,7 @@ define([ '' ].join(''); - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.handler = _options.handler; this._chartData = null; diff --git a/apps/common/main/lib/view/ExternalMergeEditor.js b/apps/common/main/lib/view/ExternalMergeEditor.js index dab4427a6..25138e485 100644 --- a/apps/common/main/lib/view/ExternalMergeEditor.js +++ b/apps/common/main/lib/view/ExternalMergeEditor.js @@ -66,7 +66,7 @@ define([ '' ].join(''); - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.handler = _options.handler; this._mergeData = null; diff --git a/apps/common/main/lib/view/ImageFromUrlDialog.js b/apps/common/main/lib/view/ImageFromUrlDialog.js index 46888b3dd..992257873 100644 --- a/apps/common/main/lib/view/ImageFromUrlDialog.js +++ b/apps/common/main/lib/view/ImageFromUrlDialog.js @@ -65,7 +65,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/common/main/lib/view/InsertTableDialog.js b/apps/common/main/lib/view/InsertTableDialog.js index c24d11ea3..22655700a 100644 --- a/apps/common/main/lib/view/InsertTableDialog.js +++ b/apps/common/main/lib/view/InsertTableDialog.js @@ -73,7 +73,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/common/main/lib/view/OpenDialog.js b/apps/common/main/lib/view/OpenDialog.js index cf70abcb3..cbac99dd7 100644 --- a/apps/common/main/lib/view/OpenDialog.js +++ b/apps/common/main/lib/view/OpenDialog.js @@ -93,7 +93,7 @@ define([ this.codepages = options.codepages; this.settings = options.settings; - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); Common.UI.Window.prototype.initialize.call(this, _options); }, diff --git a/apps/common/main/lib/view/Plugins.js b/apps/common/main/lib/view/Plugins.js index 2089c7753..61d02c715 100644 --- a/apps/common/main/lib/view/Plugins.js +++ b/apps/common/main/lib/view/Plugins.js @@ -225,7 +225,7 @@ define([ '<% } %>' ].join(''); - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.url = options.url || ''; Common.UI.Window.prototype.initialize.call(this, _options); diff --git a/apps/common/main/lib/view/RenameDialog.js b/apps/common/main/lib/view/RenameDialog.js index 11f9ebffe..95207e9bf 100644 --- a/apps/common/main/lib/view/RenameDialog.js +++ b/apps/common/main/lib/view/RenameDialog.js @@ -66,7 +66,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/common/main/lib/view/ReviewChanges.js b/apps/common/main/lib/view/ReviewChanges.js index 28f6377a0..af8ca28a7 100644 --- a/apps/common/main/lib/view/ReviewChanges.js +++ b/apps/common/main/lib/view/ReviewChanges.js @@ -80,7 +80,7 @@ define([ this.store = options.store; this.delegate = options.delegate; - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.arrow = {margin: 20, width: 12, height: 34}; this.sdkBounds = {width: 0, height: 0, padding: 10, paddingTop: 20}; @@ -441,7 +441,7 @@ define([ var el = $(this.el), me = this; el.addClass('review-changes'); - el.html(_.template(this.template, { + el.html(_.template(this.template)({ scope: this })); diff --git a/apps/common/main/lib/view/SearchDialog.js b/apps/common/main/lib/view/SearchDialog.js index a6128c349..f518a9a88 100644 --- a/apps/common/main/lib/view/SearchDialog.js +++ b/apps/common/main/lib/view/SearchDialog.js @@ -105,7 +105,7 @@ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/common/main/resources/less/plugins.less b/apps/common/main/resources/less/plugins.less index 361eef56d..23e713e1e 100644 --- a/apps/common/main/resources/less/plugins.less +++ b/apps/common/main/resources/less/plugins.less @@ -54,7 +54,7 @@ margin-right: 10px; margin-top: -1px; - .background-ximage('@{common-image-path}/plugin/icon_add_on_default.png', '@{common-image-path}/plugin/icon_add_on_default@2x.png', 31px); + .background-ximage('@{common-image-path}/plugin/icon_add_on_default.png', '@{common-image-path}/plugin/icon_add_on_default@2x.png', 40px); } .plugin-caret { diff --git a/apps/documenteditor/embed/index.html b/apps/documenteditor/embed/index.html index 9bf9f202b..e38b8579b 100644 --- a/apps/documenteditor/embed/index.html +++ b/apps/documenteditor/embed/index.html @@ -321,9 +321,6 @@ - - - - - - diff --git a/apps/documenteditor/embed/js/ApplicationView.js b/apps/documenteditor/embed/js/ApplicationView.js index 0fe549952..84177b54c 100644 --- a/apps/documenteditor/embed/js/ApplicationView.js +++ b/apps/documenteditor/embed/js/ApplicationView.js @@ -41,10 +41,10 @@ var ApplicationView = new(function(){ $btnTools.addClass('dropdown-toggle').attr('data-toggle', 'dropdown').attr('aria-expanded', 'true'); $btnTools.parent().append( '
    '); } diff --git a/apps/documenteditor/main/app.js b/apps/documenteditor/main/app.js index 5c2a4049d..3cb20c44f 100644 --- a/apps/documenteditor/main/app.js +++ b/apps/documenteditor/main/app.js @@ -56,7 +56,6 @@ require.config({ sockjs : '../vendor/sockjs/sockjs.min', jszip : '../vendor/jszip/jszip.min', jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', allfonts : '../../sdkjs/common/AllFonts', sdk : '../../sdkjs/word/sdk-all-min', api : 'api/documents/api', @@ -112,8 +111,7 @@ require.config({ 'xregexp', 'sockjs', 'jszip', - 'jsziputils', - 'jsrsasign' + 'jsziputils' ] }, gateway: { diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index ffe757087..fe4e7e7c3 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -105,7 +105,7 @@ define([ }); this._state = {isDisconnected: false, usersCount: 1, fastCoauth: true, lostEditingRights: false, licenseWarning: false}; - + this.languages = null; // Initialize viewport if (!Common.Utils.isBrowserSupported()){ @@ -141,6 +141,8 @@ define([ this.api.asc_registerCallback('asc_onDocumentName', _.bind(this.onDocumentName, this)); this.api.asc_registerCallback('asc_onPrintUrl', _.bind(this.onPrintUrl, this)); this.api.asc_registerCallback('asc_onMeta', _.bind(this.onMeta, this)); + this.api.asc_registerCallback('asc_onSpellCheckInit', _.bind(this.loadLanguages, this)); + Common.NotificationCenter.on('api:disconnect', _.bind(this.onCoAuthoringDisconnect, this)); Common.NotificationCenter.on('goback', _.bind(this.goBack, this)); @@ -202,13 +204,13 @@ define([ me.api.asc_enableKeyEvents(false); }, 'modal:close': function(dlg) { - if (dlg && dlg.$lastmodal && dlg.$lastmodal.size() < 1) { + if (dlg && dlg.$lastmodal && dlg.$lastmodal.length < 1) { me.isModalShowed = false; me.api.asc_enableKeyEvents(true); } }, 'modal:hide': function(dlg) { - if (dlg && dlg.$lastmodal && dlg.$lastmodal.size() < 1) { + if (dlg && dlg.$lastmodal && dlg.$lastmodal.length < 1) { me.isModalShowed = false; me.api.asc_enableKeyEvents(true); } @@ -868,7 +870,7 @@ define([ toolbarController.createDelayedElements(); documentHolderController.getView('DocumentHolder').createDelayedElements(); - me.loadLanguages(); + me.setLanguages(); var shapes = me.api.asc_getPropertyEditorShapes(); if (shapes) @@ -1655,15 +1657,15 @@ define([ } }, - loadLanguages: function() { - var apiLangs = this.api.asc_getSpellCheckLanguages(), - langs = [], info; + loadLanguages: function(apiLangs) { + var langs = [], info; _.each(apiLangs, function(lang, index, list){ - info = Common.util.LanguageInfo.getLocalLanguageName(lang.asc_getId()); + lang = parseInt(lang); + info = Common.util.LanguageInfo.getLocalLanguageName(lang); langs.push({ title: info[1], tip: info[0], - code: lang.asc_getId() + code: lang }); }, this); @@ -1673,8 +1675,15 @@ define([ return 0; }); - this.getApplication().getController('DocumentHolder').getView('DocumentHolder').setLanguages(langs); - this.getApplication().getController('Statusbar').setLanguages(langs); + this.languages = langs; + window.styles_loaded && this.setLanguages(); + }, + + setLanguages: function() { + if (this.languages && this.languages.length>0) { + this.getApplication().getController('DocumentHolder').getView('DocumentHolder').setLanguages(this.languages); + this.getApplication().getController('Statusbar').setLanguages(this.languages); + } }, onInsertTable: function() { diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 255e609d5..ca2da17ad 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -733,7 +733,7 @@ define([ var styleRec = listStyle.menuPicker.store.findWhere({ title: name }); - this._state.prstyle = (listStyle.menuPicker.store.length>0) ? name : undefined; + this._state.prstyle = (listStyle.menuPicker.store.length>0 || window.styles_loaded) ? name : undefined; listStyle.menuPicker.selectRecord(styleRec); listStyle.resumeEvents(); @@ -1892,7 +1892,7 @@ define([ me._state.prstyle = title; style.put_Name(title); characterStyle.put_Name(title + '_character'); - style.put_Next(nextStyle.asc_getName()); + style.put_Next((nextStyle) ? nextStyle.asc_getName() : null); me.api.asc_AddNewStyle(style); } Common.NotificationCenter.trigger('edit:complete', me.toolbar); @@ -2516,7 +2516,7 @@ define([ store: this.getApplication().getCollection('Common.Collections.TextArt'), parentMenu: this.toolbar.mnuInsertTextArt.menu, showLast: false, - itemTemplate: _.template('
    ') + itemTemplate: _.template('
    ') }); this.toolbar.mnuTextArtPicker.on('item:click', function(picker, item, record, e) { @@ -2630,7 +2630,8 @@ define([ if (self._state.prstyle) styleRec = listStyles.menuPicker.store.findWhere({title: self._state.prstyle}); listStyles.fillComboView((styleRec) ? styleRec : listStyles.menuPicker.store.at(0), true); Common.NotificationCenter.trigger('edit:complete', this); - } + } else if (listStyles.rendered) + listStyles.clearComboView(); window.styles_loaded = true; }, diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js index a991e6ad1..f024d5f94 100644 --- a/apps/documenteditor/main/app/view/DocumentHolder.js +++ b/apps/documenteditor/main/app/view/DocumentHolder.js @@ -3201,7 +3201,9 @@ define([ setLanguages: function(langs){ var me = this; - if (langs && langs.length > 0) { + if (langs && langs.length > 0 && me.langParaMenu && me.langTableMenu) { + me.langParaMenu.menu.removeAll(); + me.langTableMenu.menu.removeAll(); _.each(langs, function(lang, index){ me.langParaMenu.menu.addItem(new Common.UI.MenuItem({ caption : lang.title, diff --git a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js index 335bd1de5..eda22b39d 100644 --- a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js +++ b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js @@ -81,7 +81,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.api = this.options.api; Common.UI.Window.prototype.initialize.call(this, this.options); diff --git a/apps/documenteditor/main/app/view/MailMergeRecepients.js b/apps/documenteditor/main/app/view/MailMergeRecepients.js index 1d6421a77..9135a9886 100644 --- a/apps/documenteditor/main/app/view/MailMergeRecepients.js +++ b/apps/documenteditor/main/app/view/MailMergeRecepients.js @@ -54,7 +54,7 @@ define([ '
    ' ].join(''); - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.fileChoiceUrl = options.fileChoiceUrl || ''; Common.UI.Window.prototype.initialize.call(this, _options); diff --git a/apps/documenteditor/main/app/view/MailMergeSaveDlg.js b/apps/documenteditor/main/app/view/MailMergeSaveDlg.js index 7158ac534..3a76f35e6 100644 --- a/apps/documenteditor/main/app/view/MailMergeSaveDlg.js +++ b/apps/documenteditor/main/app/view/MailMergeSaveDlg.js @@ -55,7 +55,7 @@ define([ '
    ' ].join(''); - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.mergeFolderUrl = options.mergeFolderUrl || ''; this.mergedFileUrl = options.mergedFileUrl || ''; diff --git a/apps/documenteditor/main/app/view/PageMarginsDialog.js b/apps/documenteditor/main/app/view/PageMarginsDialog.js index d9fb32f4e..fcb925a01 100644 --- a/apps/documenteditor/main/app/view/PageMarginsDialog.js +++ b/apps/documenteditor/main/app/view/PageMarginsDialog.js @@ -89,7 +89,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.spinners = []; this._noApply = false; diff --git a/apps/documenteditor/main/app/view/PageSizeDialog.js b/apps/documenteditor/main/app/view/PageSizeDialog.js index 3537e1e3c..c3f5ac6da 100644 --- a/apps/documenteditor/main/app/view/PageSizeDialog.js +++ b/apps/documenteditor/main/app/view/PageSizeDialog.js @@ -79,7 +79,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.spinners = []; this._noApply = false; diff --git a/apps/documenteditor/main/app/view/Statusbar.js b/apps/documenteditor/main/app/view/Statusbar.js index 4017ad6a0..325469076 100644 --- a/apps/documenteditor/main/app/view/Statusbar.js +++ b/apps/documenteditor/main/app/view/Statusbar.js @@ -96,7 +96,7 @@ define([ templateUserList: _.template(''), @@ -436,7 +436,7 @@ define([ _onAddUser: function(m, c, opts) { if (this.panelUsersList) { - this.panelUsersList.find('ul').append(_.template(this.tplUser, {user: m, scope: this})); + this.panelUsersList.find('ul').append(_.template(this.tplUser)({user: m, scope: this})); this.panelUsersList.scroller.update({minScrollbarLength : 40, alwaysVisibleY: true}); } }, @@ -466,6 +466,7 @@ define([ /** coauthoring end **/ reloadLanguages: function(array) { + this.langMenu.removeAll(); _.each(array, function(item) { this.langMenu.addItem({ iconCls : item['tip'], @@ -566,7 +567,7 @@ define([ label: this.labelSelect, btns: {ok: this.btnOk, cancel: this.btnCancel} }); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/documenteditor/main/app/view/StyleTitleDialog.js b/apps/documenteditor/main/app/view/StyleTitleDialog.js index 14e605088..8fd238dd1 100644 --- a/apps/documenteditor/main/app/view/StyleTitleDialog.js +++ b/apps/documenteditor/main/app/view/StyleTitleDialog.js @@ -70,7 +70,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, @@ -107,10 +107,11 @@ define([ menuStyle : 'width: 100%; max-height: 290px;', editable : false, cls : 'input-group-nr', - data : this.options.formats + data : this.options.formats, + disabled : (this.options.formats.length==0) }); - - this.cmbNextStyle.setValue(this.options.formats[0].value); + if (this.options.formats.length>0) + this.cmbNextStyle.setValue(this.options.formats[0].value); }, show: function() { @@ -129,7 +130,7 @@ define([ getNextStyle: function () { var me = this; - return me.cmbNextStyle.getValue(); + return (me.options.formats.length>0) ? me.cmbNextStyle.getValue() : null; }, onBtnClick: function(event) { diff --git a/apps/documenteditor/main/app_dev.js b/apps/documenteditor/main/app_dev.js index d15f17707..49d9e8fa0 100644 --- a/apps/documenteditor/main/app_dev.js +++ b/apps/documenteditor/main/app_dev.js @@ -56,7 +56,6 @@ require.config({ sockjs : '../vendor/sockjs/sockjs.min', jszip : '../vendor/jszip/jszip.min', jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', api : 'api/documents/api', core : 'common/main/lib/core/application', notification : 'common/main/lib/core/NotificationCenter', @@ -125,7 +124,6 @@ require([ 'locale', 'jszip', 'jsziputils', - 'jsrsasign', 'sockjs', 'underscore' ], function (Backbone, Bootstrap, Core) { diff --git a/apps/documenteditor/main/locale/de.json b/apps/documenteditor/main/locale/de.json index 21609fe1a..3292d4abd 100644 --- a/apps/documenteditor/main/locale/de.json +++ b/apps/documenteditor/main/locale/de.json @@ -141,7 +141,6 @@ "Common.Views.ExternalMergeEditor.textTitle": "Seriendruckempfänger\t", "Common.Views.Header.openNewTabText": "In neuer Registerkarte öffnen", "Common.Views.Header.textBack": "Zu Dokumenten übergehen", - "Common.Views.Header.txtHeaderDeveloper": "ENTWICKLERMODUS", "Common.Views.Header.txtRename": "Umbenennen", "Common.Views.History.textCloseHistory": "Historie schließen", "Common.Views.History.textHide": "Reduzieren", @@ -206,6 +205,7 @@ "DE.Controllers.Main.downloadTextText": "Dokument wird heruntergeladen...", "DE.Controllers.Main.downloadTitleText": "Herunterladen des Dokuments", "DE.Controllers.Main.errorAccessDeny": "Sie haben versucht die Änderungen im Dokument, zu dem Sie keine Berechtigungen haben, vorzunehemen.
    Wenden Sie sich an Ihren Serveradministrator.", + "DE.Controllers.Main.errorBadImageUrl": "URL des Bildes ist falsch", "DE.Controllers.Main.errorCoAuthoringDisconnect": "Verbindung zum Server ist verloren gegangen. Das Dokument kann momentan nicht bearbeitet werden.", "DE.Controllers.Main.errorConnectToServer": "Das Dokument konnte nicht gespeichert werden. Bitte überprüfen Sie die Verbindungseinstellungen, oder richten Sie an Ihren Administrator.
    Wann Sie auf den Button \"OK\" klicken, werden Sie aufgefordert das Dokument herunterzuladen.

    Mehr Information zur Verbindung des Dokument Servers finden Sie hier", "DE.Controllers.Main.errorDatabaseConnection": "Externer Fehler.
    Fehler beim Verbinden zur Datenbank. Bitte wenden Sie sich an den Kundendienst, falls der Fehler bestehen bleibt.", @@ -262,10 +262,12 @@ "DE.Controllers.Main.splitMaxRowsErrorText": "Die Zeilenanzahl muss weniger als %1 sein.", "DE.Controllers.Main.textAnonymous": "Anonym", "DE.Controllers.Main.textBuyNow": "Webseite besuchen", + "DE.Controllers.Main.textChangesSaved": "Alle Änderungen werden gespeichert", "DE.Controllers.Main.textCloseTip": "Klicken Sie, um den Tipp zu schließen", "DE.Controllers.Main.textContactUs": "Verkaufsteam kontaktieren", "DE.Controllers.Main.textLoadingDocument": "Dokument wird geladen...\t", "DE.Controllers.Main.textNoLicenseTitle": "ONLYOFFICE Open Source Version", + "DE.Controllers.Main.textShape": "Form", "DE.Controllers.Main.textStrict": "Formaler Modus", "DE.Controllers.Main.textTryUndoRedo": "Undo/Redo Optionen sind für den halbformalen Zusammenbearbeitungsmodus deaktiviert.
    Klicken Sie auf den Button \"Formaler Modus\", um den formalen Zusammenbearbeitungsmodus zu aktivieren, um die Datei, ohne Störungen anderer Benutzer zu bearbeiten und die Änderungen erst nachdem Sie sie gespeichert haben, zu senden. Sie können zwischen den Zusammenbearbeitungsmodi mit der Hilfe der erweiterten Einstellungen von Editor umschalten.", "DE.Controllers.Main.titleLicenseExp": "Lizenz ist abgelaufen", @@ -923,6 +925,7 @@ "DE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Sie müssen die Änderungen annehmen, bevor Sie diese sehen können", "DE.Views.FileMenuPanels.Settings.strFast": "Schnell", "DE.Views.FileMenuPanels.Settings.strFontRender": "Hinting der Schriftarten", + "DE.Views.FileMenuPanels.Settings.strForcesave": "Immer auf dem Server speichern (ansonsten auf dem Server beim Schließen des Dokuments speichern)", "DE.Views.FileMenuPanels.Settings.strInputMode": "Hieroglyphen einschalten", "DE.Views.FileMenuPanels.Settings.strLiveComment": "Live-Kommentare einschalten", "DE.Views.FileMenuPanels.Settings.strShowChanges": "Änderungen bei der Echtzeit-Zusammenarbeit zeigen", @@ -938,6 +941,7 @@ "DE.Views.FileMenuPanels.Settings.textAutoRecover": "Autowiederherstellen", "DE.Views.FileMenuPanels.Settings.textAutoSave": "Automatisch speichern", "DE.Views.FileMenuPanels.Settings.textDisabled": "Deaktiviert", + "DE.Views.FileMenuPanels.Settings.textForceSave": "Auf dem Server speichern", "DE.Views.FileMenuPanels.Settings.textMinute": "Jede Minute", "DE.Views.FileMenuPanels.Settings.txtAll": "Alle anzeigen", "DE.Views.FileMenuPanels.Settings.txtCm": "Zentimeter", @@ -1070,6 +1074,7 @@ "DE.Views.LeftMenu.tipSearch": "Suchen", "DE.Views.LeftMenu.tipSupport": "Feedback und Support", "DE.Views.LeftMenu.tipTitles": "Titel", + "DE.Views.LeftMenu.txtDeveloper": "ENTWICKLERMODUS", "DE.Views.MailMergeEmailDlg.cancelButtonText": "Abbrechen", "DE.Views.MailMergeEmailDlg.filePlaceholder": "PDF", "DE.Views.MailMergeEmailDlg.okButtonText": "Senden", @@ -1342,7 +1347,7 @@ "DE.Views.TableSettings.textSelectBorders": "Wählen Sie Rahmenlinien, auf die ein anderer Stil angewandt wird", "DE.Views.TableSettings.textTemplate": "Vorlage auswählen", "DE.Views.TableSettings.textTotal": "Insgesamt", - "DE.Views.TableSettings.textWrap": "Textumbruch", + "DE.Views.TableSettings.textWrap": "Umbruch", "DE.Views.TableSettings.textWrapNoneTooltip": "Inline-Tabelle", "DE.Views.TableSettings.textWrapParallelTooltip": "Flow-Tabelle", "DE.Views.TableSettings.tipAll": "Äußere Rahmenlinie und alle inneren Linien festlegen", diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index d169ed1ea..38a031bd2 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -141,7 +141,6 @@ "Common.Views.ExternalMergeEditor.textTitle": "Mail Merge Recipients", "Common.Views.Header.openNewTabText": "Open in New Tab", "Common.Views.Header.textBack": "Go to Documents", - "del_Common.Views.Header.txtHeaderDeveloper": "DEVELOPER MODE", "Common.Views.Header.txtRename": "Rename", "Common.Views.History.textCloseHistory": "Close History", "Common.Views.History.textHide": "Collapse", @@ -206,6 +205,7 @@ "DE.Controllers.Main.downloadTextText": "Downloading document...", "DE.Controllers.Main.downloadTitleText": "Downloading Document", "DE.Controllers.Main.errorAccessDeny": "You are trying to perform an action you do not have rights for.
    Please contact your Document Server administrator.", + "DE.Controllers.Main.errorBadImageUrl": "Image URL is incorrect", "DE.Controllers.Main.errorCoAuthoringDisconnect": "Server connection lost. The document cannot be edited right now.", "DE.Controllers.Main.errorConnectToServer": "The document could not be saved. Please check connection settings or contact your administrator.
    When you click the 'OK' button, you will be prompted to download the document.

    Find more information about connecting Document Server here", "DE.Controllers.Main.errorDatabaseConnection": "External error.
    Database connection error. Please contact support in case the error persists.", @@ -217,6 +217,7 @@ "DE.Controllers.Main.errorMailMergeLoadFile": "Loading failed", "DE.Controllers.Main.errorMailMergeSaveFile": "Merge failed.", "DE.Controllers.Main.errorProcessSaveResult": "Saving failed.", + "DE.Controllers.Main.errorServerVersion": "The editor version has been updated. The page will be reloaded to apply the changes.", "DE.Controllers.Main.errorSessionAbsolute": "The document editing session has expired. Please reload the page.", "DE.Controllers.Main.errorSessionIdle": "The document has not been edited for quite a long time. Please reload the page.", "DE.Controllers.Main.errorSessionToken": "The connection to the server has been interrupted. Please reload the page.", @@ -261,13 +262,16 @@ "DE.Controllers.Main.splitMaxRowsErrorText": "The number of rows must be less than %1.", "DE.Controllers.Main.textAnonymous": "Anonymous", "DE.Controllers.Main.textBuyNow": "Visit website", + "DE.Controllers.Main.textChangesSaved": "All changes saved", "DE.Controllers.Main.textCloseTip": "Click to close the tip", "DE.Controllers.Main.textContactUs": "Contact sales", "DE.Controllers.Main.textLoadingDocument": "Loading document", "DE.Controllers.Main.textNoLicenseTitle": "ONLYOFFICE open source version", + "DE.Controllers.Main.textShape": "Shape", "DE.Controllers.Main.textStrict": "Strict mode", "DE.Controllers.Main.textTryUndoRedo": "The Undo/Redo functions are disabled for the Fast co-editing mode.
    Click the 'Strict mode' button to switch to the Strict co-editing mode to edit the file without other users interference and send your changes only after you save them. You can switch between the co-editing modes using the editor Advanced settings.", "DE.Controllers.Main.titleLicenseExp": "License expired", + "DE.Controllers.Main.titleServerVersion": "Editor updated", "DE.Controllers.Main.titleUpdateVersion": "Version changed", "DE.Controllers.Main.txtArt": "Your text here", "DE.Controllers.Main.txtBasicShapes": "Basic Shapes", @@ -298,10 +302,6 @@ "DE.Controllers.Main.warnLicenseExp": "Your license has expired.
    Please update your license and refresh the page.", "DE.Controllers.Main.warnNoLicense": "You are using an open source version of ONLYOFFICE. The version has limitations for concurrent connections to the document server (20 connections at a time).
    If you need more please consider purchasing a commercial license.", "DE.Controllers.Main.warnProcessRightsChange": "You have been denied the right to edit the file.", - "DE.Controllers.Main.titleServerVersion": "Editor updated", - "DE.Controllers.Main.errorServerVersion": "The editor version has been updated. The page will be reloaded to apply the changes.", - "DE.Controllers.Main.textChangesSaved": "All changes saved", - "DE.Controllers.Main.errorBadImageUrl": "Image URL is incorrect", "DE.Controllers.Statusbar.textHasChanges": "New changes have been tracked", "DE.Controllers.Statusbar.textTrackChanges": "The document is opened with the Track Changes mode enabled", "DE.Controllers.Statusbar.zoomText": "Zoom {0}%", @@ -941,6 +941,7 @@ "DE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "You will need to accept changes before you can see them", "DE.Views.FileMenuPanels.Settings.strFast": "Fast", "DE.Views.FileMenuPanels.Settings.strFontRender": "Font Hinting", + "DE.Views.FileMenuPanels.Settings.strForcesave": "Always save to server (otherwise save to server on document close)", "DE.Views.FileMenuPanels.Settings.strInputMode": "Turn on hieroglyphs", "DE.Views.FileMenuPanels.Settings.strLiveComment": "Turn on display of the comments", "DE.Views.FileMenuPanels.Settings.strShowChanges": "Realtime Collaboration Changes", @@ -956,6 +957,7 @@ "DE.Views.FileMenuPanels.Settings.textAutoRecover": "Autorecover", "DE.Views.FileMenuPanels.Settings.textAutoSave": "Autosave", "DE.Views.FileMenuPanels.Settings.textDisabled": "Disabled", + "DE.Views.FileMenuPanels.Settings.textForceSave": "Save to Server", "DE.Views.FileMenuPanels.Settings.textMinute": "Every Minute", "DE.Views.FileMenuPanels.Settings.txtAll": "View All", "DE.Views.FileMenuPanels.Settings.txtCm": "Centimeter", @@ -971,8 +973,6 @@ "DE.Views.FileMenuPanels.Settings.txtPt": "Point", "DE.Views.FileMenuPanels.Settings.txtSpellCheck": "Spell Checking", "DE.Views.FileMenuPanels.Settings.txtWin": "as Windows", - "DE.Views.FileMenuPanels.Settings.textForceSave": "Save to Server", - "DE.Views.FileMenuPanels.Settings.strForcesave": "Always save to server (otherwise save to server on document close)", "DE.Views.HeaderFooterSettings.textBottomCenter": "Bottom Center", "DE.Views.HeaderFooterSettings.textBottomLeft": "Bottom Left", "DE.Views.HeaderFooterSettings.textBottomRight": "Bottom Right", @@ -1363,7 +1363,7 @@ "DE.Views.TableSettings.textSelectBorders": "Select borders you want to change applying style chosen above", "DE.Views.TableSettings.textTemplate": "Select From Template", "DE.Views.TableSettings.textTotal": "Total", - "DE.Views.TableSettings.textWrap": "Text Wrapping", + "DE.Views.TableSettings.textWrap": "Wrapping Style", "DE.Views.TableSettings.textWrapNoneTooltip": "Inline table", "DE.Views.TableSettings.textWrapParallelTooltip": "Flow table", "DE.Views.TableSettings.tipAll": "Set Outer Border and All Inner Lines", diff --git a/apps/documenteditor/main/locale/fr.json b/apps/documenteditor/main/locale/fr.json index ce66640d0..81a6bfaa0 100644 --- a/apps/documenteditor/main/locale/fr.json +++ b/apps/documenteditor/main/locale/fr.json @@ -141,7 +141,6 @@ "Common.Views.ExternalMergeEditor.textTitle": "Destinataires de fusion et publipostage", "Common.Views.Header.openNewTabText": "Ouvrir dans un nouvel onglet", "Common.Views.Header.textBack": "Aller aux Documents", - "Common.Views.Header.txtHeaderDeveloper": "MODE DEVELOPPEUR", "Common.Views.Header.txtRename": "Renommer", "Common.Views.History.textCloseHistory": "Fermer l'historique", "Common.Views.History.textHide": "Réduire", @@ -206,8 +205,9 @@ "DE.Controllers.Main.downloadTextText": "Téléchargement du document...", "DE.Controllers.Main.downloadTitleText": "Téléchargement du document", "DE.Controllers.Main.errorAccessDeny": "Vous tentez d'exéсuter une action pour laquelle vous ne disposez pas des droits.
    Veuillez contacter l'administrateur de Document Server.", + "DE.Controllers.Main.errorBadImageUrl": "L'URL de l'image est incorrecte", "DE.Controllers.Main.errorCoAuthoringDisconnect": "Connexion au serveur perdue. Le document ne peut être modifié en ce moment.", - "DE.Controllers.Main.errorConnectToServer": "Le document n'a pas pu être enregistré. Veuillez vérifier les paramètres de connexion ou contactez votre administrateur.
    Lorsque vous cliquez sur le bouton 'OK', vous serez invité à télécharger le document.

    Trouvez plus d'informations sur la connexion Document Serverhere", + "DE.Controllers.Main.errorConnectToServer": "Le document n'a pas pu être enregistré. Veuillez vérifier les paramètres de connexion ou contactez votre administrateur.
    Lorsque vous cliquez sur le bouton 'OK', vous serez invité à télécharger le document.

    Trouvez plus d'informations sur la connexion de Document Serverici", "DE.Controllers.Main.errorDatabaseConnection": "Erreur externe.
    Erreur de connexion à la base de données. Si l'erreur persiste veillez contactez l'assistance technique.", "DE.Controllers.Main.errorDataRange": "Plage de données incorrecte.", "DE.Controllers.Main.errorDefaultMessage": "Code d'erreur: %1", @@ -262,10 +262,12 @@ "DE.Controllers.Main.splitMaxRowsErrorText": "Le nombre de lignes doit être inférieure à %1.", "DE.Controllers.Main.textAnonymous": "Anonyme", "DE.Controllers.Main.textBuyNow": "Visiter le site web", + "DE.Controllers.Main.textChangesSaved": "Toutes les modifications sont enregistrées", "DE.Controllers.Main.textCloseTip": "Cliquez pour fermer le conseil", "DE.Controllers.Main.textContactUs": "Contacter l'équipe de ventes", "DE.Controllers.Main.textLoadingDocument": "Chargement du document", "DE.Controllers.Main.textNoLicenseTitle": "La version open source de ONLYOFFICE", + "DE.Controllers.Main.textShape": "Forme", "DE.Controllers.Main.textStrict": "Mode strict", "DE.Controllers.Main.textTryUndoRedo": "Les fonctions annuler/rétablir sont désactivées pour le mode de co-édition rapide.
    Cliquez sur le bouton \"Mode strict\" pour passer au mode de la co-édition stricte pour modifier le fichier sans interférence d'autres utilisateurs et envoyer vos modifications seulement après que vous les enregistrez. Vous pouvez basculer entre les modes de co-édition à l'aide de paramètres avancés d'éditeur.", "DE.Controllers.Main.titleLicenseExp": "Licence expirée", @@ -923,6 +925,7 @@ "DE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Avant de pouvoir afficher les modifications, vous avez besoin de les accépter ", "DE.Views.FileMenuPanels.Settings.strFast": "Rapide", "DE.Views.FileMenuPanels.Settings.strFontRender": "Hinting de la police", + "DE.Views.FileMenuPanels.Settings.strForcesave": "Toujours enregistrer sur le serveur ( sinon enregistrer sur le serveur lors de la fermeture du document )", "DE.Views.FileMenuPanels.Settings.strInputMode": "Activer des hiéroglyphes", "DE.Views.FileMenuPanels.Settings.strLiveComment": "Activer l'affichage des commentaires", "DE.Views.FileMenuPanels.Settings.strShowChanges": "Changements de collaboration en temps réel", @@ -938,6 +941,7 @@ "DE.Views.FileMenuPanels.Settings.textAutoRecover": "Récupération automatique", "DE.Views.FileMenuPanels.Settings.textAutoSave": "Enregistrement automatique", "DE.Views.FileMenuPanels.Settings.textDisabled": "Désactivé", + "DE.Views.FileMenuPanels.Settings.textForceSave": "Enregistrer sur le serveur", "DE.Views.FileMenuPanels.Settings.textMinute": "Chaque minute", "DE.Views.FileMenuPanels.Settings.txtAll": "Tous", "DE.Views.FileMenuPanels.Settings.txtCm": "Centimètre", @@ -1070,6 +1074,7 @@ "DE.Views.LeftMenu.tipSearch": "Recherche", "DE.Views.LeftMenu.tipSupport": "Commentaires & assistance", "DE.Views.LeftMenu.tipTitles": "Titres", + "DE.Views.LeftMenu.txtDeveloper": "MODE DEVELOPPEUR", "DE.Views.MailMergeEmailDlg.cancelButtonText": "Annuler", "DE.Views.MailMergeEmailDlg.filePlaceholder": "PDF", "DE.Views.MailMergeEmailDlg.okButtonText": "Envoyer", @@ -1175,7 +1180,7 @@ "DE.Views.ParagraphSettingsAdvanced.strAllCaps": "Toutes en majuscules", "DE.Views.ParagraphSettingsAdvanced.strBorders": "Bordures et remplissage", "DE.Views.ParagraphSettingsAdvanced.strBreakBefore": "Saut de page avant", - "DE.Views.ParagraphSettingsAdvanced.strDoubleStrike": "Double biffés", + "DE.Views.ParagraphSettingsAdvanced.strDoubleStrike": "Barré double", "DE.Views.ParagraphSettingsAdvanced.strIndentsFirstLine": "Première ligne", "DE.Views.ParagraphSettingsAdvanced.strIndentsLeftText": "A gauche", "DE.Views.ParagraphSettingsAdvanced.strIndentsRightText": "A droite", @@ -1187,7 +1192,7 @@ "DE.Views.ParagraphSettingsAdvanced.strParagraphIndents": "Retraits et emplacement", "DE.Views.ParagraphSettingsAdvanced.strParagraphPosition": "Emplacement", "DE.Views.ParagraphSettingsAdvanced.strSmallCaps": "Petites majuscules", - "DE.Views.ParagraphSettingsAdvanced.strStrike": "Biffés", + "DE.Views.ParagraphSettingsAdvanced.strStrike": "Barré", "DE.Views.ParagraphSettingsAdvanced.strSubscript": "Indice", "DE.Views.ParagraphSettingsAdvanced.strSuperscript": "Exposant", "DE.Views.ParagraphSettingsAdvanced.strTabs": "Tabulation", @@ -1342,7 +1347,7 @@ "DE.Views.TableSettings.textSelectBorders": "Sélectionnez les bordures à modifier en appliquant le style choisi ci-dessus", "DE.Views.TableSettings.textTemplate": "Sélectionner à partir d'un modèle", "DE.Views.TableSettings.textTotal": "Total", - "DE.Views.TableSettings.textWrap": "Habillage du texte", + "DE.Views.TableSettings.textWrap": "Style d'habillage", "DE.Views.TableSettings.textWrapNoneTooltip": "Tableau aligné", "DE.Views.TableSettings.textWrapParallelTooltip": "Tableau flottant", "DE.Views.TableSettings.tipAll": "Bordure extérieure et la totalité des lignes intérieures", @@ -1540,7 +1545,7 @@ "DE.Views.Toolbar.tipColumns": "Insérer des colonnes ", "DE.Views.Toolbar.tipCopy": "Copier", "DE.Views.Toolbar.tipCopyStyle": "Copier le style", - "DE.Views.Toolbar.tipDecFont": "Réduire taille de la police", + "DE.Views.Toolbar.tipDecFont": "Réduire la taille de la police", "DE.Views.Toolbar.tipDecPrLeft": "Réduire le retrait", "DE.Views.Toolbar.tipDropCap": "Insérer une lettrine", "DE.Views.Toolbar.tipEditHeader": "Modifier l'en-tête ou le pied de page", @@ -1549,7 +1554,7 @@ "DE.Views.Toolbar.tipFontSize": "Taille de la police", "DE.Views.Toolbar.tipHAligh": "Alignement horizontal", "DE.Views.Toolbar.tipHighlightColor": "Couleur de surlignage", - "DE.Views.Toolbar.tipIncFont": "Augmenter taille de la police", + "DE.Views.Toolbar.tipIncFont": "Augmenter la taille de la police", "DE.Views.Toolbar.tipIncPrLeft": "Augmenter le retrait", "DE.Views.Toolbar.tipInsertChart": "Insérer un graphique", "DE.Views.Toolbar.tipInsertEquation": "Insérer une équation", diff --git a/apps/documenteditor/main/locale/ru.json b/apps/documenteditor/main/locale/ru.json index 5aea5cecc..12ee32989 100644 --- a/apps/documenteditor/main/locale/ru.json +++ b/apps/documenteditor/main/locale/ru.json @@ -141,7 +141,6 @@ "Common.Views.ExternalMergeEditor.textTitle": "Получатели слияния", "Common.Views.Header.openNewTabText": "Открыть в новой вкладке", "Common.Views.Header.textBack": "Перейти к Документам", - "Common.Views.Header.txtHeaderDeveloper": "РЕЖИМ РАЗРАБОТЧИКА", "Common.Views.Header.txtRename": "Переименовать", "Common.Views.History.textCloseHistory": "Закрыть историю", "Common.Views.History.textHide": "Свернуть", @@ -206,6 +205,7 @@ "DE.Controllers.Main.downloadTextText": "Загрузка документа...", "DE.Controllers.Main.downloadTitleText": "Загрузка документа", "DE.Controllers.Main.errorAccessDeny": "Вы пытаетесь выполнить действие, на которое у вас нет прав.
    Пожалуйста, обратитесь к администратору Сервера документов.", + "DE.Controllers.Main.errorBadImageUrl": "Неправильный URL-адрес изображения", "DE.Controllers.Main.errorCoAuthoringDisconnect": "Потеряно соединение с сервером. В данный момент нельзя отредактировать документ.", "DE.Controllers.Main.errorConnectToServer": "Не удается сохранить документ. Проверьте параметры подключения или обратитесь к вашему администратору.
    Когда вы нажмете на кнопку 'OK', вам будет предложено скачать документ.

    Дополнительную информацию о подключении Сервера документов можно найти здесь", "DE.Controllers.Main.errorDatabaseConnection": "Внешняя ошибка.
    Ошибка подключения к базе данных. Если ошибка повторяется, пожалуйста, обратитесь в службу поддержки.", @@ -262,10 +262,12 @@ "DE.Controllers.Main.splitMaxRowsErrorText": "Число строк должно быть меньше, чем %1.", "DE.Controllers.Main.textAnonymous": "Аноним", "DE.Controllers.Main.textBuyNow": "Перейти на сайт", + "DE.Controllers.Main.textChangesSaved": "Все изменения сохранены", "DE.Controllers.Main.textCloseTip": "Щелкните, чтобы закрыть эту подсказку", "DE.Controllers.Main.textContactUs": "Связаться с отделом продаж", "DE.Controllers.Main.textLoadingDocument": "Загрузка документа", "DE.Controllers.Main.textNoLicenseTitle": "Open source версия ONLYOFFICE", + "DE.Controllers.Main.textShape": "Фигура", "DE.Controllers.Main.textStrict": "Строгий режим", "DE.Controllers.Main.textTryUndoRedo": "Функции отмены и повтора действий отключены в Быстром режиме совместного редактирования.
    Нажмите на кнопку 'Строгий режим' для переключения в Строгий режим совместного редактирования, чтобы редактировать файл без вмешательства других пользователей и отправлять изменения только после того, как вы их сохраните. Переключаться между режимами совместного редактирования можно с помощью Дополнительных параметров редактора.", "DE.Controllers.Main.titleLicenseExp": "Истек срок действия лицензии", @@ -923,6 +925,7 @@ "DE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Прежде чем вы сможете увидеть изменения, их надо будет принять", "DE.Views.FileMenuPanels.Settings.strFast": "Быстрый", "DE.Views.FileMenuPanels.Settings.strFontRender": "Хинтинг шрифтов", + "DE.Views.FileMenuPanels.Settings.strForcesave": "Всегда сохранять на сервере (в противном случае сохранять на сервере при закрытии документа)", "DE.Views.FileMenuPanels.Settings.strInputMode": "Включить иероглифы", "DE.Views.FileMenuPanels.Settings.strLiveComment": "Включить отображение комментариев в тексте", "DE.Views.FileMenuPanels.Settings.strShowChanges": "Отображать изменения при совместной работе", @@ -938,6 +941,7 @@ "DE.Views.FileMenuPanels.Settings.textAutoRecover": "Автовосстановление", "DE.Views.FileMenuPanels.Settings.textAutoSave": "Автосохранение", "DE.Views.FileMenuPanels.Settings.textDisabled": "Отключено", + "DE.Views.FileMenuPanels.Settings.textForceSave": "Сохранить на сервере", "DE.Views.FileMenuPanels.Settings.textMinute": "Каждую минуту", "DE.Views.FileMenuPanels.Settings.txtAll": "Все", "DE.Views.FileMenuPanels.Settings.txtCm": "Сантиметр", @@ -1070,6 +1074,7 @@ "DE.Views.LeftMenu.tipSearch": "Поиск", "DE.Views.LeftMenu.tipSupport": "Обратная связь и поддержка", "DE.Views.LeftMenu.tipTitles": "Заголовки", + "DE.Views.LeftMenu.txtDeveloper": "РЕЖИМ РАЗРАБОТЧИКА", "DE.Views.MailMergeEmailDlg.cancelButtonText": "Отмена", "DE.Views.MailMergeEmailDlg.filePlaceholder": "PDF", "DE.Views.MailMergeEmailDlg.okButtonText": "Отправить", @@ -1342,7 +1347,7 @@ "DE.Views.TableSettings.textSelectBorders": "Выберите границы, к которым надо применить выбранный стиль", "DE.Views.TableSettings.textTemplate": "По шаблону", "DE.Views.TableSettings.textTotal": "Итоговая", - "DE.Views.TableSettings.textWrap": "Обтекание текстом", + "DE.Views.TableSettings.textWrap": "Стиль обтекания", "DE.Views.TableSettings.textWrapNoneTooltip": "Встроенная таблица", "DE.Views.TableSettings.textWrapParallelTooltip": "Плавающая таблица", "DE.Views.TableSettings.tipAll": "Задать внешнюю границу и все внутренние линии", diff --git a/apps/documenteditor/main/resources/help/en/HelpfulHints/About.htm b/apps/documenteditor/main/resources/help/en/HelpfulHints/About.htm index 722746f9a..3c10ae6a4 100644 --- a/apps/documenteditor/main/resources/help/en/HelpfulHints/About.htm +++ b/apps/documenteditor/main/resources/help/en/HelpfulHints/About.htm @@ -9,8 +9,8 @@

    About Document Editor

    -

    Document Editor is an online application that lets you look through - and edit documents directly in your browser.

    +

    Document Editor is an online application that lets you look through + and edit documents directly in your browser.

    Using Document Editor, you can perform various editing operations like in any desktop editor, print the edited documents keeping all the formatting details or download them onto your computer hard disk drive as PDF, TXT, DOCX, ODT, or HTML files.

    diff --git a/apps/documenteditor/main/resources/help/en/HelpfulHints/CollaborativeEditing.htm b/apps/documenteditor/main/resources/help/en/HelpfulHints/CollaborativeEditing.htm index d584e3ce2..cb92d719a 100644 --- a/apps/documenteditor/main/resources/help/en/HelpfulHints/CollaborativeEditing.htm +++ b/apps/documenteditor/main/resources/help/en/HelpfulHints/CollaborativeEditing.htm @@ -12,12 +12,13 @@

    Collaborative Document Editing

    Document Editor offers you the possibility to work at a document collaboratively with other users. This feature includes:

    +

    Co-editing

    Document Editor allows to select one of the two available co-editing modes. Fast is used by default and shows the changes made by other users in realtime. Strict is selected to hide other user changes until you click the Save Save icon icon to save your own changes and accept the changes made by others. The mode can be selected in the Advanced Settings.

    When a document is being edited by several users simultaneously in the Strict mode, the edited text passages are marked with dashed lines of different colors. By hovering the mouse cursor over one of the edited passages, the name of the user who is editing it at the moment is displayed. The Fast mode will show the actions and the names of the co-editors once they are editing the text.

    @@ -36,7 +37,8 @@

    All the messages left by users will be displayed on the panel on the left. If there are new messages you haven't read yet, the chat icon will look like this - Chat icon.

    To close the panel with chat messages, click the Chat icon icon once again.

    -

    Comments*

    +
    +

    Comments*

    To leave a comment,

    1. select a text passage where you think there is an error or problem,
    2. @@ -57,7 +59,7 @@

      New comments added by other users will become visible only after you click the Save icon icon in the left upper corner of the top toolbar.

      To close the panel with comments, click the Comments icon icon once again.

      -

      *available for paid versions only

      +

      *available for paid versions only

    \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm b/apps/documenteditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm index 3532bb2c9..9dab526a4 100644 --- a/apps/documenteditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm +++ b/apps/documenteditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm @@ -25,17 +25,17 @@ Open the Search panel to start searching for a character/word/phrase in the currently edited document. - Open 'Comments' panel* + Open 'Comments' panel* Ctrl+Shift+H Open the Comments panel to add your own comment or reply to other users' comments. - Open comment field* + Open comment field* Alt+H Open a data entry field where you can add the text of your comment. - - Open 'Chat' panel* + + Open 'Chat' panel* Alt+Q Open the Chat panel and send a message. @@ -347,7 +347,7 @@ Hold down the Ctrl key and use the keybord arrows to move the selected object by three pixels at a time. -

    * - available for paid versions only

    +

    * - available for paid versions only

    \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/en/UsageInstructions/SavePrintDownload.htm b/apps/documenteditor/main/resources/help/en/UsageInstructions/SavePrintDownload.htm index c3fb90e76..878bf8b1a 100644 --- a/apps/documenteditor/main/resources/help/en/UsageInstructions/SavePrintDownload.htm +++ b/apps/documenteditor/main/resources/help/en/UsageInstructions/SavePrintDownload.htm @@ -9,29 +9,29 @@
    -

    Save/download/print your document

    -

    By default, Document Editor automatically saves your file each 2 seconds when you work on it preventing your data loss in case of the unexpected program closing. If you co-edit the file in the Fast mode, the timer requests for updates 25 times a second and saves the changes if they have been made. When the file is being co-edited in the Strict mode, changes are automatically saved at 10-minute intervals. If you need, you can easily select the preferred co-editing mode or disable the Autosave feature on the Advanced Settings page.

    +

    Save/download/print your document

    +

    By default, Document Editor automatically saves your file each 2 seconds when you work on it preventing your data loss in case of the unexpected program closing. If you co-edit the file in the Fast mode, the timer requests for updates 25 times a second and saves the changes if they have been made. When the file is being co-edited in the Strict mode, changes are automatically saved at 10-minute intervals. If you need, you can easily select the preferred co-editing mode or disable the Autosave feature on the Advanced Settings page.

    To save your current document manually,

    - +

    To download the resulting document onto your computer hard disk drive,

    1. click the File File icon icon at the left sidebar,
    2. select the Download as... option,
    3. choose one of the available formats depending on your needs: PDF, TXT, DOCX, ODT, HTML.
    - +

    To print out the current document,

    -

    After that a PDF file will be generated on the basis of the document. You can open and print it out, or save onto your computer hard disk drive or removable medium to print it out later.

    +

    After that a PDF file will be generated on the basis of the document. You can open and print it out, or save onto your computer hard disk drive or removable medium to print it out later.

    \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/en/UsageInstructions/ViewDocInfo.htm b/apps/documenteditor/main/resources/help/en/UsageInstructions/ViewDocInfo.htm index b5cb6787c..2c6b5ee95 100644 --- a/apps/documenteditor/main/resources/help/en/UsageInstructions/ViewDocInfo.htm +++ b/apps/documenteditor/main/resources/help/en/UsageInstructions/ViewDocInfo.htm @@ -12,14 +12,16 @@

    To access the detailed information about the currently edited document, click the File File icon icon at the left sidebar and select the Document Info... option.

    General Information

    The document information includes document title, author, location, creation date, and statistics: the number of pages, paragraphs, words, symbols, symbols with spaces.

    -

    Permission Information

    -

    Note: this option is not available for users with the Read Only permissions.

    -

    To find out, who have rights to view or edit the document, select the Access Rights... option at the left sidebar.

    -

    You can also change currently selected access rights by pressing the Change access rights button in the Persons who have rights section.

    -

    Version History

    -

    Note: this option is not available for free accounts as well as for users with the Read Only permissions.

    -

    To view all the changes made to this document, select the Version History option at the left sidebar. You'll see the list of this document versions (major changes) and revisions (minor changes) with the indication of each version/revision author and creation date and time. For document versions, the version number is also specified (e.g. ver. 2). To know exactly which changes have been made in each separate version/revision, you can view the one you need by clicking it at the left sidebar. The changes made by the version/revision author are marked with the color which is displayed next to the author name on the left sidebar. To return to the document current version, click the Back to Document link on the top of the version list.

    +
    +

    Permission Information

    +

    Note: this option is not available for users with the Read Only permissions.

    +

    To find out, who have rights to view or edit the document, select the Access Rights... option at the left sidebar.

    +

    You can also change currently selected access rights by pressing the Change access rights button in the Persons who have rights section.

    +

    Version History

    +

    Note: this option is not available for free accounts as well as for users with the Read Only permissions.

    +

    To view all the changes made to this document, select the Version History option at the left sidebar. You'll see the list of this document versions (major changes) and revisions (minor changes) with the indication of each version/revision author and creation date and time. For document versions, the version number is also specified (e.g. ver. 2). To know exactly which changes have been made in each separate version/revision, you can view the one you need by clicking it at the left sidebar. The changes made by the version/revision author are marked with the color which is displayed next to the author name on the left sidebar. To return to the document current version, click the Back to Document link on the top of the version list.

    +

    To close the File panel and return to document editing, select the Back to Document option.

    - + \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/en/editor.css b/apps/documenteditor/main/resources/help/en/editor.css index e368fecd4..afbea2043 100644 --- a/apps/documenteditor/main/resources/help/en/editor.css +++ b/apps/documenteditor/main/resources/help/en/editor.css @@ -19,6 +19,13 @@ margin-right: 30px; margin-bottom: 10px; } +img.floatright +{ +float: right; +margin-left: 30px; +margin-bottom: 10px; +} + li { line-height: 2em; diff --git a/apps/documenteditor/main/resources/help/en/images/chartsettings2.png b/apps/documenteditor/main/resources/help/en/images/chartsettings2.png index 742130b8f..e96ba9c2a 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/chartsettings2.png and b/apps/documenteditor/main/resources/help/en/images/chartsettings2.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/formattingpresets.png b/apps/documenteditor/main/resources/help/en/images/formattingpresets.png index be198c35a..60c1ac73a 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/formattingpresets.png and b/apps/documenteditor/main/resources/help/en/images/formattingpresets.png differ diff --git a/apps/documenteditor/main/resources/help/fr/HelpfulHints/About.htm b/apps/documenteditor/main/resources/help/fr/HelpfulHints/About.htm index 2c44c660a..4555e8c71 100644 --- a/apps/documenteditor/main/resources/help/fr/HelpfulHints/About.htm +++ b/apps/documenteditor/main/resources/help/fr/HelpfulHints/About.htm @@ -1,16 +1,16 @@  - A propos de TeamLab Document Editor + A propos de Document Editor - +
    -

    A propos de TeamLab Document Editor

    -

    TeamLab Document Editor est une application en ligne qui vous permet de parcourir et de modifier des documents directement sur le portail TeamLab.

    -

    En utilisant TeamLab Document Editor, vous pouvez effectuer de différentes opérations d'édition comme en utilisant n'importe quel éditeur de bureau, +

    A propos de Document Editor

    +

    Document Editor est une application en ligne qui vous permet de parcourir et de modifier des documents directement sur le portail .

    +

    En utilisant Document Editor, vous pouvez effectuer de différentes opérations d'édition comme en utilisant n'importe quel éditeur de bureau, imprimer les documents modifiés en gardant la mise en forme ou les télécharger sur votre disque dur au format PDF, TXT, DOCX, DOC, ODT, RTF, HTML, et EPUB.

    diff --git a/apps/documenteditor/main/resources/help/fr/HelpfulHints/AdvancedSettings.htm b/apps/documenteditor/main/resources/help/fr/HelpfulHints/AdvancedSettings.htm index fd1aab34b..834523e0c 100644 --- a/apps/documenteditor/main/resources/help/fr/HelpfulHints/AdvancedSettings.htm +++ b/apps/documenteditor/main/resources/help/fr/HelpfulHints/AdvancedSettings.htm @@ -1,15 +1,15 @@  - Paramètres avancés de TeamLab Document Editor + Paramètres avancés de Document Editor - +
    -

    Paramètres avancés de TeamLab Document Editor

    -

    TeamLab Document Editor vous permet de modifier ses paramètres avancés. Pour y accéder, cliquez sur l'icône Fichier icône Fichier sur la barre latérale gauche et sélectionez l'option Paramètres avancés... ou utilisez l'icône Paramètres avancés dans le coin supérieur droit de la barre d'outils.

    +

    Paramètres avancés de Document Editor

    +

    Document Editor vous permet de modifier ses paramètres avancés. Pour y accéder, cliquez sur l'icône Fichier icône Fichier sur la barre latérale gauche et sélectionez l'option Paramètres avancés... ou utilisez l'icône Paramètres avancés dans le coin supérieur droit de la barre d'outils.

    Les paramètres avancés sont les suivants :

    -
  • Hinting sert à sélectionner le type d'affichage de la police dans TeamLab Document Editor : +
  • Hinting sert à sélectionner le type d'affichage de la police dans Document Editor :
  • \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/fr/HelpfulHints/KeyboardShortcuts.htm b/apps/documenteditor/main/resources/help/fr/HelpfulHints/KeyboardShortcuts.htm index c82f91e0e..f1722676d 100644 --- a/apps/documenteditor/main/resources/help/fr/HelpfulHints/KeyboardShortcuts.htm +++ b/apps/documenteditor/main/resources/help/fr/HelpfulHints/KeyboardShortcuts.htm @@ -3,7 +3,7 @@ Raccourcis clavier - + @@ -16,7 +16,7 @@ Ouvrir le volet 'Fichier' Alt+F - Ouvrir le volet Fichier pour enregistrer, télécharger, imprimer le document actuel, afficher ses informations, créer un nouveau document ou ouvrir un existant, accéder à l'aide de TeamLab Document Editor ou aux paramètres avancés. + Ouvrir le volet Fichier pour enregistrer, télécharger, imprimer le document actuel, afficher ses informations, créer un nouveau document ou ouvrir un existant, accéder à l'aide de Document Editor ou aux paramètres avancés. Ouvrir le volet 'Recherche' @@ -33,7 +33,7 @@ Alt+H Ouvrir un champ de saisie où vous pouvez ajouter le texte de votre commentaire. - + Ouvrir le volet 'Chat' Alt+Q Ouvrir le volet Chat et envoyer un message. @@ -41,7 +41,7 @@ Enregistrer le document Ctrl+S - Enregistrer toutes les modifications dans le document actuellement modifié à l'aide de TeamLab Document Editor. + Enregistrer toutes les modifications dans le document actuellement modifié à l'aide de Document Editor. Imprimer le document @@ -56,7 +56,7 @@ Plein écran F11 - Passer à l'affichage plein écran pour adapter TeamLab Document Editor à votre écran. + Passer à l'affichage plein écran pour adapter Document Editor à votre écran. Navigation @@ -310,6 +310,11 @@ Ctrl+Maj+M Diminuer le retrait gauche. + + Add page number + Ctrl+Maj+P + Add the current page number to the text or to the page footer. + Modification des objets diff --git a/apps/documenteditor/main/resources/help/fr/HelpfulHints/Navigation.htm b/apps/documenteditor/main/resources/help/fr/HelpfulHints/Navigation.htm index 1ac0b317e..2cc890517 100644 --- a/apps/documenteditor/main/resources/help/fr/HelpfulHints/Navigation.htm +++ b/apps/documenteditor/main/resources/help/fr/HelpfulHints/Navigation.htm @@ -9,7 +9,7 @@

    Paramètres d'affichage et outils de navigation

    -

    TeamLab Document Editor est doté de plusieurs outils qui vous aide à visionner et naviguer à travers votre document : les règles, le zoom, les boutons page précédente / suivante, l'affichage des numéros de page.

    +

    Document Editor est doté de plusieurs outils qui vous aide à visionner et naviguer à travers votre document : les règles, le zoom, les boutons page précédente / suivante, l'affichage des numéros de page.

    Régler les paramètres d'affichage

    Pour régler les paramètres d'affichage par défaut et définir le mode le plus convenable de travailler avec le document, cliquez sur l'icône Afficher les paramètres Afficher les paramètres dans le coin supérieur droit de la barre d'outils et sélectionnez les éléments de l'interface à afficher/masquer. Vous pouvez choisir une des options suivantes de la liste déroulante Afficher les paramètres : diff --git a/apps/documenteditor/main/resources/help/fr/HelpfulHints/Search.htm b/apps/documenteditor/main/resources/help/fr/HelpfulHints/Search.htm index 2ffab576f..94264ecd2 100644 --- a/apps/documenteditor/main/resources/help/fr/HelpfulHints/Search.htm +++ b/apps/documenteditor/main/resources/help/fr/HelpfulHints/Search.htm @@ -3,7 +3,7 @@ Fonctions de recherche et remplacement - + diff --git a/apps/documenteditor/main/resources/help/fr/HelpfulHints/SpellChecking.htm b/apps/documenteditor/main/resources/help/fr/HelpfulHints/SpellChecking.htm index 98159f1bf..6af3c63c0 100644 --- a/apps/documenteditor/main/resources/help/fr/HelpfulHints/SpellChecking.htm +++ b/apps/documenteditor/main/resources/help/fr/HelpfulHints/SpellChecking.htm @@ -9,7 +9,7 @@

    Vérification de l'orthographe

    -

    TeamLab Document Editor vous permet de vérifier l'orthographe du texte saisi dans une certaine langue et corriger des fautes lors de l'édition.

    +

    Document Editor vous permet de vérifier l'orthographe du texte saisi dans une certaine langue et corriger des fautes lors de l'édition.

    Tout d'abord, choisissez la langue pour tout le document. Cliquez sur l'icône Définir la langue du document située dans la partie droite de la Barre d'état. Dans la fenêtre ouverte sélectionnez la langue nécessaire et cliquez sur OK. La langue sélectionnée sera appliquée à tout le document.

    Définir la langue du document

    Pour sélectionner une langue différente pour un fragment, sélectionnez le fragment nécessaire avec la souris et utilisez le menu Vérification de l'orthographe - Langue du texte de la Barre d'état.

    diff --git a/apps/documenteditor/main/resources/help/fr/HelpfulHints/SupportedFormats.htm b/apps/documenteditor/main/resources/help/fr/HelpfulHints/SupportedFormats.htm index 58faf7781..1600229a4 100644 --- a/apps/documenteditor/main/resources/help/fr/HelpfulHints/SupportedFormats.htm +++ b/apps/documenteditor/main/resources/help/fr/HelpfulHints/SupportedFormats.htm @@ -3,7 +3,7 @@ Formats des documents électroniques pris en charge - + @@ -12,7 +12,7 @@

    Les documents électroniques représentent l'un des types des fichiers les plus utilisés en informatique. Grâce à l'utilisation du réseau informatique tant développé aujourd'hui, il est possible et plus pratique de distribuer des documents électroniques que des versions imprimées. Les formats de fichier ouverts et propriétaires sont bien nombreux à cause de la variété des périphériques utilisés pour la présentation des documents. - TeamLab Document Editor prend en charge les formats les plus populaires.

    + Document Editor prend en charge les formats les plus populaires.

    @@ -26,7 +26,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -73,9 +73,9 @@ - - + + diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/AddBorders.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/AddBorders.htm index ce23f2eb7..33a55da14 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/AddBorders.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/AddBorders.htm @@ -9,9 +9,9 @@

    Ajouter des bordures

    -

    Pour ajouter des bordures à un paragraphe, une page ou au document entier,

    +

    Pour ajouter des bordures à un paragraphe, à une page ou à tout le document,

      -
    1. placez le curseur dans le paragraphe nécessaire, ou à l'aide de la souris sélectionnez plusieurs paragraphes ou le texte entier du document en utilisant la combinaison de touches Ctrl+A,
    2. +
    3. placez le curseur dans le paragraphe nécessaire, ou à l'aide de la souris sélectionnez plusieurs paragraphes ou tout le texte du document en utilisant la combinaison de touches Ctrl+A,
    4. cliquez avec le bouton droit de la souris et sélectionnez l'option du menu Paramètres avancés du paragraphe ou utilisez le lien Afficher les paramètres avancés de la barre latérale droite,
    5. passez à l'onglet Bordures et remplissage dans la fenêtre Paragraphe - Paramètres avancés ouverte,
    6. définissez la valeur nécessaire pour la Taille de bordure et sélectionnez une Couleur de la bordure,
    7. @@ -19,8 +19,8 @@
    8. cliquez sur le bouton OK.

    Paramètres du paragraphe avancés - Bordures et remplissage

    -

    Après avoir ajouté des bordures, vous pouvez également définir les marges c'est-à-dire la distance entre les bordures à droite, à gauche, en haut et en bas et le texte du paragraphe à l'intérieur.

    -

    Pour définir les valeurs nécessaires, passez à l'onglet Marges de la fenêtre Paragraphe - Paramètres avancés :

    +

    Après avoir ajouté des bordures, vous pouvez également définir les Marges intérieures c'est-à-dire la distance entre les bordures à droite, à gauche, en haut et en bas et le texte du paragraphe à l'intérieur.

    +

    Pour définir les valeurs nécessaires, passez à l'onglet Marges intérieures de la fenêtre Paragraphe - Paramètres avancés :

    Paramètres du paragraphe avancés - Marges

    diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/AlignText.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/AlignText.htm index af7bfa12b..e5f6a0b3d 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/AlignText.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/AlignText.htm @@ -1,23 +1,23 @@  - Alignement du texte sur la ligne ou le paragraphe + Alignement du texte d'un paragraphe - +
    -

    Alignement du texte sur la ligne ou le paragraphe

    +

    Alignement du texte d'un paragraphe

    Le texte peut être aligné de quatre façons : aligné à gauche, centré, aligné à droite et justifié. Pour ce faire,

      -
    1. placez le curseur à la position où vous voulez appliquer l'alignement (cela peut être une nouvelle ligne ou le texte déjà saisi ),
    2. +
    3. placez le curseur à la position où vous voulez appliquer l'alignement (une nouvelle ligne ou le texte déjà saisi ),
    4. sélectionnez le type d'alignement que vous allez appliquer :
        -
      • Gauche - pour aligner le texte sur le côté gauche de la page (le côté droit reste non aligné) cliquez sur l'icône Aligner à gauche l'icône Aligner à gauche située sur la barre d'outils supérieure.
      • -
      • Centré - pour aligner le texte par le centre de la page (les côté droit et gauche restent non alignés) cliquez sur l'icône Alignement centré l'icône Alignement centré située sur la barre d'outils supérieure.
      • -
      • Droit - pour aligner le texte sur le côté droit de la page (le côté gauche reste non aligné) cliquez sur l'icône Aligner à droite l'icône Aligner à droite située sur la barre d'outils supérieure.
      • -
      • Justifié - pour aligner le texte sur les deux côtés à la fois, gauche et droit ( l'espacement supplémentaire est ajouté si nécessaire pour garder l'alignement) cliquez sur l'icône Justifié l'icône Justifié située sur la barre d'outils supérieure.
      • +
      • Gauche - pour aligner du texte à gauche de la page (le côté droit reste non aligné), cliquez sur l'icône Aligner à gauche l'icône Aligner à gauche située sur la barre d'outils supérieure.
      • +
      • Centré - pour aligner du texte au centre de la page (le côté droit et le côté gauche, ils restent non alignés), cliquez sur l'icône Aligner au centre l'icône Alignement centré située sur la barre d'outils supérieure.
      • +
      • Droit - pour aligner du texte à droite de la page (le côté gauche reste non aligné), cliquez sur l'icône Aligner à droite l'icône Aligner à droite située sur la barre d'outils supérieure.
      • +
      • Justifié - pour aligner du texte à gauche et à droite à la fois ( l'espacement supplémentaire est ajouté si nécessaire pour garder l'alignement), cliquez sur l'icône Justifié l'icône Justifié située sur la barre d'outils supérieure.
    diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/BackgroundColor.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/BackgroundColor.htm index 3c0a952d6..e76430b45 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/BackgroundColor.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/BackgroundColor.htm @@ -1,41 +1,36 @@  - - Sélectionner la couleur d'arrière-plan pour un paragraphe - - - - - -
    -

    Sélectionner la couleur d'arrière-plan pour un paragraphe

    -

    La couleur d'arrière-plan est appliquée au paragraphe entier.

    -

    Pour appliquer la couleur d'arrière-plan à un certain paragraphe ou changer la couleur actuelle,

    -
      -
    1. sélectionnez un jeu de couleurs pour votre document à partir de ceux qui sont disponibles en cliquant sur l'icône Modifier le jeu de couleurs Modifier le jeu de couleurs sur la barre d'outils supérieure
    2. -
    3. placez le curseur dans le paragraphe nécessaire, ou sélectionnez plusieurs paragraphes avec la souris ou le texte entier en utilisant la combinaison de touches Ctrl+A
    4. -
    5. ouvrez la fenêtre des palettes de couleurs en cliquant sur le champ de couleurs à coté de la légende Couleur d'arrière-plan sur la barre latérale droite -

      Remarque : vous pouvez accéder à la fenêtre de la palette de couleurs en cliquant sur le lien 'Afficher les paramètres avancés' sur la barre latérale droite ou en sélectionnant l'option 'Paramètres avancés du paragraphe' du menu contextuel, ensuite en passant à l'onglet 'Bordures et remplissage' de la fenêtre 'Paragraphe - Paramètres avancés' et en cliquant sur le champ de couleur à côté de la légende Arrière-plan.

      -
    6. -
    7. choisissez une couleur dans les palettes disponibles -

      Palette

      -
        -
      • Couleurs de thème - les couleurs qui correspondent à la palette de couleurs sélectionnée du document.
      • -
      • Couleurs standart - le jeu de couleurs par défaut.
      • -
      • Couleur personnalisée - choisissez cette option si il n'y a pas de couleur nécessaire dans les palettes disponibles. Sélectionnez la gamme de couleurs nécessaire en déplacant le curseur vertical et définissez la couleur spécifique en faisant glisser le sélecteur de couleur dans le grand champ de couleur carré. Une fois que vous sélectionnez une couleur avec le sélecteur de couleur, les valeurs de couleur appropriées RGB et sRGB seront affichées dans les champs à droite. Vous pouvez également spécifier une couleur sur la base du modèle de couleur RGB (RVB) en entrant les valeurs numériques nécessaires dans les champs R, G, B (rouge, vert, bleu) ou saisir le code hexadécimal dans le champ sRGB marqué par le signe #. La couleur sélectionnée apparaît dans la case de prévisualisation Nouveau. Si l'objet a déjà été rempli avec une couleur personnalisée, cette couleur sera affichée dans la case Actuel afin que vous puissiez comparer les couleurs originales et modifiées. Lorsque la couleur est spécifiée, cliquez sur le bouton Ajouter : -

        Palette - Couleur personnalisée

        -

        La couleur personnalisée sera appliquée au paragraphe et ajoutée à la palette Couleur personnalisée.

        -
      • -
      -
    8. -
    -
    -

    Pour effacer une couleur d'arrière-plan d'un certain paragraphe,

    -
      -
    1. placez le curseur dans le paragraphe nécessaire, ou sélectionnez plusieurs paragraphes avec la souris ou tout le texte en utilisant la combinaison des touches Ctrl+A
    2. -
    3. ouvrez la fenêtre des palettes de couleur en cliquant sur le champ de couleur à côté de la légende Couleur d'arrière-plan
    4. -
    5. sélectionnez l'icône Pas de remplissage.
    6. -
    -
    - + + Sélectionner la couleur d'arrière-plan pour un paragraphe + + + + + +
    +

    Sélectionner la couleur d'arrière-plan pour un paragraphe

    +

    La couleur d'arrière-plan est appliquée au paragraphe entier et remplit complètement l’espace du paragraphe de la marge de page gauche à la marge de page droite.

    +

    Pour appliquer la couleur d'arrière-plan au paragraphe particulier ou changer la couleur actuelle,

    +
      +
    1. sélectionnez un jeu de couleurs pour votre document à partir des modèles disponibles en cliquant sur l'icône Modifier le jeu de couleurs Modifier le jeu de couleurs sur la barre d'outils supérieure
    2. +
    3. placez le curseur dans le paragraphe nécessaire, ou sélectionnez plusieurs paragraphes avec la souris ou le texte entier en utilisant la combinaison de touches Ctrl+A
    4. +
    5. ouvrez la fenêtre des palettes de couleurs. Vous pouvez l'accéder par une des façons suivantes: +
        +
      • cliquez sur la flèche vers le bas à côté de l'icône icône Сouleur d'arrière plan d'un paragraphe sur la barre d'outils supérieure, ou
      • +
      • utilisez le champ de couleurs à côté de la légende Сouleur d'arrière plan sur la barre latérale droite,
      • +
      • cliquez sur le lien 'Afficher les paramètres avancés' sur la barre latérale droite ou sélectionnez l'option 'Paramètres avancés du paragraphe' dans le menu contextuel, puis passez à l'onglet 'Bordures et remplissage' dans la fenêtre 'Paragraphe - Paramètres avancés' et cliquez sur le champ de couleurs à coté de la légende Couleur d'arrière-plan.
      • +
      +
    6. +
    7. choisissez une couleur dans les palettes disponibles
    8. +
    +

    Après avoir sélectionné la couleur nécessaire à l'aide de l'icône icône Сouleur d'arrière plan d'un paragraphe, vous pourrez appliquer cette couleur à n’importe quel paragraphe sélectionné. Pour le faire, cliquez sur l'icône Sélectionner la couleur d'arrière-plan d'un paragraphe (elle affiche la couleur séléctionnée), sans avoir à choisir cette couleur dans la palette encore une fois. Si vous utilisez l'option Couleur d'arrière plan sur la barre de droite ou dans la fenêtre 'Paragraphe - Paramètres avancés', n'oubliez pas que la couleur sélectionnée n'est pas conservée pour l'accéder rapidement. (Ces options peuvent être utiles si vous souhaitez sélectionner une couleur d’arrière-plan différente pour un paragraphe spécifique, lors de l'utilisation de la couleur de base sélectionnée à l'aide l'icône Couleur d'arrière-plan d'un paragraphe).

    +
    +

    Pour effacer la couleur d'arrière d'un paragraphe particulier,

    +
      +
    1. placez le curseur dans le paragraphe nécessaire, ou sélectionnez plusieurs paragraphes à l'aide de la souris ou le texte entier en utilisant la combinaison de touches Ctrl+A
    2. +
    3. en cliquant sur le champ de couleur à côté de la légende Сouleur d'arrière plan sur la barre latérale droite, ouvrez la fenêtre des palettes de couleurs
    4. +
    5. sélectionnez l'icône Pas de remplissage.
    6. +
    +
    + \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/ChangeColorScheme.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/ChangeColorScheme.htm new file mode 100644 index 000000000..0fc6fb872 --- /dev/null +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/ChangeColorScheme.htm @@ -0,0 +1,28 @@ + + + + Modifier le jeu de couleurs + + + + + + +
    +

    Modifier le jeu de couleurs

    +

    Les jeux de couleurs s'appliquent au document entier. Utilisés pour le changement rapide de l'apparence de votre document, les jeux de couleurs définissent la palette Couleurs de thème pour les éléments du document (police, arrière-plan, tableaux, formes automatiques, graphiques). Si vous appliquez des Couleurs de thèmes aux éléments du document et sélectionnez un nouveau Jeu de couleurs, les couleurs appliquées aux éléments de votre document, par conséquent, seront modifiées.

    +

    Pour modifier le jeu de couleurs, cliquez sur la flèche vers le bas située à côté de l'icône Modifier le jeu de couleurs Modifier le jeu de couleurs dans la partie droite de la barre d'outils et sélectionnez le jeu de couleurs nécessaire parmi les variantes disponibles : Bureau, Niveaux de gris, Apex, Aspect, Civique, Rotonde, Capitaux, Flux, Fonderie, Médian, Métro, Module, Opulent, Oriel, Origine, Papier, Solstice, Technique, Promenade, Urban, Verve.

    +

    Color Schemes

    +

    Lorsque le jeu de couleurs est sélectionné, vous pouvez choisir des couleurs dans une fenêtre de palettes de couleurs qui vont correspondre à l'élément auquel vous souhaitez appliquer la couleur. Les palettes suivantes sont disponibles :

    +

    Palette

    +
      +
    • Couleurs de thème - les couleurs qui correspondent à la palette de couleurs sélectionnée du document.
    • +
    • Couleurs standard - le jeu de couleurs par défaut. Le jeu de couleurs sélectionné ne les affecte pas.
    • +
    • Couleur personnalisée - choisissez cette option si la couleur nécessaire n'est pas disponible dans la palette. Sélectionnez la plage de couleurs nécessaire en déplaçant le curseur de couleur verticale et définissez la couleur spécifique en faisant glisser le sélecteur de couleur dans le grand champ de couleur. Une fois que vous avez sélectionné une couleur à l'aide du sélecteur de couleur, les valeurs des couleurs RGB et sRGB appropriées s’afficheront dans les champs à droite. Vous pouvez aussi spécifier une couleur sur la base de la palette de couleurs RGB en saisissant les valeurs numériques nécessaires dans les champs R, G, B (rouge, vert, bleu) ou entrez le code hexadécimal sRGB dans le champ marqué du signe #. La couleur sélectionnée apparaît dans la zone d'aperçu Nouvelle. Si une couleur personnalisée a été appliquée à l'objet, cette couleur s'affiche dans la fenêtre Actuelle, ainsi vous pouvez comparer les couleurs originales et modifiées. Lorsque la couleur est spécifiée, cliquez sur le bouton Ajouter : +

      Palette - Custom Color

      +

      La couleur personnalisée sera appliquée à l’élément sélectionné et ajoutée dans la palette Couleur personnalisée.

      +
    • +
    +
    + + \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/CopyPasteUndoRedo.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/CopyPasteUndoRedo.htm index 88b8dc1ba..9556e1f7a 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/CopyPasteUndoRedo.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/CopyPasteUndoRedo.htm @@ -1,23 +1,35 @@  - - Copier/coller les passages de texte, annuler/rétablir vos actions - - - - - -
    -

    Copier/coller les passages de texte, annuler/rétablir vos actions

    -

    Pour effectuer ces opérations, utilisez les icônes correspondantes de la barre d'outils supérieure :

    -
      -
    • Copier – sélectionnez le fragment du texte et utilisez l'icône Copier l'icône Copier pour copier la sélection dans le presse-papiers de l'ordinateur. Le texte copié peut être inséré plus tard dans un autre endroit dans le même document, dans un autre document, ou dans un autre programme.
    • -
    • Coller – trouvez l'endroit dans votre document où vous voulez coller le fragment de texte précédemment copié et utilisez l'icône Coller Paste icon . - Le texte sera inséré à la position actuelle du curseur. Le texte peut être copié à partir du même document, d'un autre document ou à partir de l'autre programme.
    • -
    • Annuler – utilisez l'icône Annuler l'icône annuler pour annuler la dernière opération effectuée.
    • -
    • Rétablir – utilisez l'icône Rétablir l'icône rétablir pour rétablir la dernière opération annulée.
    • -
    -

    Remarque : pour des raisons de sécurité certains navigateurs n’autorisent pas l’accès au presse-papiers de votre ordinateur. Ainsi quand vous essayez de sélectionner l'une des opérations pour couper, le programme va vous demander d'utiliser le raccourcis clavier commun pour tous les navigateurs : Ctrl+X pour couper, Ctrl+C pour copier, Ctrl+V pour coller.

    -
    - + + Copier/coller les passages de texte, annuler/rétablir vos actions + + + + + +
    +

    Copier/coller les passages de texte, annuler/rétablir vos actions

    +

    Pour couper, copier, coller des passages de texte et des objets insérés (formes automatiques, images, graphiques) dans le document actuel utilisez les options correspondantes dans le menu contextuel ou les icônes de la barre d'outils supérieure :

    +
      +
    • Couper – sélectionnez un fragment de texte ou un objet et utilisez l'option Couper dans le menu contextuel pour supprimer la sélection et l'envoyer dans le presse-papiers de l'ordinateur. Les données coupées peuvent être insérées plus tard dans un autre endroit dans le même document.
    • +
    • Copier – sélectionnez un fragment de texte ou un objet et utilisez l'option Copier dans le menu contextuel, ou l'icône Copier l'icône Copier de la barre d'outils supérieure pour copier la sélection dans le presse-papiers de l'ordinateur. Les données coupées peuvent être insérées plus tard dans un autre endroit dans le même document.
    • +
    • + Coller – trouvez l'endroit dans votre document à coller le fragment de texte / objet précédemment copié et utilisez l'option Coller dans le menu contextuel, ou l'icône Coller l'icône Coller de la barre d'outils supérieure. + Le texte / objet sera inséré à la position actuelle du curseur. Le texte peut être copié à partir du même document. Les données peuvent être précédemment copiées à partir du même document. +
    • +
    +

    Pour copier, coller les données à partir de / dans un autre document ou autre programme, utilisez les combinaisons de touches suivantes :

    +
      +
    • Ctrl+X raccourcis clavier pour couper ;
    • +
    • Ctrl+C raccourcis clavier pour copier ;
    • +
    • Ctrl+V raccourcis clavier pour coller.
    • +
    +

    Remarque : au lieu de couper et coller du texte dans le même document, vous pouvez sélectionner le passage de texte nécessaire et le faire glisser à la position nécessaire.

    +

    Pour annuler / rétablir les actions, utilisez les icônes correspondantes de la barre d'outils supérieure ou les raccourcis clavier :

    +
      +
    • Annuler – utilisez l'icône Annuler L'icône Annuler de la barre d'outils supérieure ou la combinaison de touches Ctrl+Z pour annuler la dernière opération effectuée.
    • +
    • Rétablir – utilisez l'icône Rétablir L'icône Rétablir de la barre d'outils supérieure ou la combinaison de touches Ctrl+Y pour rétablir l’opération précédemment annulée.
    • +
    +
    + \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/CreateLists.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/CreateLists.htm index b743cba4f..880d81319 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/CreateLists.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/CreateLists.htm @@ -1,30 +1,32 @@  - - Créer des listes - - - - - - -
    -

    Créer des listes

    -

    Pour créer une liste dans votre document,

    -
      -
    1. placez le curseur à la position où vous voulez commencer la liste (cela peut être une nouvelle ligne ou le texte déjà saisi),
    2. -
    3. sélectionnez le type de liste à créer : -
        -
      • Liste à puces avec les marqueurs. Pour la créer, utilisez l'icône Puces Puces sur la barre d'outils supérieure
      • -
      • Liste numérotée avec les chiffres ou les lettres. Pour la créer, utilisez l'icône Numérotation Numérotation sur la barre d'outils supérieure -

        Remarque: cliquez sur la flèche vers le bas à côté de l'icône Puces ou Numérotation pour sélectionner le format de puces ou de numérotation nécessaire.

        -
      • -
      -
    4. -
    5. appuyez sur la touche Entrée à la fin de la ligne pour ajouter un nouvel élément à la liste. Pour terminer la liste, appuyez sur la touche Retour arrière et continuez le travail.
    6. -
    -

    Vous pouvez aussi changer le retrait du texte dans les listes et leur imbrication en utilisant les icônes Plan l'icône Plan, Réduire le retrait l'icône Réduire le retrait et Augmenter le retrait Augmenter le retrait sur la barre d'outils supérieure.

    -

    Remarque: les paramètres supplémentaires du retrait et de l'espacemente peuvent être modifiés à l'aide de la barre latérale droite et la fenêtre des paramètres avancés. Pour en savoir plus, consultez les pages Modifier le retrait des paragraphes et Régler l'interligne du paragraphe.

    -
    - + + Créer des listes + + + + + + +
    +

    Créer des listes

    +

    Pour créer une liste dans votre document,

    +
      +
    1. placez le curseur à la position où vous voulez commencer la liste ( une nouvelle ligne ou le texte déjà saisi),
    2. +
    3. + sélectionnez le type de liste à créer : +
        +
      • Liste à puces avec les marqueurs. Pour la créer, utilisez l'icône Puces Puces sur la barre d'outils supérieure
      • +
      • + Liste numérotée avec les chiffres ou les lettres. Pour la créer, utilisez l'icône Numérotation Numérotation sur la barre d'outils supérieure +

        Remarque: cliquez sur la flèche vers le bas à côté de l'icône Puces ou Numérotation pour sélectionner le format de puces ou de numérotation nécessaire.

        +
      • +
      +
    4. +
    5. désormais un nouveau élément d'une liste numérotée ou non-numérotée apparaît lorsque vous appuyez sur la touche Entrée. Pour terminer la liste, appuyez sur la touche Retour arrière et continuez le travail.
    6. +
    +

    Vous pouvez aussi changer le retrait du texte dans les listes et leur imbrication en utilisant les icônes Liste multiniveau Liste multiniveau, Réduire le retrait Réduire le retrait, et Augmenter le retrait Augmenter le retrait sur la barre d'outils supérieure.

    +

    Remarque: les paramètres supplémentaires du retrait et de l'espacemente peuvent être modifiés à l'aide de la barre latérale droite et la fenêtre des paramètres avancés. Pour en savoir plus, consultez les pages Modifier le retrait des paragraphes et Régler l'interligne du paragraphe.

    +
    + \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/FontTypeSizeColor.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/FontTypeSizeColor.htm index f63f007d4..35c124c28 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/FontTypeSizeColor.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/FontTypeSizeColor.htm @@ -16,17 +16,27 @@
    - + - - - + + + + + + + + + + + + + - + diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/FormattingPresets.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/FormattingPresets.htm index 7b7be4684..3d39c034e 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/FormattingPresets.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/FormattingPresets.htm @@ -1,21 +1,71 @@  - - Appliquer les paramètres de mise en forme prédéfinis - - - - - -
    -

    Appliquer les paramètres de mise en forme prédéfinis

    -

    Pour appliquer une mise en forme prédéfinie,

    -
      -
    1. placez le cursor sur une ligne ou sélectionnez plusieurs lignes ou paragraphes auxquels vous voulez appliquer la mise en forme prédéfinie,
    2. -
    3. sélectionnez la mise en forme nécessaire à droite sur la barre d'outils supérieure.
    4. -
    -

    Les mises en forme prédéfinies sont les suivantes : normal, non-espacement, en-tête 1-9, titre, sous-titre, citation, citation intense, paragraphe de liste.

    -

    Paramètres de mise en forme prédéfinis

    -
    - + + Appliquer les styles de formatage + + + + + +
    +

    Appliquer les styles de formatage

    +

    Chaque style de mise en forme représente un ensemble des options de mise en forme : (taille de la police, couleur, interligne, alignment etc.). Les styles permettent de mettre en forme rapidement les parties différentes du texte (en-têtes, sous-titres, listes,texte normal, citations) au lieu d'appliquer les options de mise en forme différentes individuellement chaque fois que vous en avez besoin. Cela permet également d'assurer une apparence uniforme de tout le document. Un style n'est appliqué au'au paragraphe entier.

    +

    Appliquer des styles par défault

    +

    Pour appliquer un des styles de mise en forme disponibles,

    +
      +
    1. placez le curseur dans le paragraphe nécessaire, ou sélectionnez plusieurs paragraphes pour appliquer un des styles de mise en forme,
    2. +
    3. sélectionnez le style nécessaire à partir de la galerie de styles située à droite de la barre d'outils supérieure.
    4. +
    +

    Les styles de mise en forme disponibles sont : normal, non-espacemen, titre 1-9, title, sous-titre, citation, citation intense, paragraphe de liste.

    +

    Formatting styles

    +

    Modifier des styles disponibles et créer de nouveaux

    +

    Pour modifier le style existant :

    +
      +
    1. Appliquez le style nécessaire à un paragraphe.
    2. +
    3. Sélectionnez le texte du paragraphe et modifiez tous les paramètres de mise en forme dont vous avez besoin.
    4. +
    5. + Enregistrez les modifications effectuées : +
        +
      • cliquez avec le bouton droit de la souris sur le texte en cours de modification, sélectionnez l'option En tant que style et sélectionnez l'option Mettre à jour le style 'Nomdestyle' ('Nomdestyle' correspond au style appliqué à l'étape 1),
      • +
      • ou sélectionnez le fragment du texte en cours de modification avec la souris, ouvrez le menu déroulant de la galerie des styles, cliquez avec le bouton droit de la souris sur le style à modifier et sélectionnez l'option Mettre à jour selon la sélection.
      • +
      +
    6. +
    +

    Une fois que le style est modifié, tous les paragraphes dans le document qui a été mis en forme à l'aide de ce style vont changer leur apparence de manière correspondante.

    +

    Pour créer un tout nouveau style:

    +
      +
    1. Mettez en forme un fragment du texte d'une manière nécessaire.
    2. +
    3. + Choisissez une façon appropriée de sauvegarder le style: +
        +
      • cliquez avec le bouton droit de la souris sur le texte en cours de modification, sélectionnez l'option En tant que style et puis choisissez l'option Créer un nouveau style,
      • +
      • ou sélectionnez le fragment du texte à l'aide de la souris, ouvrez la liste déroulante de la galerie de styles et cliquez sur l'option Nouveau style à partir du fragment sélectionné.
      • +
      +
    4. +
    5. + Définissez les paramètres du nouveau style dans la fenêtre Créer un nouveau style qui s'ouvre : +

      Fenêtre Créer un nouveau style

      +
        +
      • Spécifiez un nom du nouveau style en utilisant le champ correspondant.
      • +
      • Chosissez le style nécessaire du paragraphe suivant en utilisant la liste Style du nouveau paragraphe.
      • +
      • Cliquez sur le bouton OK.
      • +
      +
    6. +
    +

    Le style créé sera ajouté à la galerie des styles.

    +

    Gérez vos styles personnalisés:

    +
      +
    • Pour restaurer les paramètres par défaut d'un style que vous avez modifié, cliquez avec le bouton droit de la souris sur le style que vous voulez restaurer et sélectionnez l'option Restaurer les paramètres par défaut.
    • +
    • + Pour restaurer les paramètres par défaut de tous les styles que vous avez modifiés, cliquez avec le bouton droit de la souris sur le style dans la galerie des styles et sélectionnez l'option Restaurer tous les styles par défaut. +

      Edited style menu

      +
    • +
    • Pour supprimer un des styles que vous avez créé, cliquez avec le bouton droit de la souris sur le style à supprimer et sélectionnez l'option Supprimer le style.
    • +
    • + Pour supprimer tous les nouveaux style que vous avez crées, cliquez avec le bouton droit de la souris sur un des nouveaux styles crées et sélectionnez l'option Supprimer tous les styles personnalisés. +

      Menu style personnalisé

      +
    • +
    +
    + \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/InsertHeadersFooters.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/InsertHeadersFooters.htm index 466a70513..f2097369e 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/InsertHeadersFooters.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/InsertHeadersFooters.htm @@ -1,32 +1,39 @@  - - Insérer en-têtes et pieds de page - - - - - - -
    -

    Insérer en-têtes et pieds de page

    -

    Pour ajouter un en-tête ou un pied de page à votre document ou les modifier,

    -
      -
    1. cliquez sur l'icône Modifier en-tête ou pied de page l'icône Modifier en-tête ou pied de page sur la barre d'outils supérieure,
    2. -
    3. sélectionnez l'une des options suivantes : -
        -
      • Modifier l'en-tête pour insérer ou modifier le texte d'en-tête.
      • -
      • Modifier le pied de page pour insérer ou modifier le texte de pied de page.
      • -
      -
    4. -
    5. modifiez les paramètres actuels pour en-têtes ou pieds de page sur la barre latérale droite : la position du texte par rapport à la partie supérieure (en-têtes) ou inférieure (pour pieds) de la page. - Vous pouvez également cocher la case Première page différente pour appliquer un en-tête ou un pied de page différent pour la première page ou si vous ne voulez pas ajouter un en-tête / un pied de page . La case Pages paires et impaires différentes sert à ajouter de différents en-têtes ou pieds de page pour les pages paires et impaires. -

      Right Sidebar - Header and Footer Settings

      -
    6. -
    -

    Pour saisir un texte ou modifier le texte déjà saisi et régler l'en-tête ou le pied de page, vous pouvez également double-cliquer sur la partie supérieure ou inférieure d'une page ou y cliquer avec le bouton droit de la souris et sélectionner l'option - Modifier l'en-tête ou Modifier le pied de page du menu contextuel.

    -

    Pour passer au corps du document, double-cliquez sur la zone de travail. Le texte que vous utilisez dans l'en-tête ou le pied de page sera affiché en gris.

    -

    Remarque: consultez la section Insérer les numéros de page pour apprendre à ajouter des numéros de page à votre document.

    -
    - + + Insérer les en-têtes et pieds de page + + + + + + +
    +

    Insérer les en-têtes et pieds de page

    +

    Pour ajouter un en-tête ou un pied de page à votre document ou modifier ceux qui déjà existent ,

    +
      +
    1. cliquez sur l'icône Modifier l'en-tête ou le pied de page l'icône Modifier l'en-tête ou le pied de page sur la barre d'outils supérieure,
    2. +
    3. sélectionnez l'une des options suivantes : +
        +
      • Modifier l'en-tête pour insérer ou modifier le texte d'en-tête.
      • +
      • Modifier le pied de page pour insérer ou modifier le texte de pied de page.
      • +
      +
    4. +
    5. modifiez les paramètres actuels pour les en-têtes ou pieds de page sur la barre latérale droite +

      Right Sidebar - Header and Footer Settings

      +
        +
      • Définissez la Position du texte par rapport à la partie supérieure (en-têtes) ou inférieure (pour pieds) de la page.
      • +
      • Cochez la case Première page différente pour appliquer un en-tête ou un pied de page différent pour la première page ou si vous ne voulez pas ajouter un en-tête / un pied de page.
      • +
      • Utilisez la case Pages paires et impaires différentes pour ajouter de différents en-têtes ou pieds de page pour les pages paires et impaires.
      • +
      • L'option Lien vers Précédent est disponible si vous avez déjà des sections dans votre document. Sinon, elle sera grisée. En outre, cette option est non disponible pour toute première section (c'est-à-dire quand un en-tête ou un pied qui appartient à la première section est choisi). Par défaut, cette case est cochée, alors que les mêmes en-têtes/pieds de page sont appliqués à toutes les sections. Si vous sélectionnez une zone d’en-tête ou de pied de page, vous verrez que сette zone est marquée par l'étiquette Same as Previous. Décochez la case Lien vers Préсédent pour utiliser de différents en-têtes et pieds de page pour chaque section du document. L'étiquette Same as Previous sera indisponible.
      • +
      +

      Same as previous label

      +
    6. +
    +

    Pour saisir un texte ou modifier le texte déjà saisi et régler les paramètres de l'en-tête ou le pied de page, vous pouvez également double-cliquer sur la partie supérieure ou inférieure de la page ou cliquer avec le bouton droit de la souris et sélectionner l'option - Modifier l'en-tête ou Modifier le pied de page du menu contextuel.

    +

    Pour passer au corps du document, double-cliquez sur la zone de travail. Le texte que vous utilisez dans l'en-tête ou dans le pied de page sera affiché en gris.

    +

    Remarque : consultez la section Insérer les numéros de page pour apprendre à ajouter des numéros de page à votre document.

    +
    + + diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/InsertImages.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/InsertImages.htm index 4e4100d55..a5eed9d3b 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/InsertImages.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/InsertImages.htm @@ -9,7 +9,7 @@

    Insérer des images

    -

    TeamLab Document Editor vous permet d'insérer des images aux formats populaires. Les formats d'image pris en charge sont les suivants : BMP, GIF, JPEG, JPG, PNG.

    +

    Document Editor vous permet d'insérer des images aux formats populaires. Les formats d'image pris en charge sont les suivants : BMP, GIF, JPEG, JPG, PNG.

    Pour insérer une image dans votre document de texte,

    1. placez le curseur à la position où vous voulez insérer une image,
    2. diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/InsertPageNumbers.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/InsertPageNumbers.htm index c8e27d497..9a1a5ff22 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/InsertPageNumbers.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/InsertPageNumbers.htm @@ -1,34 +1,49 @@  - - Insérer les numéros de page - - - - - -
      -

      Insérer les numéros de page

      -

      Pour insérer des numéros de page dans le document,

      -
        -
      1. cliquez sur l'icône de la barre d'outils supérieure Modifier l'en-tête ou le pied de page Modifier l'en-tête ou le pied de page,
      2. -
      3. sélectionnez l'option Insérer le numéro de page,
      4. -
      5. sélectionnez l'une des options suivantes: -
          -
        • Pour mettre un numéro de page à chaque page de votre document, sélectionnez la position de numéro de page sur la page.
        • -
        • Pour insérer un numéro de page à la position actuelle du curseur, sélectionnez l'option A la position actuelle.
        • -
        -
      6. -
      -

      Pour modifier les paramètres du numéro de page,

      -
        -
      1. double-cliquez sur le numéro de page ajouté,
      2. -
      3. modifiez les paramètres actuels sur la barre latérale droite : la position des numéros sur la page ainsi que la position par rapport à la partie supérieure et inférieure de la page. - Vous pouvez également cocher la case Première page différente pour appliquer un numéro différent à la première page ou si vous ne voulez pas ajouter le numéro du tout. La case Pages paires et impaires différentes est utilisée pour insérer des numéros de page différents pour les pages paires et impaires. -

        Paramètres d'en-têtes et de pieds de page

        -
      4. -
      -

      Pour revenir à l'édition du document, double-cliquez sur la zone de travail.

      -
      - + + Insérer les numéros de page + + + + + +
      +

      Insérer les numéros de page

      +

      Pour insérer des numéros de page dans votre document,

      +
        +
      1. cliquez sur l'icône Modifier l'en-tête ou le pied de page Modifier l'en-tête ou le pied de page de la barre d'outils supérieure,
      2. +
      3. sélectionnez l'option Insérer le numéro de page du sous-menu,
      4. +
      5. + sélectionnez l'une des options suivantes: +
          +
        • Pour mettre un numéro de page à chaque page de votre document, sélectionnez la position de numéro de page sur la page.
        • +
        • Pour insérer un numéro de page à la position actuelle du curseur, sélectionnez l'option À la position actuelle.
        • +
        +
      6. +
      +

      Pour insérer le nombre total de pages dans votre document (par ex. si vous souhaitez créer une saisie Page X de Y):

      +
        +
      1. placez le curseur où vous souhaitez insérer le nombre total de pages,
      2. +
      3. cliquez sur l'icône Modifier l'en-tête ou le pied de page icône Modifier l'en-tête ou le pied de page de la barre d'outils supérieure,
      4. +
      5. sélectionnez l'option Insérer le nombre de pages.
      6. +
      +
      +

      Pour modifier les paramètres de la numérotation des pages,

      +
        +
      1. double-cliquez sur le numéro de page ajouté,
      2. +
      3. + modifiez les paramètres actuels en utilisant la barre latérale droite : +

        Barre latérale droite - Paramètres de l'en-tête ou du pied de page

        +
          +
        • Définissez la Position des numéros de page ainsi que la position par rapport à la partie supérieure et inférieure de la page.
        • +
        • Cochez la case Première page différente pour appliquer un numéro différent à la première page ou si vous ne voulez pas du tout ajouter le numéro.
        • +
        • Utilisez la case Pages paires et impaires différentes pour insérer des numéros de page différents pour les pages paires et impaires.
        • +
        • L'option Lier au précédent est disponible si vous avez déjà ajouté des sections dans votre document. Sinon, elle sera grisée. En outre, cette option est non disponible pour toute première section (c'est-à-dire quand un en-tête ou un pied qui appartient à la première section est choisi). Par défaut, cette case est cochée, de sorte que la numérotation unifiée est appliquée à toutes les sections. Si vous sélectionnez une zone d’en-tête ou de pied de page, vous verrez que сette zone est marquée par l'étiquette Same as Previous. Décochez la case Lier au précédent pour utiliser la numérotation des pages différente pour chaque section du document, par exemple, pour commencer la numérotation de chaque section à 1. L'étiquette Same as Previous sera indisponible.
        • +
        +

        Same as previous label

        +
      4. +
      +

      Pour retourner à l'édition du document, double-cliquez sur la zone de travail.

      +
      + \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/LineSpacing.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/LineSpacing.htm index 0ada989d3..3b1f99083 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/LineSpacing.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/LineSpacing.htm @@ -9,22 +9,25 @@

      Régler l'interligne du paragraphe

      -

      En utilisant TeamLab Document Editor, vous pouvez définir la hauteur de la ligne pour les lignes de texte dans le paragraphe ainsi que les marges entre le paragraphe courant et précédent ou suivant.

      -

      Pour faire cela,

      +

      En utilisant Document Editor, vous pouvez définir la hauteur de la ligne pour les lignes de texte dans le paragraphe ainsi que les marges entre le paragraphe courant et précédent ou suivant.

      +

      Pour ce faire,

      1. placez le curseur dans le paragraphe nécessaire, ou sélectionnez plusieurs paragraphes avec la souris ou tout le texte dans le document en utilisant la combinaison de touches Ctrl+A,
      2. utilisez les champs correspondants de la barre latérale droite pour obtenir les résultats nécessaires :
          -
        • Interligne - réglez la hauteur de la ligne pour les lignes de texte dans le paragraphe. Vous pouvez choisir parmi trois options : Au moins (sert à régler l'interligne minimale qui est nécessaire pour adapter la plus grande police ou le graphique à la ligne), Multiple (sert à régler l'interligne exprimée en nombre supérieur à 1), Exactement (sert à définir l'interligne fixe). Spécifiez la valeur nécessaire dans le champ A.
        • -
        • Avant - réglez la taille de l'espace avant le paragraphe.
        • -
        • Après - réglez la taille de l'espace après le paragraphe.
        • -
        • N'ajoutez pas l'intervalle entre les paragraphes du même style - cochez cette case si vous n'avez pas besoin d'espace entre les paragraphes du même style. -

          Barre latérale droite - Paramètres du paragraphe

          -
        • -
        +
      3. Interligne - réglez la hauteur de la ligne pour les lignes de texte dans le paragraphe. Vous pouvez choisir parmi trois options : Au moins (sert à régler l'interligne minimale qui est nécessaire pour adapter la plus grande police ou le graphique à la ligne), Multiple (sert à régler l'interligne exprimée en nombre supérieur à 1), Exactement (sert à définir l'interligne fixe). Spécifiez la valeur nécessaire dans le champ situé à droite.
      4. +
      5. Espacement de paragraphe - définissez l'espace entre les paragraphes. +
          +
        • Avant - réglez la taille de l'espace avant le paragraphe.
        • +
        • Après - réglez la taille de l'espace après le paragraphe.
        • +
        • + N'ajoutez pas l'intervalle entre les paragraphes du même style - cochez cette case si vous n'avez pas besoin d'espace entre les paragraphes du même style. +

          Barre latérale droite - Paramètres du paragraphe

          +
        • +
      -

      Pour modifier rapidement l'interligne du paragraphe, vous pouvez cliquer sur l'icône de la barre d'outils supérieure Interligne du paragraphe Interligne du paragraphe et sélectionner la valeur nécessaire de la liste: 1.0, 1.15, 1.5, 2.0, 2.5, ou 3.0 lignes.

      +

      Pour modifier rapidement l'interligne du paragraphe, vous cliquez sur l'icône Interligne du paragraphe Interligne du paragraphe de la barre d'outils supérieure et sélectionnez la valeur nécessaire dans la liste: 1.0, 1.15, 1.5, 2.0, 2.5, ou 3.0 lignes.

      \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/NonprintingCharacters.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/NonprintingCharacters.htm index 7b315b0d9..ff2a2ebd1 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/NonprintingCharacters.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/NonprintingCharacters.htm @@ -16,7 +16,7 @@
    - + @@ -26,7 +26,7 @@ - + @@ -41,22 +41,32 @@ - + + + + + + + + + + + - - + + - + - +
    FormatsL'extension de nom de fichier pour les documents du traitement textuel créé avec Microsoft Word + ++
    DOCXRich Text Format
    Le format de fichier du document développé par Microsoft pour la multiplateforme d'échange des documents
    + ++
    TXT
    EPUB Electronic Publication
    Le format ebook standardisé, gratuit et ouvert créé par l'International Digital Publishing Forum
    +
    XPS
    Nom de la police Nom de la policeSert à sélectionner l'une des polices disponibles de la liste.Sert à sélectionner l'une des polices disponibles dans la liste.
    Taille de policeTaille de policeSert à sélectionner la taille de police parmi les valeurs disponibles dans la liste déroulante, ou à saisir manuellement dans le champ de la taille de police.Taille de la policeTaille de la policeSert à sélectionner la taille de la police parmi les valeurs disponibles dans la liste déroulante, ou entrer la valeur nécessaire dans le champ de la taille de police.
    Augmenter la taille de la policeAugmenter la taille de la policeSert à modifier la taille de la police en la randant plus grande à un point chaque fois que vous appuyez sur le bouton.
    Réduire la taille de la policeRéduire la taille de la policeSert à modifier la taille de la police en la randant plus petite à un point chaque fois que vous appuyez sur le bouton.
    Couleur de surlignage Couleur de surlignageSert à changer l'arrière-plan utilisé pour des phrases séparées, des expressions, des mots, ou même des caractères. Cliquez sur la flèche à côté de l'icône pour choisir la couleur. Pour supprimer la couleur de surlignage, sélectionnez l'option Pas de remplissage. Couleur de surlignage est différente de Couleur d'arrière-plan car ce dernier est appliqué au paragraphe entier.Sert à marquer les phrases, les mots ou les caractères séparés à l'aide de la bande couleur ajoutée qui imite l'effet du surligneur autour du texte. Vous pouvez sélectionner la partie nécessaire du texte et puis cliquer sur la flèche vers le bas située à côté de l'icône pour sélectionner une couleur dans la palette (cette couleur ne depend pas du Jeu de couleurs sélectionnée et inclut 16 couleurs) - cette couleur sera appliquée à la sélection de texte. Vous pouvez également choisir une couleur de surlignage et puis commencer à sélectionner le texte avec la souris - le pointeur de souris prendra l'apparence suivante Mouse pointer while highlighting et vous pourrez surligner de différentes parties de votre texte de manière séquentielle. To stop highlighting just click the icon once again. To clear the highlight color, choose the No Fill option. Highlight Color is different from the Background Color Paragraph Background Color Icon as the latter is applied to the whole paragraph and completely fills all the paragraph space from the left page margin to the right page margin.
    Couleur de police
    Espaces EspacesIl est inséré lorsque vous appuyez sur la Barre d'espacement sur le clavier. Il crée un espace entre les caractères.Il est inséré lorsque vous appuyez sur la Barre d'espacement sur le clavier. Il crée un espace entre les caractères.
    Tabulations
    Marques de paragraphe Retour chariot Il est inséré lorsque vous appuyez sur la touche Entrée et utilisé pour terminer un paragraphe et ajouter un peu d'espace après.Il est inséré lorsque vous appuyez sur la touche Entrée. Il est utilisé pour terminer un paragraphe et ajouter un peu d'espace après. Il contient des informations sur la mise en forme du paragraphe.
    Sauts de ligne
    Sauts de page Sauts de pageIl est inséré lorsque vous utilisez l'icône de la la barre d'outils supérieure Sauts de page Page Break, sélectionnez l'option Saut de page avant du menu contextuel ou dans la fenêtre Paramètres avancés.Il est inséré lorsque vous utilisez l'icône de la barre d'outils supérieure Insérer un saut de page ou de section Insérer un saut de page ou de section et sélectionnez l'option Insérer un saut de page ou sélectionnez l'option Saut de page avant du menu contextuel ou de la fenêtre des paramètres avancés.
    Sauts de sectionSection breakIl est inséré lorsque vous utilisez l'icône de la barre d'outils supérieure Insérer un saut de page ou de section Insérer un saut de page ou de section et sélectionnez une des options du sous-menu Insérer un saut de section (l’indicateur de saut de section diffère selon l'option choisie: Page suivante, Page continue, Page paire ou Page impaire).
    Sauts de colonneColumn breakIl est inséré lorsque vous utilisez l'icône de la barre d'outils supérieure Insérer un saut de page ou de section Insérer un saut de page ou de section et sélectionnez l'option Insérer un saut de colonne.
    Marques de fin de cellule des tableaux et Fin ligne tableauMarqueurs dans les tableauMarquers des tableaux Fin de cellule et Fin de ligneMarqueurs dans les tableaux Ces marqueurs contiennent des codes de mise en forme de la cellule individuelle et de la ligne respectivement.
    Petit carré noir dans la marge à gauche d'un paragraphePetit carré noir dans la marge gauche d'un paragraphe Carré noir Il indique qu'au moins une des options de paragraphe a été appliquée, par exemple Lignes solidaires, Saut de page avant.
    Symboles d'ancre Symbole d'ancreIls indiquent la position des objets, par exemple des images, des formes automatiques, des graphiques.Ils indiquent la position des objets flottants ( valables pour tout style d'habillage sauf le style En ligne), par exemple images, formes automatiques, graphiques. Vous devez sélectionner un objet pour faire son ancre visible.
    diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/OpenCreateNew.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/OpenCreateNew.htm index 130d915d0..0d9a624ef 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/OpenCreateNew.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/OpenCreateNew.htm @@ -9,17 +9,17 @@

    Créer un nouveau document ou ouvrir un document existant

    -

    Une fois que vous avez terminé de travailler sur un document, vous pouvez procéder immédiatement à un document déjà existant que vous avez récemment édité, créer un nouveau, ou retourner à la liste des documents existants.

    +

    Une fois que vous avez fini de travailler sur un document, vous pouvez immédiatement passer au document existant que vous avez récemment édité, créer un nouveau, ou revenir à la liste des documents existants.

    Pour créer un nouveau document,

    1. cliquez sur l'icône Fichier l'icône Fichier sur la barre latérale gauche,
    2. -
    3. sélectionnez l'option Créer nouveau....
    4. +
    5. sélectionnez l'option Nouveau document.
    -

    Pour ouvrir un document récemment édité à l'aide de TeamLab Document Editor,

    +

    Pour ouvrir un document récemment édité dans Document Editor,

    1. cliquez sur l'icône Fichier l'icône Fichier sur la barre latérale gauche,
    2. sélectionnez l'option Ouvrir récent...,
    3. -
    4. sélectionnez le document nécessaire de la liste des documents récemment édités.
    5. +
    6. sélectionnez le document nécessaire dans la liste des documents récemment édités.

    Pour revenir à la liste des documents existants, cliquez sur le lien Aller aux Documents situé dans le coin supérieur droit ou l'icône Fichier l'icône Fichier sur la barre latérale gauche et sélectionnez l'option Aller aux Documents.

    diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/PageBreaks.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/PageBreaks.htm index 7c3d32bac..6bc6ea8e1 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/PageBreaks.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/PageBreaks.htm @@ -9,22 +9,22 @@

    Insérer des sauts de page

    -

    En utilisant TeamLab Document Editor, vous pouvez ajouter le saut de page et régler les options de pagination.

    -

    Pour insérer un un saut de page à la position actuelle du curseur, cliquez sur l'icône de la barre d'outils supérieure Insérer un saut de page Insérer un saut de page

    -

    Pour insérer un un saut de page avant le paragraphe sélectionné c'est-à-dire pour commencer ce paragraphe du haut de la nouvelle page :

    +

    En utilisant Document Editor, vous pouvez ajouter le saut de page pour commencer une nouvelle page et régler les options de pagination.

    +

    Pour insérer un saut de page à la position actuelle du curseur, cliquez sur l'icône Insérer un saut de page Insérer un saut de page de la barre d'outils supérieure ou cliquez sur la flèche à côté de cette icône et sélectionnez l'option Insérer un saut de page dans le menu

    +

    Pour insérer un saut de page avant le paragraphe sélectionné c'est-à-dire pour commencer ce paragraphe en haut d'une nouvelle page :

    -

    Pour garder les lignes ensemble de sorte que seuleument des paragraphes entiers seront déplacés vers la nouvelle page (c'est-à-dire il n'y aura aucun saut de page entre les lignes dans un seul paragraphe),

    +

    Pour garder les lignes solidaires de sorte que seuleument des paragraphes entiers seront placés sur la nouvelle page (c'est-à-dire il n'y aura aucun saut de page entre les lignes dans un seul paragraphe),

    -

    La fenêtre Paragraphe - Paramètres avancés vous permet de régler deux options de plus :

    +

    La fenêtre Paragraphe - Paramètres avancés vous permet de définir deux autres options de pagination :

    Paramètres du paragraphe avancés - Retraits et emplacement

    diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/ParagraphIndents.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/ParagraphIndents.htm index a8f8c564e..6cfcfe7ac 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/ParagraphIndents.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/ParagraphIndents.htm @@ -9,12 +9,12 @@

    Changer les retraits de paragraphe

    -

    En utilisant TeamLab Document Editor, vous pouvez changer le premier décalage de la ligne de la partie gauche de la page aussi bien que le décalage du paragraphe du côté gauche et du côté droit de la page.

    -

    Pour faire cela,

    +

    En utilisant Document Editor, vous pouvez changer le premier décalage de la ligne sur la partie gauche de la page aussi bien que le décalage du paragraphe du côté gauche et du côté droit de la page.

    +

    Pour ce faire,

    1. placez le curseur dans le paragraphe nécessaire, ou sélectionnez plusieurs paragraphes avec la souris ou tout le texte en utilisant la combinaison de touches Ctrl+A,
    2. cliquez sur le bouton droit de la souris et sélectionnez l'option Paramètres avancés du paragraphe du menu contextuel ou utilisez le lien Afficher les paramètres avancés sur la barre latérale droite,
    3. -
    4. dans la fenêtre ouverte Paragraphe - Paramètres avancés, définissez le retrait nécessaire pour la Première ligne et le décalage du paragraphe du côté gauche et droit de la page,
    5. +
    6. dans la fenêtre ouverte Paragraphe - Paramètres avancés, définissez le retrait nécessaire pour la Première ligne et le décalage du paragraphe du côté gauche et du côté droit de la page,
    7. cliquez sur le bouton OK .

      Paramètres du paragraphe avancés - Retraits et emplacement

    8. diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/SavePrintDownload.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/SavePrintDownload.htm index ac7e00151..1b1da2dd5 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/SavePrintDownload.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/SavePrintDownload.htm @@ -9,27 +9,29 @@
      -

      Enregistrer / télécharger / imprimer votre document

      -

      Par défaut, TeamLab Document Editor enregistre automatiquement votre fichier chaque 10 minutes quand vous travaillez visant à prévenir la perte des données au cas d'une fermeture inespérée de l'éditeur. Si nécessaire, vous pouvez facilement changer la périodicité de l'enregistrement automatique ou même désactiver cette fonction sur la page Paramètres avancés.

      +

      Enregistrer / télécharger / imprimer votre document

      +

      Par défaut, Document Editor enregistre automatiquement votre fichier chaque 10 minutes quand vous travaillez visant à prévenir la perte des données au cas d'une fermeture inespérée de l'éditeur. Si nécessaire, vous pouvez facilement changer la périodicité de l'enregistrement automatique ou même désactiver cette fonction sur la page Paramètres avancés.

      Pour enregistrer votre document actuel à la main,

      • cliquez sur l'icône Enregistrer l'icône Enregistrer sur la barre d'outils supérieure, ou
      • utilisez la combinaison des touches Ctrl+S, ou
      • cliquez sur l'icône Fichier l'icône Fichier sur la barre latérale gauche et sélectionnez l'option Enregistrer .
      -

      Pour télécharger le document résultant sur le disque dur de l'ordinateur,

      -
        -
      1. cliquez sur l'icône Fichier l'icône Fichier sur la barre latérale gauche,
      2. -
      3. sélectionnez l'option Télécharger comme ,
      4. -
      5. choisissez un des formats disponibles selon vos besoins: PDF, TXT, DOCX, DOC, ODT, RTF, HTML, EPUB.
      6. -
      -

      Pour imprimer le document actif,

      -
        -
      • cliquez sur l'icône Imprimer l'icône Imprimer sur la barre d'outils supérieure, ou
      • -
      • utilisez la combinaison des touches Ctrl+P , ou
      • -
      • cliquez sur l'icône Fichier l'icône Fichier sur la barre latérale gauche et sélectionnez l'option Imprimer .
      • -
      -

      Après cela, un fichier PDF sera généré sur la base du document édité. Vous pouvez l'ouvrir et l'imprimer, ou l'enregistrer sur votre disque dur ou sur un support amovible pour l'imprimer plus tard.

      -
      +
      +

      Pour télécharger le document résultant sur le disque dur de l'ordinateur,

      +
        +
      1. cliquez sur l'icône Fichier l'icône Fichier sur la barre latérale gauche,
      2. +
      3. sélectionnez l'option Télécharger comme ,
      4. +
      5. choisissez un des formats disponibles selon vos besoins: PDF, TXT, DOCX, DOC, ODT, RTF, HTML, EPUB.
      6. +
      +
      +

      Pour imprimer le document actif,

      +
        +
      • cliquez sur l'icône Imprimer l'icône Imprimer sur la barre d'outils supérieure, ou
      • +
      • utilisez la combinaison des touches Ctrl+P , ou
      • +
      • cliquez sur l'icône Fichier l'icône Fichier sur la barre latérale gauche et sélectionnez l'option Imprimer .
      • +
      +

      Après cela, un fichier PDF sera généré sur la base du document édité. Vous pouvez l'ouvrir et l'imprimer, ou l'enregistrer sur votre disque dur ou sur un support amovible pour l'imprimer plus tard.

      +
    \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/SectionBreaks.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/SectionBreaks.htm new file mode 100644 index 000000000..0db87c73e --- /dev/null +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/SectionBreaks.htm @@ -0,0 +1,33 @@ + + + + Insérer les sauts de section + + + + + + +
    +

    Insérer les sauts de section

    +

    Les sauts de section vous permettent d'appliquer des mises en page et mises en formes différentes pour de certaines parties de votre document. Par exemple, vous pouvez utiliser des en-têtes et pieds de page, des numérotations des pages, des marges, la taille, l'orientation, ou le numéro de colonne individuels pour chaque section séparée.

    +

    Remarque : un saut de section inséré définit la mise en page de la partie précédente du document.

    +

    Pour insérer un saut de section à la position actuelle du curseur :

    +
      +
    1. cliquez sur l'icône Insérer un saut de page ou de section Insérer un saut de page ou de section de la barre d'outils supérieure
    2. +
    3. sélectionnez l'option Insérer un saut de section
    4. +
    5. sélectionnez le type du saut de section nécessaire: +
        +
      • Page suivante - pour commencer une nouvelle section sur la page suivante
      • +
      • Page continue - pour commencer une nouvelle section sur la page actuelle
      • +
      • Page paire - pour commencer une nouvelle section sur la page suivante paire
      • +
      • Page impaire - pour commencer une nouvelle section sur la page suivante impaire
      • +
      +
    6. +
    +

    Des sauts d'une section ajoutés sont indiqués dans votre document par un double trait pointillé: Section break

    +

    Si vous ne voyez pas de sauts de section insérés, cliquez sur l'icône Icône de caractères non imprimables de la barre d'outils supérieure pour les afficher.

    +

    Pour supprimer un saut de section, sélectionnez-le avec le souris et appuyez sur la touche Supprimer. Lorsque vous supprimez un saut de section, la mise en forme de cette section sera également supprimée, car un saut de section définit la mise en forme de la section précédente. La partie du document qui précède le saut de section supprimé acquiert la mise en forme de la partie qui la suive.

    +
    + + \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/SetPageParameters.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/SetPageParameters.htm index 762cc1b9c..144a7da66 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/SetPageParameters.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/SetPageParameters.htm @@ -1,35 +1,56 @@  - - Régler les paramètres de page - - - - - -
    -

    Régler les paramètres de page

    -

    Pour régler l'orientation de page et sa taille, utilisez les icônes correspondantes de la barre d'outils supérieure :

    - -
    - + + Régler les paramètres de page + + + + + + +
    +

    Régler les paramètres de page

    +

    Pour modifier la mise en page, c-à-d définir l'orientation et la taille de la page, ajuster les marges et insérer des colonnes, utilisez les icônes correspondantes de la barre d'outils supérieure.

    +

    Remarque: tous ces paramètres sont appliqués au document entier. Si vous voulez définir de différentes marges de page, l'orientation, la taille, ou le numéro de colonne pour les parties différentes de votre document, consultez cette page.

    +

    Orientation de page

    +

    Changez l'orientation de page actuelle en cliquant sur l'icône Orientation de page icône Orientation de page. Le type d'orientation par défaut est Portrait qui peut être commuté sur Album.

    +

    Taille de la page

    +

    Changez le format A4 par défaut en cliquant sur l'icône Taille de la page icône Taille de la page et sélectionnez la taille nécessaire dans la liste. Les formats offerts sont les suivants :

    + +

    Vous pouvez définir une taille de la page particulière en utilisant l'option Taille personnalisée dans la liste. Dans la fenêtre Taille de la page vous pouvez définir les valeurs nécessaires Largeur et Hauteur. Entrez vos nouvelles valeurs dans les champs d'entrées ou ajustez les valeurs existantes en utilisant les boutons de direction. Lorsque tout est prêt, cliquez sur OK pour appliquer les changements.

    +

    Custom Page Size

    +

    Marges de la page

    +

    Modifiez les marges par défaut, c-à-d l’espace entre les bords de la page et le texte du paragraphe, en cliquant sur l'icône Page Margins icône Marges de page et sélectionnez un des paramètres prédéfinis : Normal, US Normal, Étroit, Modérer, Large. Vous pouvez aussi utiliser l'option Marges personnalisées pour définir les valeurs nécessaires dans la fenêtre Marges qui s'ouvre. Entrez les valeurs des marges Haut, Bas, Gauche et Droite de la page dans les champs d'entrées ou ajustez les valeurs existantes en utilisant les boutons de direction. Lorsque tout est prêt, cliquez sur OK. Les marges personnalisées seront appliquées au document actuel et l'option Dernière mesure avec les paramètres spécifiés apparaît dans la liste des Marges de la page icône Marges de page pour que vous puissiez les appliquer à d'autres documents.

    +

    Marges personnalisées

    +

    Vous pouvez également modifier les marges manuellement en faisant glisser la bordure entre les zones grises et blanches sur les règles (les zones grises des règles indiquent les marges de page):

    +

    Ajustement des marges

    +

    Colonnes

    +

    Pour appliquez une disposition multicolonne, cliquez sur l'icône Insérer des colonnes icône Insérer des colonnes et sélectionnez le type de la colonne nécessaire dans la liste déroulante. Les options suivantes sont disponibles :

    + +

    Pour spécifier exactement la position d'une nouvelle colonne, placez le curseur avant le texte à déplacer dans une nouvelle colonnen, cliquez sur l'icône Insérer un saut de page ou de section Insérer un saut de page ou de section de la barre d'outils supérieure et sélectionnez l'option Insérer un saut de colonne. Le texte sera déplacé vers la colonne suivante.

    +

    Les sauts de colonne ajoutés sont indiqués dans votre document par une ligne pointillée: Saut de colonne. Si les sauts de colonnes insérés ne sont pas visibles, cliquez sur l'icône icône Caractères non imprimables icon de la barre d'outils supérieure pour les afficher. Pour supprimer un saut de colonne,sélectionnez-le avec le souris et appuyez sur une touche Supprimer.

    +

    Pour modifier manuellement la largeur et l'espacement entre les colonnes, vous pouvez utiliser la règle horizontale.

    +

    Espacemment entre les colonnes

    +

    Pour annuler les colonnes et revenir à la disposition en une seule colonne, cliquez sur l'icône Insérer des colonnes icône Insérer des colonnes de la barre d'outils supérieure et sélectionnez l'option Une icône Une colonne dans la liste.

    +
    + \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/fr/UsageInstructions/SetTabStops.htm b/apps/documenteditor/main/resources/help/fr/UsageInstructions/SetTabStops.htm index 4321139c8..33c91ac86 100644 --- a/apps/documenteditor/main/resources/help/fr/UsageInstructions/SetTabStops.htm +++ b/apps/documenteditor/main/resources/help/fr/UsageInstructions/SetTabStops.htm @@ -9,10 +9,10 @@

    Définir des taquets de tabulation

    -

    TeamLab Document Editor vous permet de changer des taquets de tabulation c'est-à-dire l'emplacement où le curseur s'arrête quand vous appuyez sur la touche Tab du clavier.

    +

    Document Editor vous permet de changer des taquets de tabulation c'est-à-dire l'emplacement où le curseur s'arrête quand vous appuyez sur la touche Tab du clavier.

    Pour définir les taquets de tabulation vous pouvez utiliser la règle horizontale :

      -
    1. Sélectionnez le type du taquet de tabulation en cliquant sur le bouton Taquet de tabulation de droite dans le coin supérieur gauche de la zone de travail. Trois types sont disponibles : +
    2. Sélectionnez le type du taquet de tabulation en cliquant sur le bouton Taquet de tabulation de droite dans le coin supérieur gauche de la zone de travail. Trois types de taquets de tabulationsont disponibles :
      • De gauche Taquet de tabulation de gauche sert à aligner le texte sur le côté gauche du taquet de tabulation; le texte se déplace à droite du taquet de tabulation quand vous saisissez le texte. Le taquet de tabulation sera indiqué sur la règle horizontale par le marqueur Marqueur du taquet de tabulation de gauche.
      • Du centre Taquet de tabulation du centre sert à centrer le texte à l'emplacement du taquet de tabulation. Le taquet de tabulation sera indiqué sur la règle horizontale par le marqueur Marqueur du taquet de tabulation du centre.
      • @@ -24,7 +24,7 @@

    -

    Vous pouvez également utiliser la fenêtre des paramètres avancés du paragraphe pour régler les taquets de tabulation. Cliquez droit, sélectionnez l'option Paramètres avancés du paragraphe du menu ou utilisez le lien Afficher les paramètres avancés sur la barre latérale droite, et passez à l'onglet Tabulation de la fenêtre Paragraphe - Paramètres avancés.

    +

    Vous pouvez également utiliser la fenêtre des paramètres avancés du paragraphe pour régler les taquets de tabulation. Cliquez avec le bouton droit de la souris, sélectionnez l'option Paramètres avancés du paragraphe du menu ou utilisez le lien Afficher les paramètres avancés sur la barre latérale droite, et passez à l'onglet Tabulation de la fenêtre Paragraphe - Paramètres avancés.

    Paramètres du paragraphe - onglet Tabulation

    Vous y pouvez définir les paramètres suivants :

    +
    +

    Совместное редактирование

    +

    В редакторе документов можно выбрать один из двух доступных режимов совместного редактирования. Быстрый используется по умолчанию, в нем изменения, вносимые другими пользователями, отображаются в реальном времени. Строгий режим позволяет скрывать изменения, внесенные другими пользователями, до тех пор, пока вы не нажмете значок Сохранить Значок Сохранить, чтобы сохранить ваши изменения и принять изменения, внесенные другими. Режим можно выбрать в Дополнительных настройках.

    +

    Когда документ редактируют одновременно несколько пользователей в Строгом режиме, редактируемые фрагменты текста помечаются пунктирными линиями разных цветов. При наведении курсора мыши на один из редактируемых фрагментов отображается имя того пользователя, который в данный момент его редактирует. В Быстром режиме действия и имена участников совместного редактирования отображаются непосредственно в процессе редактирования текста.

    +

    + Количество пользователей, которые в данный момент работают над текущим документом, отображается в левом нижнем углу в строке состояния - Значок Количество пользователей. + Чтобы увидеть, кто именно редактирует файл в настоящий момент, можно открыть панель Чата с полным списком пользователей. +

    +

    Если файл не просматривают или не редактируют другие пользователи, значок в строке состояния будет выглядеть следующим образом: Значок Управление правами доступа к документу, с его помощью можно непосредственно из документа управлять пользователями, имеющими доступ к файлу: приглашать новых пользователей, предоставляя им полный доступ или доступ только для чтения, или запрещать доступ к файлу для некоторых пользователей. Нажмите на этот значок для управления доступом к файлу; это можно сделать и в отсутствие других пользователей, которые просматривают или совместно редактируют документ в настоящий момент, и при наличии других пользователей, когда значок выглядит так: Значок Количество пользователей.

    +

    Как только один из пользователей сохранит свои изменения, нажав на значок Значок Сохранить, все остальные увидят в строке состояния примечание, которое сообщает о наличии обновлений. Чтобы сохранить внесенные вами изменения и сделать их доступными для других пользователей, а также получить обновления, сохраненные другими пользователями, нажмите на значок Значок Сохранить и получить обновления в левом верхнем углу верхней панели инструментов. Обновления будут подсвечены, чтобы Вы могли проверить, что конкретно изменилось.

    +

    Можно указать, какие изменения требуется подсвечивать во время совместного редактирования: для этого нажмите на значок Значок Файл на левой боковой панели, выберите опцию Дополнительные параметры..., а затем укажите, отображать ли все или последние изменения, внесенные при совместной работе. При выборе опции Все будут подсвечиваться все изменения, внесенные за время текущей сессии. При выборе опции Последние будут подсвечиваться только те изменения, которые были внесены с момента, когда Вы последний раз нажимали на значок Значок Сохранить и получить изменения. При выборе опции Никакие изменения, внесенные во время текущей сессии, подсвечиваться не будут.

    +

    Чат*

    +

    Этот инструмент можно использовать для оперативного согласования процесса совместного редактирования, например, для того, чтобы договориться с другими участниками, кто и что должен делать, какой абзац вы собираетесь сейчас отредактировать и т.д.

    +

    Сообщения в чате хранятся только в течение одной сессии. Для обсуждения содержания документа лучше использовать комментарии, которые хранятся до тех пор, пока вы не решите их удалить.

    +

    Чтобы войти в чат и оставить сообщение для других пользователей:

    +
      +
    1. нажмите на значок Значок Чат на левой боковой панели,
    2. +
    3. введите текст в соответствующем поле ниже,
    4. +
    5. нажмите кнопку Отправить.
    6. +
    +

    Все сообщения, оставленные пользователями, будут отображаться на панели слева. Если есть новые сообщения, которые Вы еще не прочитали, значок чата будет выглядеть так - Значок Чат.

    +

    Чтобы закрыть панель с сообщениями чата, нажмите на значок Значок Чат еще раз.

    +
    +

    Комментарии*

    +

    Чтобы оставить комментарий:

    +
      +
    1. выделите фрагмент текста, в котором, по Вашему мнению, содержится какая-то ошибка или проблема,
    2. +
    3. + используйте значок Значок Комментарии на левой боковой панели, чтобы открыть панель Комментарии, и нажмите на ссылку Добавить комментарий к документу или
      + щелкните правой кнопкой мыши по выделенному фрагменту текста и выберите в меню команду Добавить комментарий, +
    4. +
    5. введите нужный текст,
    6. +
    7. нажмите кнопку Добавить.
    8. +
    +

    Комментарий появится на панели слева. Любой другой пользователь может ответить на добавленный комментарий, чтобы дать ответ на вопросы или отчитаться о проделанной работе. Для этого надо нажать на ссылку Добавить ответ, расположенную под комментарием.

    +

    Фрагмент текста, который Вы прокомментировали, будет подсвечен в документе. Для просмотра комментария щелкните по этому фрагменту. Если требуется отключить эту функцию, нажмите на значок Значок Файл, выберите опцию Дополнительные параметры... и снимите флажок Включить опцию комментирования в реальном времени. В этом случае прокомментированные фрагменты будут подсвечиваться, только когда Вы нажмете на значок Значок Комментарии.

    +

    Вы можете управлять добавленными комментариями следующим образом:

    + +

    Новые комментарии, добавленные другими пользователями, станут видимыми только после того, как Вы нажмете на значок Значок Сохранить и получить обновления в левом верхнем углу верхней панели инструментов.

    +

    Чтобы закрыть панель с комментариями, нажмите на значок Значок Комментарии еще раз.

    +

    *доступно только для платных версий

    +
    \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm b/apps/documenteditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm index d01eb7c35..b3d758b4e 100644 --- a/apps/documenteditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm +++ b/apps/documenteditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm @@ -25,17 +25,17 @@ Открыть панель Поиск, чтобы начать поиск символа/слова/фразы в редактируемом документе. - Открыть панель 'Комментарии'* + Открыть панель 'Комментарии'* Ctrl+Shift+H Открыть панель Комментарии, чтобы добавить свой комментарий или ответить на комментарии других пользователей. - Открыть поле комментария* + Открыть поле комментария* Alt+H Открыть поле ввода данных, в котором можно добавить текст комментария. - - Открыть панель 'Чат'* + + Открыть панель 'Чат'* Alt+Q Открыть панель Чат и отправить сообщение. @@ -345,7 +345,7 @@ Удерживайте клавишу Ctrl и используйте стрелки на клавиатуре, чтобы перемещать выбранный объект на три пикселя за раз. -

    * - доступно только для платных версий

    +

    * - доступно только для платных версий

    \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/SavePrintDownload.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/SavePrintDownload.htm index ad0b72220..5f58149a5 100644 --- a/apps/documenteditor/main/resources/help/ru/UsageInstructions/SavePrintDownload.htm +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/SavePrintDownload.htm @@ -9,7 +9,7 @@
    -

    Сохранение / загрузка / печать документа

    +

    Сохранение / загрузка / печать документа

    По умолчанию онлайн-редактор документов автоматически сохраняет файл каждые 2 секунды, когда вы работаете над ним, чтобы не допустить потери данных в случае непредвиденного закрытия программы. Если вы совместно редактируете файл в Быстром режиме, таймер запрашивает наличие изменений 25 раз в секунду и сохраняет их, если они были внесены. При совместном редактировании файла в Строгом режиме изменения автоматически сохраняются каждые 10 минут. При необходимости можно легко выбрать предпочтительный режим совместного редактирования или отключить функцию автоматического сохранения на странице Дополнительные параметры.

    Чтобы сохранить текущий документ вручную,

    -

    Чтобы скачать готовый документ и сохранить его на жестком диске компьютера,

    -
      -
    1. нажмите значок Файл Значок Файл на левой боковой панели,
    2. -
    3. выберите опцию Скачать как...,
    4. -
    5. выберите один из доступных форматов в зависимости от того, что вам нужно: PDF, TXT, DOCX, ODT, HTML.
    6. -
    -

    Чтобы распечатать текущий документ,

    - -

    После этого на основе данного документа будет сгенерирован файл PDF. Вы можете открыть и распечатать его, или сохранить его на жестком диске компьютера или съемном носителе чтобы распечатать позже.

    -
    +
    +

    Чтобы скачать готовый документ и сохранить его на жестком диске компьютера,

    +
      +
    1. нажмите значок Файл Значок Файл на левой боковой панели,
    2. +
    3. выберите опцию Скачать как...,
    4. +
    5. выберите один из доступных форматов в зависимости от того, что вам нужно: PDF, TXT, DOCX, ODT, HTML.
    6. +
    +
    +

    Чтобы распечатать текущий документ,

    + +

    После этого на основе данного документа будет сгенерирован файл PDF. Вы можете открыть и распечатать его, или сохранить его на жестком диске компьютера или съемном носителе чтобы распечатать позже.

    + \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/ViewDocInfo.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/ViewDocInfo.htm index c35e860c5..17cba6f2c 100644 --- a/apps/documenteditor/main/resources/help/ru/UsageInstructions/ViewDocInfo.htm +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/ViewDocInfo.htm @@ -12,14 +12,15 @@

    Чтобы получить доступ к подробным сведениям о редактируемом документе, нажмите значок Файл Значок Файл на левой боковой панели и выберите опцию Сведения о документе....

    Общие сведения

    Сведения о документе включают название документа, автора, размещение, дату создания, а также статистику: количество страниц, абзацев, слов, символов, символов с пробелами.

    -

    Сведения о правах доступа

    -

    Примечание: эта опция недоступна для пользователей с правами доступа Только чтение.

    -

    Чтобы узнать, у кого есть права на просмотр и редактирование этого документа, выберите опцию Права доступа... на левой боковой панели.

    -

    Вы можете также изменить выбранные в настоящий момент права доступа, нажав на кнопку Изменить права доступа в разделе Люди, имеющие права.

    -

    Журнал версий

    -

    Примечание: эта опция недоступна для бесплатных аккаунтов, а также для пользователей с правами доступа Только чтение.

    -

    Чтобы просмотреть все внесенные в документ изменения, выберите опцию Журнал версий на левой боковой панели. Вы увидите список версий (существенных изменений) и ревизий (незначительных изменений) этого документа с указанием автора и даты и времени создания каждой версии/ревизии. Для версий документа также указан номер версии (например, вер. 2). Чтобы точно знать, какие изменения были внесены в каждой конкретной версии/ревизии, можно просмотреть нужную, нажав на нее на левой боковой панели. Изменения, внесенные автором версии/ревизии, помечены цветом, который показан рядом с именем автора на левой боковой панели. Чтобы вернуться к текущей версии документа, нажмите на ссылку Вернуться к документу над списком версий.

    -

    Чтобы закрыть панель Файл и вернуться к редактированию документа, выберите опцию Вернуться к документу.

    - +
    +

    Сведения о правах доступа

    +

    Примечание: эта опция недоступна для пользователей с правами доступа Только чтение.

    +

    Чтобы узнать, у кого есть права на просмотр и редактирование этого документа, выберите опцию Права доступа... на левой боковой панели.

    +

    Вы можете также изменить выбранные в настоящий момент права доступа, нажав на кнопку Изменить права доступа в разделе Люди, имеющие права.

    +

    Журнал версий

    +

    Примечание: эта опция недоступна для бесплатных аккаунтов, а также для пользователей с правами доступа Только чтение.

    +

    Чтобы просмотреть все внесенные в документ изменения, выберите опцию Журнал версий на левой боковой панели. Вы увидите список версий (существенных изменений) и ревизий (незначительных изменений) этого документа с указанием автора и даты и времени создания каждой версии/ревизии. Для версий документа также указан номер версии (например, вер. 2). Чтобы точно знать, какие изменения были внесены в каждой конкретной версии/ревизии, можно просмотреть нужную, нажав на нее на левой боковой панели. Изменения, внесенные автором версии/ревизии, помечены цветом, который показан рядом с именем автора на левой боковой панели. Чтобы вернуться к текущей версии документа, нажмите на ссылку Вернуться к документу над списком версий.

    +

    Чтобы закрыть панель Файл и вернуться к редактированию документа, выберите опцию Вернуться к документу.

    +
    \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/ru/images/formattingpresets.png b/apps/documenteditor/main/resources/help/ru/images/formattingpresets.png index be198c35a..60c1ac73a 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/formattingpresets.png and b/apps/documenteditor/main/resources/help/ru/images/formattingpresets.png differ diff --git a/apps/documenteditor/main/resources/img/toolbar-menu.png b/apps/documenteditor/main/resources/img/toolbar-menu.png index 71c02c698..1fbee3e23 100644 Binary files a/apps/documenteditor/main/resources/img/toolbar-menu.png and b/apps/documenteditor/main/resources/img/toolbar-menu.png differ diff --git a/apps/documenteditor/main/resources/img/toolbar-menu@2x.png b/apps/documenteditor/main/resources/img/toolbar-menu@2x.png index 8b1a2def6..01244430f 100644 Binary files a/apps/documenteditor/main/resources/img/toolbar-menu@2x.png and b/apps/documenteditor/main/resources/img/toolbar-menu@2x.png differ diff --git a/apps/documenteditor/main/resources/less/statusbar.less b/apps/documenteditor/main/resources/less/statusbar.less index 5ba4ba559..4c23b4571 100644 --- a/apps/documenteditor/main/resources/less/statusbar.less +++ b/apps/documenteditor/main/resources/less/statusbar.less @@ -273,6 +273,7 @@ &.en-GB {background-position: -32px -1608px;} &.en-AU {background-position: 0 -1620px;} &.az-Latn-AZ {background-position: -16px -1620px;} + &.id, &.id-ID {background-position: -32px -1620px;} &.bg, &.bg-BG {background-position: 0 -1720px;} &.ca-ES-valencia {background-position: -16px -1720px;} diff --git a/apps/documenteditor/mobile/app-dev.js b/apps/documenteditor/mobile/app-dev.js index 8f9d3a3be..bc204844a 100644 --- a/apps/documenteditor/mobile/app-dev.js +++ b/apps/documenteditor/mobile/app-dev.js @@ -51,9 +51,6 @@ require.config({ text : '../vendor/requirejs-text/text', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jszip : '../vendor/jszip/jszip.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', api : 'api/documents/api', core : 'common/main/lib/core/application', extendes : 'common/mobile/utils/extendes', @@ -118,9 +115,6 @@ require([ 'analytics', 'gateway', 'locale', - 'jszip', - 'jsziputils', - 'jsrsasign', 'sockjs' ], function (Backbone, Framework7, Core) { Backbone.history.start(); diff --git a/apps/documenteditor/mobile/app.js b/apps/documenteditor/mobile/app.js index ebf92413d..9f6b018a8 100644 --- a/apps/documenteditor/mobile/app.js +++ b/apps/documenteditor/mobile/app.js @@ -51,9 +51,6 @@ require.config({ text : '../vendor/requirejs-text/text', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jszip : '../vendor/jszip/jszip.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', allfonts : '../../sdkjs/common/AllFonts', sdk : '../../sdkjs/word/sdk-all-min', api : 'api/documents/api', @@ -103,10 +100,7 @@ require.config({ 'underscore', 'allfonts', 'xregexp', - 'sockjs', - 'jszip', - 'jsziputils', - 'jsrsasign' + 'sockjs' ] }, gateway: { diff --git a/apps/documenteditor/mobile/app/controller/Main.js b/apps/documenteditor/mobile/app/controller/Main.js index ecb792aa4..e6be4a38f 100644 --- a/apps/documenteditor/mobile/app/controller/Main.js +++ b/apps/documenteditor/mobile/app/controller/Main.js @@ -588,7 +588,7 @@ define([ me.permissions.review = (me.permissions.review === undefined) ? (me.permissions.edit !== false) : me.permissions.review; me.appOptions.canAnalytics = params.asc_getIsAnalyticsEnable(); - me.appOptions.canLicense = (licType === Asc.c_oLicenseResult.Success); + me.appOptions.canLicense = (licType === Asc.c_oLicenseResult.Success || licType === Asc.c_oLicenseResult.SuccessLimit); me.appOptions.isLightVersion = params.asc_getIsLight(); /** coauthoring begin **/ me.appOptions.canCoAuthoring = !me.appOptions.isLightVersion; @@ -617,7 +617,7 @@ define([ me._state.licenseWarning = (licType===Asc.c_oLicenseResult.Connections) && me.appOptions.canEdit && me.editorConfig.mode !== 'view'; - me.appOptions.canBranding = params.asc_getCanBranding() && (typeof me.editorConfig.customization == 'object'); + me.appOptions.canBranding = (licType === Asc.c_oLicenseResult.Success) && (typeof me.editorConfig.customization == 'object'); me.applyModeCommonElements(); me.applyModeEditorElements(); diff --git a/apps/documenteditor/mobile/app/view/Settings.js b/apps/documenteditor/mobile/app/view/Settings.js index 3abe57f4d..34d0ef01a 100644 --- a/apps/documenteditor/mobile/app/view/Settings.js +++ b/apps/documenteditor/mobile/app/view/Settings.js @@ -175,7 +175,7 @@ define([ '', '', '' - ].join(''), { + ].join(''))({ android: Framework7.prototype.device.android, item: size, index: index, diff --git a/apps/documenteditor/mobile/app/view/edit/EditChart.js b/apps/documenteditor/mobile/app/view/edit/EditChart.js index 9c6e80151..0eba29262 100644 --- a/apps/documenteditor/mobile/app/view/edit/EditChart.js +++ b/apps/documenteditor/mobile/app/view/edit/EditChart.js @@ -203,7 +203,7 @@ define([ '<% }); %>', '', '<% }); %>' - ].join(''), { + ].join(''))({ styles: styles }); diff --git a/apps/documenteditor/mobile/app/view/edit/EditTable.js b/apps/documenteditor/mobile/app/view/edit/EditTable.js index 2f546509b..172c53ec3 100644 --- a/apps/documenteditor/mobile/app/view/edit/EditTable.js +++ b/apps/documenteditor/mobile/app/view/edit/EditTable.js @@ -138,7 +138,7 @@ define([ '', '<% }); %>', '' - ].join(''), { + ].join(''))({ styles: styles }); diff --git a/apps/documenteditor/mobile/locale/de.json b/apps/documenteditor/mobile/locale/de.json index 07b1c6311..cbc8c7e85 100644 --- a/apps/documenteditor/mobile/locale/de.json +++ b/apps/documenteditor/mobile/locale/de.json @@ -19,10 +19,10 @@ "DE.Controllers.DocumentHolder.menuCut": "Ausschneiden", "DE.Controllers.DocumentHolder.menuDelete": "Löschen", "DE.Controllers.DocumentHolder.menuEdit": "Bearbeiten", + "DE.Controllers.DocumentHolder.menuMore": "Mehr", "DE.Controllers.DocumentHolder.menuOpenLink": "Link öffnen", - "DE.Controllers.DocumentHolder.menuMore": "More", - "DE.Controllers.DocumentHolder.sheetCancel": "Abbrechen", "DE.Controllers.DocumentHolder.menuPaste": "Einfügen", + "DE.Controllers.DocumentHolder.sheetCancel": "Abbrechen", "DE.Controllers.DocumentHolder.textGuest": "Gast", "DE.Controllers.EditContainer.textChart": "Diagramm", "DE.Controllers.EditContainer.textHyperlink": "Hyperlink", @@ -52,6 +52,7 @@ "DE.Controllers.Main.downloadMergeTitle": "Wird heruntergeladen\t", "DE.Controllers.Main.downloadTextText": "Dokument wird heruntergeladen...", "DE.Controllers.Main.downloadTitleText": "Herunterladen des Dokuments", + "DE.Controllers.Main.errorBadImageUrl": "URL des Bildes ist falsch", "DE.Controllers.Main.errorCoAuthoringDisconnect": "Verbindung zum Server ist verloren gegangen. Sie können nicht mehr editieren.", "DE.Controllers.Main.errorConnectToServer": "Das Dokument konnte nicht gespeichert werden. Bitte überprüfen Sie die Verbindungseinstellungen, oder richten Sie an Ihren Administrator.
    Wann Sie auf den Button \"OK\" klicken, werden Sie aufgefordert, das Dokument herunterzuladen.

    Mehr Information zur Verbindung des Dokument Servers finden Sie hier", "DE.Controllers.Main.errorDatabaseConnection": "Externer Fehler.
    Datenbank-Verbindungsfehler. Wenden Sie sich an den Support.", @@ -63,6 +64,7 @@ "DE.Controllers.Main.errorMailMergeLoadFile": "Fehler beim Laden\t", "DE.Controllers.Main.errorMailMergeSaveFile": "Verbinden ist fehlgeschlagen.", "DE.Controllers.Main.errorProcessSaveResult": "Fehler beim Speichern von Daten.", + "DE.Controllers.Main.errorServerVersion": "Editor-Version wurde aktualisiert. Die Seite wird neu geladen, um die Änderungen zu übernehmen.", "DE.Controllers.Main.errorStockChart": "Falsche Reihenfolge der Zeilen. Um ein Kursdiagramm zu erstellen, ordnen Sie die Daten auf dem Blatt folgendermaßen an:
    Eröffnungspreis, Höchstpreis, Tiefstpreis, Schlusskurs.", "DE.Controllers.Main.errorUpdateVersion": "Die Dateiversion wurde geändert. Die Seite wird neu geladen.", "DE.Controllers.Main.errorUserDrop": "Kein Zugriff auf diese Datei ist möglich.", @@ -112,6 +114,7 @@ "DE.Controllers.Main.textTryUndoRedo": "Undo/Redo Optionen sind für den halbformalen Zusammenbearbeitungsmodus deaktiviert.", "DE.Controllers.Main.textUsername": "Benutzername", "DE.Controllers.Main.titleLicenseExp": "Lizenz ist abgelaufen", + "DE.Controllers.Main.titleServerVersion": "Editor wurde aktualisiert", "DE.Controllers.Main.titleUpdateVersion": "Version wurde geändert", "DE.Controllers.Main.txtArt": "Hier den Text eingeben", "DE.Controllers.Main.txtDiagramTitle": "Diagrammtitel", diff --git a/apps/documenteditor/mobile/locale/en.json b/apps/documenteditor/mobile/locale/en.json index 0578df115..22dc3ea1f 100644 --- a/apps/documenteditor/mobile/locale/en.json +++ b/apps/documenteditor/mobile/locale/en.json @@ -19,10 +19,10 @@ "DE.Controllers.DocumentHolder.menuCut": "Cut", "DE.Controllers.DocumentHolder.menuDelete": "Delete", "DE.Controllers.DocumentHolder.menuEdit": "Edit", - "DE.Controllers.DocumentHolder.menuOpenLink": "Open Link", "DE.Controllers.DocumentHolder.menuMore": "More", - "DE.Controllers.DocumentHolder.sheetCancel": "Cancel", + "DE.Controllers.DocumentHolder.menuOpenLink": "Open Link", "DE.Controllers.DocumentHolder.menuPaste": "Paste", + "DE.Controllers.DocumentHolder.sheetCancel": "Cancel", "DE.Controllers.DocumentHolder.textGuest": "Guest", "DE.Controllers.EditContainer.textChart": "Chart", "DE.Controllers.EditContainer.textHyperlink": "Hyperlink", @@ -52,6 +52,7 @@ "DE.Controllers.Main.downloadMergeTitle": "Downloading", "DE.Controllers.Main.downloadTextText": "Downloading document...", "DE.Controllers.Main.downloadTitleText": "Downloading Document", + "DE.Controllers.Main.errorBadImageUrl": "Image URL is incorrect", "DE.Controllers.Main.errorCoAuthoringDisconnect": "Server connection lost. You can't edit anymore.", "DE.Controllers.Main.errorConnectToServer": " The document could not be saved. Please check connection settings or contact your administrator.
    When you click the 'OK' button, you will be prompted to download the document.

    Find more information about connecting Document Server here", "DE.Controllers.Main.errorDatabaseConnection": "External error.
    Database connection error. Please, contact support.", @@ -63,13 +64,13 @@ "DE.Controllers.Main.errorMailMergeLoadFile": "Loading failed", "DE.Controllers.Main.errorMailMergeSaveFile": "Merge failed.", "DE.Controllers.Main.errorProcessSaveResult": "Saving is failed.", + "DE.Controllers.Main.errorServerVersion": "The editor version has been updated. The page will be reloaded to apply the changes.", "DE.Controllers.Main.errorStockChart": "Incorrect row order. To build a stock chart place the data on the sheet in the following order:
    opening price, max price, min price, closing price.", "DE.Controllers.Main.errorUpdateVersion": "The file version has been changed. The page will be reloaded.", "DE.Controllers.Main.errorUserDrop": "The file cannot be accessed right now.", "DE.Controllers.Main.errorUsersExceed": "The number of users was exceeded", "DE.Controllers.Main.errorViewerDisconnect": "Connection is lost. You can still view the document,
    but will not be able to download until the connection is restored.", "DE.Controllers.Main.leavePageText": "You have unsaved changes in this document. Click 'Stay on this Page' to await the autosave of the document. Click 'Leave this Page' to discard all the unsaved changes.", - "DE.Controllers.Main.errorBadImageUrl": "Image URL is incorrect", "DE.Controllers.Main.loadFontsTextText": "Loading data...", "DE.Controllers.Main.loadFontsTitleText": "Loading Data", "DE.Controllers.Main.loadFontTextText": "Loading data...", @@ -113,6 +114,7 @@ "DE.Controllers.Main.textTryUndoRedo": "The Undo/Redo functions are disabled for the Fast co-editing mode.", "DE.Controllers.Main.textUsername": "Username", "DE.Controllers.Main.titleLicenseExp": "License expired", + "DE.Controllers.Main.titleServerVersion": "Editor updated", "DE.Controllers.Main.titleUpdateVersion": "Version changed", "DE.Controllers.Main.txtArt": "Your text here", "DE.Controllers.Main.txtDiagramTitle": "Chart Title", @@ -130,8 +132,6 @@ "DE.Controllers.Main.warnLicenseExp": "Your license has expired.
    Please update your license and refresh the page.", "DE.Controllers.Main.warnNoLicense": "You are using an open source version of ONLYOFFICE. The version has limitations for concurrent connections to the document server (20 connections at a time).
    If you need more please consider purchasing a commercial license.", "DE.Controllers.Main.warnProcessRightsChange": "You have been denied the right to edit the file.", - "DE.Controllers.Main.titleServerVersion": "Editor updated", - "DE.Controllers.Main.errorServerVersion": "The editor version has been updated. The page will be reloaded to apply the changes.", "DE.Controllers.Search.textNoTextFound": "Text not Found", "DE.Controllers.Search.textReplaceAll": "Replace All", "DE.Controllers.Settings.notcriticalErrorTitle": "Warning", diff --git a/apps/documenteditor/mobile/locale/fr.json b/apps/documenteditor/mobile/locale/fr.json index 98a529b40..66c5de88f 100644 --- a/apps/documenteditor/mobile/locale/fr.json +++ b/apps/documenteditor/mobile/locale/fr.json @@ -19,10 +19,10 @@ "DE.Controllers.DocumentHolder.menuCut": "Couper", "DE.Controllers.DocumentHolder.menuDelete": "Supprimer", "DE.Controllers.DocumentHolder.menuEdit": "Modifier", + "DE.Controllers.DocumentHolder.menuMore": "Plus", "DE.Controllers.DocumentHolder.menuOpenLink": "Ouvrir le lien", - "DE.Controllers.DocumentHolder.menuMore": "More", - "DE.Controllers.DocumentHolder.sheetCancel": "Annuler", "DE.Controllers.DocumentHolder.menuPaste": "Coller", + "DE.Controllers.DocumentHolder.sheetCancel": "Annuler", "DE.Controllers.DocumentHolder.textGuest": "Invité", "DE.Controllers.EditContainer.textChart": "Graphique", "DE.Controllers.EditContainer.textHyperlink": "Lien hypertexte", @@ -52,8 +52,9 @@ "DE.Controllers.Main.downloadMergeTitle": "Téléchargement en cours", "DE.Controllers.Main.downloadTextText": "Téléchargement du document...", "DE.Controllers.Main.downloadTitleText": "Téléchargement du document", + "DE.Controllers.Main.errorBadImageUrl": "L'URL de l'image est incorrecte", "DE.Controllers.Main.errorCoAuthoringDisconnect": "La connexion au serveur perdue. Désolé, vous ne pouvez plus modifier le document.", - "DE.Controllers.Main.errorConnectToServer": "Impossible d'enregistrer le document. Veuillez vérifier vos paramètres de connexion ou contactez l'administrateur.
    Lorsque vous cliquez sur le bouton 'OK', vous serez invité à télécharger le document.

    Pour en savoir plus sur la connexion de Document Server here", + "DE.Controllers.Main.errorConnectToServer": "Impossible d'enregistrer le document. Veuillez vérifier vos paramètres de connexion ou contactez l'administrateur.
    Lorsque vous cliquez sur le bouton 'OK', vous serez invité à télécharger le document.

    Trouvez plus d'informations sur la connexion de Document Server ici", "DE.Controllers.Main.errorDatabaseConnection": "Erreur externe.
    Erreur de connexion à la base de données.Contactez le support.", "DE.Controllers.Main.errorDataRange": "Plage de données incorrecte.", "DE.Controllers.Main.errorDefaultMessage": "Code d'erreur: %1", @@ -63,6 +64,7 @@ "DE.Controllers.Main.errorMailMergeLoadFile": "Échec du chargement", "DE.Controllers.Main.errorMailMergeSaveFile": "Fusion a échoué.", "DE.Controllers.Main.errorProcessSaveResult": "Échec de l‘enregistrement.", + "DE.Controllers.Main.errorServerVersion": "La version de l'éditeur a été mise à jour. La page sera rechargée pour appliquer les modifications.", "DE.Controllers.Main.errorStockChart": "L'ordre des lignes est incorrect. Pour créer un graphique boursier organisez vos données sur la feuille de calcul dans l'ordre suivant:
    cours à l'ouverture, cours maximal, cours minimal, cours à la clôture.", "DE.Controllers.Main.errorUpdateVersion": "La version du fichier a été changée. La page sera rechargée.", "DE.Controllers.Main.errorUserDrop": "Impossible d'accéder au fichier.", @@ -112,6 +114,7 @@ "DE.Controllers.Main.textTryUndoRedo": "Les fonctions Annuler/Rétablir sont désactivées pour le mode collaboratif rapide.", "DE.Controllers.Main.textUsername": "Nom d'utilisateur", "DE.Controllers.Main.titleLicenseExp": "Licence expirée", + "DE.Controllers.Main.titleServerVersion": "L'éditeur est mis à jour", "DE.Controllers.Main.titleUpdateVersion": "Version a été modifiée", "DE.Controllers.Main.txtArt": "Entrez votre texte", "DE.Controllers.Main.txtDiagramTitle": "Titre du graphique", @@ -297,7 +300,7 @@ "DE.Views.EditText.textAutomatic": "Automatique", "DE.Views.EditText.textBack": "Retour", "DE.Views.EditText.textBullets": "Puces", - "DE.Views.EditText.textDblStrikethrough": "Double biffés", + "DE.Views.EditText.textDblStrikethrough": "Barré double", "DE.Views.EditText.textDblSuperscript": "Exposant", "DE.Views.EditText.textFontColor": "Couleur de police", "DE.Views.EditText.textFontColors": "Couleurs de police", diff --git a/apps/documenteditor/mobile/locale/ru.json b/apps/documenteditor/mobile/locale/ru.json index 0ee1d2a2d..efac5c8f2 100644 --- a/apps/documenteditor/mobile/locale/ru.json +++ b/apps/documenteditor/mobile/locale/ru.json @@ -3,7 +3,7 @@ "Common.UI.ThemeColorPalette.textThemeColors": "Цвета темы", "Common.Utils.Metric.txtCm": "см", "Common.Utils.Metric.txtPt": "пт", - "DE.Controllers.AddContainer.textImage": "Картинка", + "DE.Controllers.AddContainer.textImage": "Изображение", "DE.Controllers.AddContainer.textOther": "Другое", "DE.Controllers.AddContainer.textShape": "Фигура", "DE.Controllers.AddContainer.textTable": "Таблица", @@ -19,10 +19,10 @@ "DE.Controllers.DocumentHolder.menuCut": "Вырезать", "DE.Controllers.DocumentHolder.menuDelete": "Удалить", "DE.Controllers.DocumentHolder.menuEdit": "Редактировать", + "DE.Controllers.DocumentHolder.menuMore": "Ещё", "DE.Controllers.DocumentHolder.menuOpenLink": "Перейти", - "DE.Controllers.DocumentHolder.menuMore": "Еще", - "DE.Controllers.DocumentHolder.sheetCancel": "Отмена", "DE.Controllers.DocumentHolder.menuPaste": "Вставить", + "DE.Controllers.DocumentHolder.sheetCancel": "Отмена", "DE.Controllers.DocumentHolder.textGuest": "Гость", "DE.Controllers.EditContainer.textChart": "Диаграмма", "DE.Controllers.EditContainer.textHyperlink": "Гиперссылка", @@ -52,6 +52,7 @@ "DE.Controllers.Main.downloadMergeTitle": "Загрузка", "DE.Controllers.Main.downloadTextText": "Загрузка документа...", "DE.Controllers.Main.downloadTitleText": "Загрузка документа", + "DE.Controllers.Main.errorBadImageUrl": "Неправильный URL-адрес изображения", "DE.Controllers.Main.errorCoAuthoringDisconnect": "Подключение к серверу прервано. Редактирование недоступно.", "DE.Controllers.Main.errorConnectToServer": "Не удается сохранить документ. Проверьте параметры подключения или обратитесь к вашему администратору.
    Когда вы нажмете на кнопку 'OK', вам будет предложено скачать документ.

    Дополнительную информацию о подключении Сервера документов можно найти здесь", "DE.Controllers.Main.errorDatabaseConnection": "Внешняя ошибка.
    Ошибка подключения к базе данных. Пожалуйста, обратитесь в службу технической поддержки.", @@ -63,6 +64,7 @@ "DE.Controllers.Main.errorMailMergeLoadFile": "Сбой при загрузке", "DE.Controllers.Main.errorMailMergeSaveFile": "Не удалось выполнить слияние.", "DE.Controllers.Main.errorProcessSaveResult": "Не удалось завершить сохранение.", + "DE.Controllers.Main.errorServerVersion": "Версия редактора была обновлена. Страница будет перезагружена, чтобы применить изменения.", "DE.Controllers.Main.errorStockChart": "Неверный порядок строк. Чтобы создать биржевую диаграмму, расположите данные на листе в следующем порядке:
    цена открытия, максимальная цена, минимальная цена, цена закрытия.", "DE.Controllers.Main.errorUpdateVersion": "Версия файла была изменена. Страница будет перезагружена.", "DE.Controllers.Main.errorUserDrop": "В настоящий момент файл недоступен.", @@ -112,6 +114,7 @@ "DE.Controllers.Main.textTryUndoRedo": "Функции отмены и повтора действий отключены в Быстром режиме совместного редактирования.", "DE.Controllers.Main.textUsername": "Имя пользователя", "DE.Controllers.Main.titleLicenseExp": "Истек срок действия лицензии", + "DE.Controllers.Main.titleServerVersion": "Редактор обновлен", "DE.Controllers.Main.titleUpdateVersion": "Версия изменилась", "DE.Controllers.Main.txtArt": "Введите ваш текст", "DE.Controllers.Main.txtDiagramTitle": "Заголовок диаграммы", @@ -251,7 +254,7 @@ "DE.Views.EditShape.textFromText": "Расстояние до текста", "DE.Views.EditShape.textInFront": "Перед текстом", "DE.Views.EditShape.textInline": "В тексте", - "DE.Views.EditShape.textOpacity": "Непрозрачность", + "DE.Views.EditShape.textOpacity": "Прозрачность", "DE.Views.EditShape.textOverlap": "Разрешить перекрытие", "DE.Views.EditShape.textRemoveShape": "Удалить фигуру", "DE.Views.EditShape.textReorder": "Порядок", @@ -319,7 +322,7 @@ "DE.Views.Search.textHighlight": "Выделить результаты", "DE.Views.Search.textReplace": "Заменить", "DE.Views.Search.textSearch": "Найти", - "DE.Views.Settings.textAbout": "О продукте", + "DE.Views.Settings.textAbout": "О программе", "DE.Views.Settings.textAddress": "адрес", "DE.Views.Settings.textAuthor": "Автор", "DE.Views.Settings.textBack": "Назад", diff --git a/apps/documenteditor/sdk_dev_scripts.js b/apps/documenteditor/sdk_dev_scripts.js index b306b7857..65821e8d7 100644 --- a/apps/documenteditor/sdk_dev_scripts.js +++ b/apps/documenteditor/sdk_dev_scripts.js @@ -6,8 +6,6 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/docscoapicommon.js", "../../../../sdkjs/common/docscoapi.js", "../../../../sdkjs/common/spellcheckapi.js", - "../../../../sdkjs/common/spellCheckLanguage.js", - "../../../../sdkjs/common/spellCheckLanguagesAll.js", "../../../../sdkjs/common/apiCommon.js", "../../../../sdkjs/common/SerializeCommonWordExcel.js", "../../../../sdkjs/common/editorscommon.js", diff --git a/apps/presentationeditor/embed/index.html b/apps/presentationeditor/embed/index.html index aa4c5f04b..b093b6577 100644 --- a/apps/presentationeditor/embed/index.html +++ b/apps/presentationeditor/embed/index.html @@ -323,9 +323,6 @@ - - - - - - diff --git a/apps/presentationeditor/embed/js/ApplicationView.js b/apps/presentationeditor/embed/js/ApplicationView.js index 2dcaa32b6..058c7bde5 100644 --- a/apps/presentationeditor/embed/js/ApplicationView.js +++ b/apps/presentationeditor/embed/js/ApplicationView.js @@ -41,10 +41,10 @@ var ApplicationView = new(function(){ $btnTools.addClass('dropdown-toggle').attr('data-toggle', 'dropdown').attr('aria-expanded', 'true'); $btnTools.parent().append( ''); } diff --git a/apps/presentationeditor/main/app.js b/apps/presentationeditor/main/app.js index 941fc47b2..3a3f9a384 100644 --- a/apps/presentationeditor/main/app.js +++ b/apps/presentationeditor/main/app.js @@ -54,8 +54,6 @@ require.config({ jmousewheel : '../vendor/perfect-scrollbar/src/jquery.mousewheel', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', allfonts : '../../sdkjs/common/AllFonts', sdk : '../../sdkjs/slide/sdk-all-min', api : 'api/documents/api', @@ -108,9 +106,7 @@ require.config({ 'underscore', 'allfonts', 'xregexp', - 'sockjs', - 'jsziputils', - 'jsrsasign' + 'sockjs' ] }, gateway: { diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index 76575790f..23b696f40 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -192,13 +192,13 @@ define([ me.api.asc_enableKeyEvents(false); }, 'modal:close': function(dlg) { - if (dlg && dlg.$lastmodal && dlg.$lastmodal.size() < 1) { + if (dlg && dlg.$lastmodal && dlg.$lastmodal.length < 1) { me.isModalShowed = false; me.api.asc_enableKeyEvents(true); } }, 'modal:hide': function(dlg) { - if (dlg && dlg.$lastmodal && dlg.$lastmodal.size() < 1) { + if (dlg && dlg.$lastmodal && dlg.$lastmodal.length < 1) { me.isModalShowed = false; me.api.asc_enableKeyEvents(true); } diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index 8fc9a531a..44cb29368 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -1718,7 +1718,7 @@ define([ store: this.getApplication().getCollection('Common.Collections.TextArt'), parentMenu: this.toolbar.mnuInsertTextArt.menu, showLast: false, - itemTemplate: _.template('
    ') + itemTemplate: _.template('
    ') }); this.toolbar.mnuTextArtPicker.on('item:click', function(picker, item, record, e) { diff --git a/apps/presentationeditor/main/app/view/DocumentPreview.js b/apps/presentationeditor/main/app/view/DocumentPreview.js index 39119c2e8..3db0f8d63 100644 --- a/apps/presentationeditor/main/app/view/DocumentPreview.js +++ b/apps/presentationeditor/main/app/view/DocumentPreview.js @@ -100,7 +100,7 @@ define([ render: function () { var el = $(this.el), me = this; - el.html(_.template(this.template, { + el.html(_.template(this.template)({ scope: this })); diff --git a/apps/presentationeditor/main/app/view/FileMenuPanels.js b/apps/presentationeditor/main/app/view/FileMenuPanels.js index 2bf939bce..e6b61a70a 100644 --- a/apps/presentationeditor/main/app/view/FileMenuPanels.js +++ b/apps/presentationeditor/main/app/view/FileMenuPanels.js @@ -54,7 +54,8 @@ define([ formats: [[ {name: 'PDF', imgCls: 'pdf', type: Asc.c_oAscFileType.PDF}, - {name: 'PPTX', imgCls: 'pptx', type: Asc.c_oAscFileType.PPTX} + {name: 'PPTX', imgCls: 'pptx', type: Asc.c_oAscFileType.PPTX}, + {name: 'ODP', imgCls: 'odp', type: Asc.c_oAscFileType.ODP} ]], diff --git a/apps/presentationeditor/main/app/view/HyperlinkSettingsDialog.js b/apps/presentationeditor/main/app/view/HyperlinkSettingsDialog.js index 6561093d6..4d79ef530 100644 --- a/apps/presentationeditor/main/app/view/HyperlinkSettingsDialog.js +++ b/apps/presentationeditor/main/app/view/HyperlinkSettingsDialog.js @@ -103,7 +103,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.slides = this.options.slides; this.api = this.options.api; diff --git a/apps/presentationeditor/main/app/view/SlideSizeSettings.js b/apps/presentationeditor/main/app/view/SlideSizeSettings.js index 09a499c65..77ec2b563 100644 --- a/apps/presentationeditor/main/app/view/SlideSizeSettings.js +++ b/apps/presentationeditor/main/app/view/SlideSizeSettings.js @@ -87,7 +87,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.spinners = []; this._noApply = false; diff --git a/apps/presentationeditor/main/app/view/SlideshowSettings.js b/apps/presentationeditor/main/app/view/SlideshowSettings.js index d0ce309c2..41bc3ef22 100644 --- a/apps/presentationeditor/main/app/view/SlideshowSettings.js +++ b/apps/presentationeditor/main/app/view/SlideshowSettings.js @@ -68,7 +68,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.spinners = []; this._noApply = false; diff --git a/apps/presentationeditor/main/app/view/Statusbar.js b/apps/presentationeditor/main/app/view/Statusbar.js index 6723eae1f..0350076d5 100644 --- a/apps/presentationeditor/main/app/view/Statusbar.js +++ b/apps/presentationeditor/main/app/view/Statusbar.js @@ -80,7 +80,7 @@ define([ templateUserList: _.template(''), @@ -338,7 +338,7 @@ define([ _onAddUser: function(m, c, opts) { if (this.panelUsersList) { - this.panelUsersList.find('ul').append(_.template(this.tplUser, {user: m, scope: this})); + this.panelUsersList.find('ul').append(_.template(this.tplUser)({user: m, scope: this})); this.panelUsersList.scroller.update({minScrollbarLength : 40, alwaysVisibleY: true}); } }, diff --git a/apps/presentationeditor/main/app_dev.js b/apps/presentationeditor/main/app_dev.js index 56aea9616..bca5796fa 100644 --- a/apps/presentationeditor/main/app_dev.js +++ b/apps/presentationeditor/main/app_dev.js @@ -54,8 +54,6 @@ require.config({ jmousewheel : '../vendor/perfect-scrollbar/src/jquery.mousewheel', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', api : 'api/documents/api', core : 'common/main/lib/core/application', notification : 'common/main/lib/core/NotificationCenter', @@ -121,8 +119,6 @@ require([ 'analytics', 'gateway', 'locale', - 'jsziputils', - 'jsrsasign', 'sockjs', 'xregexp', 'underscore' diff --git a/apps/presentationeditor/main/locale/de.json b/apps/presentationeditor/main/locale/de.json index c052a0a5c..52b389339 100644 --- a/apps/presentationeditor/main/locale/de.json +++ b/apps/presentationeditor/main/locale/de.json @@ -80,7 +80,6 @@ "Common.Views.ExternalDiagramEditor.textTitle": "Diagramm bearbeiten", "Common.Views.Header.openNewTabText": "In neuer Registerkarte öffnen", "Common.Views.Header.textBack": "Zu Dokumenten übergehen", - "Common.Views.Header.txtHeaderDeveloper": "ENTWICKLERMODUS", "Common.Views.Header.txtRename": "Umbenennen", "Common.Views.ImageFromUrlDialog.cancelButtonText": "Abbrechen", "Common.Views.ImageFromUrlDialog.okButtonText": "OK", @@ -122,6 +121,7 @@ "PE.Controllers.Main.downloadTextText": "Präsentation wird heruntergeladen...", "PE.Controllers.Main.downloadTitleText": "Präsentation wird heruntergeladen", "PE.Controllers.Main.errorAccessDeny": "Sie haben versucht die Änderungen im Dokument, zu dem Sie keine Berechtigungen haben, vorzunehemen.
    Wenden Sie sich an Ihren Serveradministrator.", + "PE.Controllers.Main.errorBadImageUrl": "URL des Bildes ist falsch", "PE.Controllers.Main.errorCoAuthoringDisconnect": "Verbindung zum Server verloren. Das Dokument kann momentan nicht bearbeitet werden.", "PE.Controllers.Main.errorConnectToServer": "Das Dokument konnte nicht gespeichert werden. Bitte überprüfen Sie die Verbindungseinstellungen, oder richten Sie an Ihren Administrator.
    Wann Sie auf den Button \"OK\" klicken, werden Sie aufgefordert das Dokument herunterzuladen.

    Mehr Information zur Verbindung des Dokument Servers finden Sie hier", "PE.Controllers.Main.errorDatabaseConnection": "Externer Fehler.
    Fehler beim Verbinden zur Datenbank. Bitte wenden Sie sich an den Kundendienst, falls der Fehler bestehen bleibt.", @@ -174,6 +174,7 @@ "PE.Controllers.Main.splitMaxRowsErrorText": "Die Zeilenanzahl muss weniger als %1 sein.", "PE.Controllers.Main.textAnonymous": "Anonym", "PE.Controllers.Main.textBuyNow": "Webseite besuchen", + "PE.Controllers.Main.textChangesSaved": "Alle Änderungen werden gespeichert", "PE.Controllers.Main.textCloseTip": "Klicken Sie, um den Tipp zu schließen", "PE.Controllers.Main.textContactUs": "Verkaufsteam kontaktieren", "PE.Controllers.Main.textLoadingDocument": "Präsentation wird geladen ", @@ -796,6 +797,7 @@ "PE.Views.FileMenuPanels.Settings.strCoAuthModeDescFast": "Andere Benutzer werden Ihre Änderungen gleichzeitig sehen", "PE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Sie müssen die Änderungen annehmen, bevor Sie diese sehen können", "PE.Views.FileMenuPanels.Settings.strFast": "Schnell", + "PE.Views.FileMenuPanels.Settings.strForcesave": "Immer auf dem Server speichern (ansonsten auf dem Server beim Schließen des Dokuments speichern)", "PE.Views.FileMenuPanels.Settings.strInputMode": "Hieroglyphen einschalten", "PE.Views.FileMenuPanels.Settings.strShowChanges": "Änderungen bei der Echtzeit-Zusammenarbeit zeigen", "PE.Views.FileMenuPanels.Settings.strStrict": "Formal", @@ -809,6 +811,7 @@ "PE.Views.FileMenuPanels.Settings.textAutoRecover": "Autowiederherstellen", "PE.Views.FileMenuPanels.Settings.textAutoSave": "Automatisch speichern", "PE.Views.FileMenuPanels.Settings.textDisabled": "Ausgeschaltet", + "PE.Views.FileMenuPanels.Settings.textForceSave": "Auf dem Server speichern", "PE.Views.FileMenuPanels.Settings.textMinute": "Jede Minute", "PE.Views.FileMenuPanels.Settings.txtAll": "Alle anzeigen", "PE.Views.FileMenuPanels.Settings.txtCm": "Zentimeter", @@ -872,6 +875,7 @@ "PE.Views.LeftMenu.tipSlides": "Folien", "PE.Views.LeftMenu.tipSupport": "Feedback und Support", "PE.Views.LeftMenu.tipTitles": "Titel", + "PE.Views.LeftMenu.txtDeveloper": "ENTWICKLERMODUS", "PE.Views.ParagraphSettings.strLineHeight": "Zeilenabstand", "PE.Views.ParagraphSettings.strParagraphSpacing": "Absatzabstand", "PE.Views.ParagraphSettings.strSpacingAfter": "Nach ", diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index fe010e70d..c123204d5 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -80,7 +80,6 @@ "Common.Views.ExternalDiagramEditor.textTitle": "Chart Editor", "Common.Views.Header.openNewTabText": "Open in New Tab", "Common.Views.Header.textBack": "Go to Documents", - "del_Common.Views.Header.txtHeaderDeveloper": "DEVELOPER MODE", "Common.Views.Header.txtRename": "Rename", "Common.Views.ImageFromUrlDialog.cancelButtonText": "Cancel", "Common.Views.ImageFromUrlDialog.okButtonText": "OK", @@ -122,6 +121,7 @@ "PE.Controllers.Main.downloadTextText": "Downloading presentation...", "PE.Controllers.Main.downloadTitleText": "Downloading Presentation", "PE.Controllers.Main.errorAccessDeny": "You are trying to perform an action you do not have rights for.
    Please contact your Document Server administrator.", + "PE.Controllers.Main.errorBadImageUrl": "Image URL is incorrect", "PE.Controllers.Main.errorCoAuthoringDisconnect": "Server connection lost. The document cannot be edited right now.", "PE.Controllers.Main.errorConnectToServer": "The document could not be saved. Please check connection settings or contact your administrator.
    When you click the 'OK' button, you will be prompted to download the document.

    Find more information about connecting Document Server here", "PE.Controllers.Main.errorDatabaseConnection": "External error.
    Database connection error. Please contact support in case the error persists.", @@ -131,6 +131,7 @@ "PE.Controllers.Main.errorKeyEncrypt": "Unknown key descriptor", "PE.Controllers.Main.errorKeyExpire": "Key descriptor expired", "PE.Controllers.Main.errorProcessSaveResult": "Saving failed.", + "PE.Controllers.Main.errorServerVersion": "The editor version has been updated. The page will be reloaded to apply the changes.", "PE.Controllers.Main.errorSessionAbsolute": "The document editing session has expired. Please reload the page.", "PE.Controllers.Main.errorSessionIdle": "The document has not been edited for quite a long time. Please reload the page.", "PE.Controllers.Main.errorSessionToken": "The connection to the server has been interrupted. Please reload the page.", @@ -173,6 +174,7 @@ "PE.Controllers.Main.splitMaxRowsErrorText": "The number of rows must be less than %1.", "PE.Controllers.Main.textAnonymous": "Anonymous", "PE.Controllers.Main.textBuyNow": "Visit website", + "PE.Controllers.Main.textChangesSaved": "All changes saved", "PE.Controllers.Main.textCloseTip": "Click to close the tip", "PE.Controllers.Main.textContactUs": "Contact sales", "PE.Controllers.Main.textLoadingDocument": "Loading presentation", @@ -181,6 +183,7 @@ "PE.Controllers.Main.textStrict": "Strict mode", "PE.Controllers.Main.textTryUndoRedo": "The Undo/Redo functions are disabled for the Fast co-editing mode.
    Click the 'Strict mode' button to switch to the Strict co-editing mode to edit the file without other users interference and send your changes only after you save them. You can switch between the co-editing modes using the editor Advanced settings.", "PE.Controllers.Main.titleLicenseExp": "License expired", + "PE.Controllers.Main.titleServerVersion": "Editor updated", "PE.Controllers.Main.txtArt": "Your text here", "PE.Controllers.Main.txtBasicShapes": "Basic Shapes", "PE.Controllers.Main.txtButtons": "Buttons", @@ -245,10 +248,6 @@ "PE.Controllers.Main.warnLicenseExp": "Your license has expired.
    Please update your license and refresh the page.", "PE.Controllers.Main.warnNoLicense": "You are using an open source version of ONLYOFFICE. The version has limitations for concurrent connections to the document server (20 connections at a time).
    If you need more please consider purchasing a commercial license.", "PE.Controllers.Main.warnProcessRightsChange": "You have been denied the right to edit the file.", - "PE.Controllers.Main.titleServerVersion": "Editor updated", - "PE.Controllers.Main.errorServerVersion": "The editor version has been updated. The page will be reloaded to apply the changes.", - "PE.Controllers.Main.textChangesSaved": "All changes saved", - "PE.Controllers.Main.errorBadImageUrl": "Image URL is incorrect", "PE.Controllers.Statusbar.zoomText": "Zoom {0}%", "PE.Controllers.Toolbar.confirmAddFontName": "The font you are going to save is not available on the current device.
    The text style will be displayed using one of the system fonts, the saved font will be used when it is available.
    Do you want to continue?", "PE.Controllers.Toolbar.textAccent": "Accents", @@ -798,6 +797,7 @@ "PE.Views.FileMenuPanels.Settings.strCoAuthModeDescFast": "Other users will see your changes at once", "PE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "You will need to accept changes before you can see them", "PE.Views.FileMenuPanels.Settings.strFast": "Fast", + "PE.Views.FileMenuPanels.Settings.strForcesave": "Always save to server (otherwise save to server on document close)", "PE.Views.FileMenuPanels.Settings.strInputMode": "Turn on hieroglyphs", "PE.Views.FileMenuPanels.Settings.strShowChanges": "Realtime Collaboration Changes", "PE.Views.FileMenuPanels.Settings.strStrict": "Strict", @@ -811,6 +811,7 @@ "PE.Views.FileMenuPanels.Settings.textAutoRecover": "Autorecover", "PE.Views.FileMenuPanels.Settings.textAutoSave": "Autosave", "PE.Views.FileMenuPanels.Settings.textDisabled": "Disabled", + "PE.Views.FileMenuPanels.Settings.textForceSave": "Save to Server", "PE.Views.FileMenuPanels.Settings.textMinute": "Every Minute", "PE.Views.FileMenuPanels.Settings.txtAll": "View All", "PE.Views.FileMenuPanels.Settings.txtCm": "Centimeter", @@ -820,8 +821,6 @@ "PE.Views.FileMenuPanels.Settings.txtInput": "Alternate Input", "PE.Views.FileMenuPanels.Settings.txtLast": "View Last", "PE.Views.FileMenuPanels.Settings.txtPt": "Point", - "PE.Views.FileMenuPanels.Settings.textForceSave": "Save to Server", - "PE.Views.FileMenuPanels.Settings.strForcesave": "Always save to server (otherwise save to server on document close)", "PE.Views.HyperlinkSettingsDialog.cancelButtonText": "Cancel", "PE.Views.HyperlinkSettingsDialog.okButtonText": "OK", "PE.Views.HyperlinkSettingsDialog.strDisplay": "Display", diff --git a/apps/presentationeditor/main/locale/fr.json b/apps/presentationeditor/main/locale/fr.json index b9113136d..a0ca2a6d0 100644 --- a/apps/presentationeditor/main/locale/fr.json +++ b/apps/presentationeditor/main/locale/fr.json @@ -80,7 +80,6 @@ "Common.Views.ExternalDiagramEditor.textTitle": "Éditeur de graphique", "Common.Views.Header.openNewTabText": "Ouvrir dans un nouvel onglet", "Common.Views.Header.textBack": "Aller aux Documents", - "Common.Views.Header.txtHeaderDeveloper": "MODE DEVELOPPEUR", "Common.Views.Header.txtRename": "Renommer", "Common.Views.ImageFromUrlDialog.cancelButtonText": "Annuler", "Common.Views.ImageFromUrlDialog.okButtonText": "OK", @@ -122,8 +121,9 @@ "PE.Controllers.Main.downloadTextText": "Téléchargement de la présentation...", "PE.Controllers.Main.downloadTitleText": "Téléchargement de la présentation", "PE.Controllers.Main.errorAccessDeny": "Vous tentez d'exéсuter une action pour laquelle vous ne disposez pas des droits.
    Veuillez contacter l'administrateur de Document Server.", + "PE.Controllers.Main.errorBadImageUrl": "L'URL de l'image est incorrecte", "PE.Controllers.Main.errorCoAuthoringDisconnect": "Connexion au serveur perdue. Le document ne peut être modifié en ce moment.", - "PE.Controllers.Main.errorConnectToServer": "Le document n'a pas pu être enregistré. Veuillez vérifier les paramètres de connexion ou contactez votre administrateur.
    Lorsque vous cliquez sur le bouton 'OK', vous serez invité à télécharger le document.

    Trouvez plus d'informations sur la connexion Document Serverhere", + "PE.Controllers.Main.errorConnectToServer": "Le document n'a pas pu être enregistré. Veuillez vérifier les paramètres de connexion ou contactez votre administrateur.
    Lorsque vous cliquez sur le bouton 'OK', vous serez invité à télécharger le document.

    Trouvez plus d'informations sur la connexion de Document Serverici", "PE.Controllers.Main.errorDatabaseConnection": "Erreur externe.
    Erreur de connexion à la base de données. Si l'erreur persiste veillez contactez l'assistance technique.", "PE.Controllers.Main.errorDataRange": "Plage de données incorrecte.", "PE.Controllers.Main.errorDefaultMessage": "Code d'erreur: %1", @@ -174,6 +174,7 @@ "PE.Controllers.Main.splitMaxRowsErrorText": "Le nombre de lignes doit être inférieure à %1.", "PE.Controllers.Main.textAnonymous": "Anonyme", "PE.Controllers.Main.textBuyNow": "Visiter le site web", + "PE.Controllers.Main.textChangesSaved": "Toutes les modifications sont enregistrées", "PE.Controllers.Main.textCloseTip": "Cliquez pour fermer la conseil", "PE.Controllers.Main.textContactUs": "Contacter l'équipe de ventes", "PE.Controllers.Main.textLoadingDocument": "Chargement de présentation", @@ -796,6 +797,7 @@ "PE.Views.FileMenuPanels.Settings.strCoAuthModeDescFast": "Les autres utilisateurs pourront voir immédiatement vos modifications ", "PE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Avant de pouvoir afficher les modifications, vous avez besoin de les accépter ", "PE.Views.FileMenuPanels.Settings.strFast": "Rapide", + "PE.Views.FileMenuPanels.Settings.strForcesave": "Toujours enregistrer sur le serveur ( sinon enregistrer sur le serveur lors de la fermeture du document )", "PE.Views.FileMenuPanels.Settings.strInputMode": "Activer les hiéroglyphes", "PE.Views.FileMenuPanels.Settings.strShowChanges": "Changements de collaboration en temps réel", "PE.Views.FileMenuPanels.Settings.strStrict": "Strict", @@ -809,6 +811,7 @@ "PE.Views.FileMenuPanels.Settings.textAutoRecover": "Récupération automatique", "PE.Views.FileMenuPanels.Settings.textAutoSave": "Enregistrement automatique", "PE.Views.FileMenuPanels.Settings.textDisabled": "Désactivé", + "PE.Views.FileMenuPanels.Settings.textForceSave": "Enregistrer sur le serveur", "PE.Views.FileMenuPanels.Settings.textMinute": "Chaque minute", "PE.Views.FileMenuPanels.Settings.txtAll": "Tout", "PE.Views.FileMenuPanels.Settings.txtCm": "Centimètre", @@ -872,6 +875,7 @@ "PE.Views.LeftMenu.tipSlides": "Diapositives", "PE.Views.LeftMenu.tipSupport": "Commentaires & assistance", "PE.Views.LeftMenu.tipTitles": "Titres", + "PE.Views.LeftMenu.txtDeveloper": "MODE DEVELOPPEUR", "PE.Views.ParagraphSettings.strLineHeight": "Interligne", "PE.Views.ParagraphSettings.strParagraphSpacing": "Espacement de paragraphe", "PE.Views.ParagraphSettings.strSpacingAfter": "Après", @@ -886,7 +890,7 @@ "PE.Views.ParagraphSettingsAdvanced.noTabs": "The specified tabs will appear in this field", "PE.Views.ParagraphSettingsAdvanced.okButtonText": "OK", "PE.Views.ParagraphSettingsAdvanced.strAllCaps": "Majuscules", - "PE.Views.ParagraphSettingsAdvanced.strDoubleStrike": "Double biffés", + "PE.Views.ParagraphSettingsAdvanced.strDoubleStrike": "Barré double", "PE.Views.ParagraphSettingsAdvanced.strIndentsFirstLine": "Première ligne", "PE.Views.ParagraphSettingsAdvanced.strIndentsLeftText": "A gauche", "PE.Views.ParagraphSettingsAdvanced.strIndentsRightText": "A droite", diff --git a/apps/presentationeditor/main/locale/ru.json b/apps/presentationeditor/main/locale/ru.json index 32f5aeda6..f21b58013 100644 --- a/apps/presentationeditor/main/locale/ru.json +++ b/apps/presentationeditor/main/locale/ru.json @@ -80,7 +80,6 @@ "Common.Views.ExternalDiagramEditor.textTitle": "Редактор диаграмм", "Common.Views.Header.openNewTabText": "Открыть в новой вкладке", "Common.Views.Header.textBack": "Перейти к Документам", - "Common.Views.Header.txtHeaderDeveloper": "РЕЖИМ РАЗРАБОТЧИКА", "Common.Views.Header.txtRename": "Переименовать", "Common.Views.ImageFromUrlDialog.cancelButtonText": "Отмена", "Common.Views.ImageFromUrlDialog.okButtonText": "OK", @@ -122,6 +121,7 @@ "PE.Controllers.Main.downloadTextText": "Загрузка презентации...", "PE.Controllers.Main.downloadTitleText": "Загрузка презентации", "PE.Controllers.Main.errorAccessDeny": "Вы пытаетесь выполнить действие, на которое у вас нет прав.
    Пожалуйста, обратитесь к администратору Сервера документов.", + "PE.Controllers.Main.errorBadImageUrl": "Неправильный URL-адрес изображения", "PE.Controllers.Main.errorCoAuthoringDisconnect": "Потеряно соединение с сервером. В данный момент нельзя отредактировать документ.", "PE.Controllers.Main.errorConnectToServer": "Не удается сохранить документ. Проверьте параметры подключения или обратитесь к вашему администратору.
    Когда вы нажмете на кнопку 'OK', вам будет предложено скачать документ.

    Дополнительную информацию о подключении Сервера документов можно найти здесь", "PE.Controllers.Main.errorDatabaseConnection": "Внешняя ошибка.
    Ошибка подключения к базе данных. Если ошибка повторяется, пожалуйста, обратитесь в службу поддержки.", @@ -174,6 +174,7 @@ "PE.Controllers.Main.splitMaxRowsErrorText": "Число строк должно быть меньше, чем %1.", "PE.Controllers.Main.textAnonymous": "Аноним", "PE.Controllers.Main.textBuyNow": "Перейти на сайт", + "PE.Controllers.Main.textChangesSaved": "Все изменения сохранены", "PE.Controllers.Main.textCloseTip": "Щелкните, чтобы закрыть эту подсказку", "PE.Controllers.Main.textContactUs": "Связаться с отделом продаж", "PE.Controllers.Main.textLoadingDocument": "Загрузка презентации", @@ -796,6 +797,7 @@ "PE.Views.FileMenuPanels.Settings.strCoAuthModeDescFast": "Другие пользователи будут сразу же видеть ваши изменения", "PE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Прежде чем вы сможете увидеть изменения, их надо будет принять", "PE.Views.FileMenuPanels.Settings.strFast": "Быстрый", + "PE.Views.FileMenuPanels.Settings.strForcesave": "Всегда сохранять на сервере (в противном случае сохранять на сервере при закрытии документа)", "PE.Views.FileMenuPanels.Settings.strInputMode": "Включить иероглифы", "PE.Views.FileMenuPanels.Settings.strShowChanges": "Отображать изменения при совместной работе", "PE.Views.FileMenuPanels.Settings.strStrict": "Строгий", @@ -809,6 +811,7 @@ "PE.Views.FileMenuPanels.Settings.textAutoRecover": "Автовосстановление", "PE.Views.FileMenuPanels.Settings.textAutoSave": "Автосохранение", "PE.Views.FileMenuPanels.Settings.textDisabled": "Отключено", + "PE.Views.FileMenuPanels.Settings.textForceSave": "Сохранить на сервере", "PE.Views.FileMenuPanels.Settings.textMinute": "Каждую минуту", "PE.Views.FileMenuPanels.Settings.txtAll": "Все", "PE.Views.FileMenuPanels.Settings.txtCm": "Сантиметр", @@ -872,6 +875,7 @@ "PE.Views.LeftMenu.tipSlides": "Слайды", "PE.Views.LeftMenu.tipSupport": "Обратная связь и поддержка", "PE.Views.LeftMenu.tipTitles": "Заголовки", + "PE.Views.LeftMenu.txtDeveloper": "РЕЖИМ РАЗРАБОТЧИКА", "PE.Views.ParagraphSettings.strLineHeight": "Междустрочный интервал", "PE.Views.ParagraphSettings.strParagraphSpacing": "Интервал между абзацами", "PE.Views.ParagraphSettings.strSpacingAfter": "После", diff --git a/apps/presentationeditor/main/resources/help/en/UsageInstructions/SavePrintDownload.htm b/apps/presentationeditor/main/resources/help/en/UsageInstructions/SavePrintDownload.htm index 9e46dd35c..3c95f4964 100644 --- a/apps/presentationeditor/main/resources/help/en/UsageInstructions/SavePrintDownload.htm +++ b/apps/presentationeditor/main/resources/help/en/UsageInstructions/SavePrintDownload.htm @@ -8,28 +8,30 @@ -
    -

    Save/print/download your presentation

    -

    By default, Рresentation Editor automatically saves your file each 2 seconds when you work on it preventing your data loss in case of the unexpected program closing. If you co-edit the file in the Fast mode, the timer requests for updates 25 times a second and saves the changes if they have been made. When the file is being co-edited in the Strict mode, changes are automatically saved at 10-minute intervals. If you need, you can easily select the preferred co-editing mode or disable the Autosave feature on the Advanced Settings page.

    -

    To save your current presentation manually,

    - -

    To print out the current presentation,

    - -

    After that a PDF file will be generated on the basis of the presentation. You can open and print it out, or save onto your computer hard disk drive or removable medium to print it out later.

    -

    To download the resulting presentation onto your computer hard disk drive,

    -
      -
    1. click the File File icon icon at the left sidebar,
    2. -
    3. select the Download as option,
    4. -
    5. choose one of the available formats depending on your needs: PDF, PPTX.
    6. -
    -
    +
    +

    Save/print/download your presentation

    +

    By default, Рresentation Editor automatically saves your file each 2 seconds when you work on it preventing your data loss in case of the unexpected program closing. If you co-edit the file in the Fast mode, the timer requests for updates 25 times a second and saves the changes if they have been made. When the file is being co-edited in the Strict mode, changes are automatically saved at 10-minute intervals. If you need, you can easily select the preferred co-editing mode or disable the Autosave feature on the Advanced Settings page.

    +

    To save your current presentation manually,

    + +

    To print out the current presentation,

    + +
    +

    After that a PDF file will be generated on the basis of the presentation. You can open and print it out, or save onto your computer hard disk drive or removable medium to print it out later.

    +

    To download the resulting presentation onto your computer hard disk drive,

    +
      +
    1. click the File File icon icon at the left sidebar,
    2. +
    3. select the Download as option,
    4. +
    5. choose one of the available formats depending on your needs: PDF, PPTX.
    6. +
    +
    +
    \ No newline at end of file diff --git a/apps/presentationeditor/main/resources/help/en/UsageInstructions/ViewPresentationInfo.htm b/apps/presentationeditor/main/resources/help/en/UsageInstructions/ViewPresentationInfo.htm index 52583729a..2c91fb27e 100644 --- a/apps/presentationeditor/main/resources/help/en/UsageInstructions/ViewPresentationInfo.htm +++ b/apps/presentationeditor/main/resources/help/en/UsageInstructions/ViewPresentationInfo.htm @@ -12,10 +12,12 @@

    To access the detailed information about the currently edited presentation, click the File File icon icon at the left sidebar and select the Presentation Info option.

    General Information

    The presentation information includes presentation title, author, location and creation date.

    +

    Permission Information

    Note: this option is not available for users with the Read Only permissions.

    To find out, who have rights to view or edit the presentation, select the Access Rights... option at the left sidebar.

    You can also change currently selected access rights by pressing the Change access rights button in the Persons who have rights section.

    +

    To close the File pane and return to presentation editing, select the Return to Presentation option.

    diff --git a/apps/presentationeditor/main/resources/help/ru/HelpfulHints/About.htm b/apps/presentationeditor/main/resources/help/ru/HelpfulHints/About.htm index 36b512d39..ef55f0448 100644 --- a/apps/presentationeditor/main/resources/help/ru/HelpfulHints/About.htm +++ b/apps/presentationeditor/main/resources/help/ru/HelpfulHints/About.htm @@ -9,7 +9,7 @@

    О редакторе презентаций

    -

    Онлайн-редактор презентаций - это онлайн-приложение, которое позволяет просматривать и редактировать презентации непосредственно в браузере.

    +

    Онлайн-редактор презентаций - это онлайн-приложение, которое позволяет просматривать и редактировать презентации непосредственно в браузере.

    Используя онлайн-редактор презентаций, можно выполнять различные операции редактирования, как в любом десктопном редакторе, распечатывать отредактированные презентации, сохраняя все детали форматирования, или сохранять их на жесткий диск компьютера как файлы в формате PDF или PPTX.

    diff --git a/apps/presentationeditor/main/resources/help/ru/HelpfulHints/CollaborativeEditing.htm b/apps/presentationeditor/main/resources/help/ru/HelpfulHints/CollaborativeEditing.htm index 92d9e79fe..254c50273 100644 --- a/apps/presentationeditor/main/resources/help/ru/HelpfulHints/CollaborativeEditing.htm +++ b/apps/presentationeditor/main/resources/help/ru/HelpfulHints/CollaborativeEditing.htm @@ -12,50 +12,53 @@

    Совместное редактирование презентаций

    В онлайн-редакторе презентаций вы можете работать над презентацией совместно с другими пользователями. Эта возможность включает в себя следующее:

    -

    Совместное редактирование

    -

    В редакторе презентаций можно выбрать один из двух доступных режимов совместного редактирования. Быстрый используется по умолчанию, в нем изменения, вносимые другими пользователями, отображаются в реальном времени. Строгий режим позволяет скрывать изменения, внесенные другими пользователями, до тех пор, пока вы не нажмете значок Сохранить Значок Сохранить, чтобы сохранить ваши изменения и принять изменения, внесенные другими. Режим можно выбрать в Дополнительных настройках.

    -

    Когда презентацию редактируют одновременно несколько пользователей в Строгом режиме, редактируемые объекты (автофигуры, текстовые объекты, таблицы, изображения, диаграммы) помечаются пунктирными линиями разных цветов. Объект, который редактируете Вы, окружен зеленой пунктирной линией. Красные пунктирные линии означают, что объекты редактируются другими пользователями. При наведении курсора мыши на один из редактируемых объектов отображается имя того пользователя, который в данный момент его редактирует. В Быстром режиме действия и имена участников совместного редактирования отображаются непосредственно в процессе редактирования.

    -

    Количество пользователей, которые в данный момент работают над текущей презентацией, отображается в левом нижнем углу в строке состояния - Значок Количество пользователей. Чтобы увидеть, кто именно редактирует файл в настоящий момент, откройте панель Чата с полным списком пользователей.

    -

    Если файл не просматривают или не редактируют другие пользователи, значок в строке состояния будет выглядеть следующим образом: Значок Управление правами доступа к документу, с его помощью можно непосредственно из документа управлять пользователями, имеющими доступ к файлу: приглашать новых пользователей, предоставляя им полный доступ или доступ только для чтения, или запрещать доступ к файлу для некоторых пользователей. Нажмите на этот значок для управления доступом к файлу; это можно сделать и в отсутствие других пользователей, которые просматривают или совместно редактируют документ в настоящий момент, и при наличии других пользователей, когда значок выглядит так: Значок Количество пользователей.

    -

    Как только один из пользователей сохранит свои изменения, нажав на значок Значок Сохранить, все остальные увидят в строке состояния примечание, которое сообщает о наличии обновлений. Чтобы сохранить внесенные вами изменения и сделать их доступными для других пользователей, а также получить обновления, сохраненные другими пользователями, нажмите на значок Значок Сохранить и получить обновления в левом верхнем углу верхней панели инструментов. Обновления будут подсвечены, чтобы Вы могли проверить, что конкретно изменилось.

    -

    Чат*

    -

    Этот инструмент можно использовать для оперативного согласования процесса совместного редактирования, например, для того, чтобы договориться с другими участниками, кто и что должен делать, какой абзац вы собираетесь сейчас отредактировать и т.д.

    -

    Сообщения в чате хранятся только в течение одной сессии. Для обсуждения содержания документа лучше использовать комментарии, которые хранятся до тех пор, пока вы не решите их удалить.

    -

    Чтобы войти в чат и оставить сообщение для других пользователей:

    -
      -
    1. нажмите на значок Значок Чат на левой боковой панели,
    2. -
    3. введите текст в соответствующем поле ниже,
    4. -
    5. нажмите кнопку Отправить.
    6. -
    -

    Все сообщения, оставленные пользователями, будут отображаться на панели слева. Если есть новые сообщения, которые Вы еще не прочитали, значок чата будет выглядеть так - Значок Чат.

    -

    Чтобы закрыть панель с сообщениями чата, нажмите на значок Значок Чат еще раз.

    -

    Комментарии*

    -

    Чтобы оставить комментарий:

    -
      -
    1. выделите объект, в котором, по Вашему мнению, содержится какая-то ошибка или проблема,
    2. -
    3. используйте значок Значок Комментарии на левой боковой панели, чтобы открыть панель Комментарии, и нажмите на ссылку Добавить комментарий к документу или
      - щелкните правой кнопкой мыши по выделенному объекту и выберите в меню команду Добавить комментарий, -
    4. -
    5. введите нужный текст,
    6. -
    7. нажмите кнопку Добавить.
    8. -
    -

    Комментарий появится на панели слева. Объект, который Вы прокомментировали, будет помечен значком Значок рядом с прокомментированным объектом. Для просмотра комментария щелкните по этому значку.

    -

    Любой другой пользователь может ответить на добавленный комментарий, чтобы дать ответ на вопросы или отчитаться о проделанной работе. Для этого надо нажать на ссылку Добавить ответ, расположенную под комментарием.

    -

    Вы можете управлять добавленными комментариями следующим образом:

    - -

    Новые комментарии, добавленные другими пользователями, станут видимыми только после того, как Вы нажмете на значок Значок Сохранить и получить обновления в левом верхнем углу верхней панели инструментов.

    -

    Чтобы закрыть панель с комментариями, нажмите на значок Значок Комментарии еще раз.

    -

    *доступно только для платных версий

    -
    +
    +

    Совместное редактирование

    +

    В редакторе презентаций можно выбрать один из двух доступных режимов совместного редактирования. Быстрый используется по умолчанию, в нем изменения, вносимые другими пользователями, отображаются в реальном времени. Строгий режим позволяет скрывать изменения, внесенные другими пользователями, до тех пор, пока вы не нажмете значок Сохранить Значок Сохранить, чтобы сохранить ваши изменения и принять изменения, внесенные другими. Режим можно выбрать в Дополнительных настройках.

    +

    Когда презентацию редактируют одновременно несколько пользователей в Строгом режиме, редактируемые объекты (автофигуры, текстовые объекты, таблицы, изображения, диаграммы) помечаются пунктирными линиями разных цветов. Объект, который редактируете Вы, окружен зеленой пунктирной линией. Красные пунктирные линии означают, что объекты редактируются другими пользователями. При наведении курсора мыши на один из редактируемых объектов отображается имя того пользователя, который в данный момент его редактирует. В Быстром режиме действия и имена участников совместного редактирования отображаются непосредственно в процессе редактирования.

    +

    Количество пользователей, которые в данный момент работают над текущей презентацией, отображается в левом нижнем углу в строке состояния - Значок Количество пользователей. Чтобы увидеть, кто именно редактирует файл в настоящий момент, откройте панель Чата с полным списком пользователей.

    +

    Если файл не просматривают или не редактируют другие пользователи, значок в строке состояния будет выглядеть следующим образом: Значок Управление правами доступа к документу, с его помощью можно непосредственно из документа управлять пользователями, имеющими доступ к файлу: приглашать новых пользователей, предоставляя им полный доступ или доступ только для чтения, или запрещать доступ к файлу для некоторых пользователей. Нажмите на этот значок для управления доступом к файлу; это можно сделать и в отсутствие других пользователей, которые просматривают или совместно редактируют документ в настоящий момент, и при наличии других пользователей, когда значок выглядит так: Значок Количество пользователей.

    +

    Как только один из пользователей сохранит свои изменения, нажав на значок Значок Сохранить, все остальные увидят в строке состояния примечание, которое сообщает о наличии обновлений. Чтобы сохранить внесенные вами изменения и сделать их доступными для других пользователей, а также получить обновления, сохраненные другими пользователями, нажмите на значок Значок Сохранить и получить обновления в левом верхнем углу верхней панели инструментов. Обновления будут подсвечены, чтобы Вы могли проверить, что конкретно изменилось.

    +

    Чат*

    +

    Этот инструмент можно использовать для оперативного согласования процесса совместного редактирования, например, для того, чтобы договориться с другими участниками, кто и что должен делать, какой абзац вы собираетесь сейчас отредактировать и т.д.

    +

    Сообщения в чате хранятся только в течение одной сессии. Для обсуждения содержания документа лучше использовать комментарии, которые хранятся до тех пор, пока вы не решите их удалить.

    +

    Чтобы войти в чат и оставить сообщение для других пользователей:

    +
      +
    1. нажмите на значок Значок Чат на левой боковой панели,
    2. +
    3. введите текст в соответствующем поле ниже,
    4. +
    5. нажмите кнопку Отправить.
    6. +
    +

    Все сообщения, оставленные пользователями, будут отображаться на панели слева. Если есть новые сообщения, которые Вы еще не прочитали, значок чата будет выглядеть так - Значок Чат.

    +

    Чтобы закрыть панель с сообщениями чата, нажмите на значок Значок Чат еще раз.

    +
    +

    Комментарии*

    +

    Чтобы оставить комментарий:

    +
      +
    1. выделите объект, в котором, по Вашему мнению, содержится какая-то ошибка или проблема,
    2. +
    3. + используйте значок Значок Комментарии на левой боковой панели, чтобы открыть панель Комментарии, и нажмите на ссылку Добавить комментарий к документу или
      + щелкните правой кнопкой мыши по выделенному объекту и выберите в меню команду Добавить комментарий, +
    4. +
    5. введите нужный текст,
    6. +
    7. нажмите кнопку Добавить.
    8. +
    +

    Комментарий появится на панели слева. Объект, который Вы прокомментировали, будет помечен значком Значок рядом с прокомментированным объектом. Для просмотра комментария щелкните по этому значку.

    +

    Любой другой пользователь может ответить на добавленный комментарий, чтобы дать ответ на вопросы или отчитаться о проделанной работе. Для этого надо нажать на ссылку Добавить ответ, расположенную под комментарием.

    +

    Вы можете управлять добавленными комментариями следующим образом:

    + +

    Новые комментарии, добавленные другими пользователями, станут видимыми только после того, как Вы нажмете на значок Значок Сохранить и получить обновления в левом верхнем углу верхней панели инструментов.

    +

    Чтобы закрыть панель с комментариями, нажмите на значок Значок Комментарии еще раз.

    +

    *доступно только для платных версий

    + \ No newline at end of file diff --git a/apps/presentationeditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm b/apps/presentationeditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm index 52fbc2925..6315dcf37 100644 --- a/apps/presentationeditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm +++ b/apps/presentationeditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm @@ -25,17 +25,17 @@ Открыть панель Поиск, чтобы начать поиск символа/слова/фразы в редактируемой презентации. - Открыть панель 'Комментарии'* + Открыть панель 'Комментарии'* Ctrl+Shift+H Открыть панель Комментарии, чтобы добавить свой комментарий или ответить на комментарии других пользователей. - Открыть поле комментария* + Открыть поле комментария* Alt+H Открыть поле ввода данных, в котором можно добавить текст комментария. - - Открыть панель 'Чат'* + + Открыть панель 'Чат'* Alt+Q Открыть панель Чат и отправить сообщение. @@ -370,7 +370,7 @@ Remove a paragraph indent from the left incrementally. --> -

    *доступно только для платных версий

    +

    *доступно только для платных версий

    \ No newline at end of file diff --git a/apps/presentationeditor/main/resources/help/ru/UsageInstructions/SavePrintDownload.htm b/apps/presentationeditor/main/resources/help/ru/UsageInstructions/SavePrintDownload.htm index 8ea45100a..afd60d1ae 100644 --- a/apps/presentationeditor/main/resources/help/ru/UsageInstructions/SavePrintDownload.htm +++ b/apps/presentationeditor/main/resources/help/ru/UsageInstructions/SavePrintDownload.htm @@ -9,10 +9,9 @@
    -

    Сохранение / печать / загрузка презентации

    +

    Сохранение / печать / загрузка презентации

    - По умолчанию онлайн-редактор презентаций автоматически сохраняет файл каждые 2 секунды, когда Вы работаете над ним, чтобы не допустить потери данных в случае непредвиденного закрытия программы. Если вы совместно редактируете файл в Быстром режиме, таймер запрашивает наличие изменений 25 раз в секунду и сохраняет их, если они были внесены. При совместном редактировании файла в Строгом режиме изменения автоматически сохраняются каждые 10 минут. При необходимости можно легко выбрать предпочтительный режим совместного редактирования или отключить функцию автоматического сохранения на странице Дополнительные параметры. -

    + По умолчанию онлайн-редактор презентаций автоматически сохраняет файл каждые 2 секунды, когда Вы работаете над ним, чтобы не допустить потери данных в случае непредвиденного закрытия программы. Если вы совместно редактируете файл в Быстром режиме, таймер запрашивает наличие изменений 25 раз в секунду и сохраняет их, если они были внесены. При совместном редактировании файла в Строгом режиме изменения автоматически сохраняются каждые 10 минут. При необходимости можно легко выбрать предпочтительный режим совместного редактирования или отключить функцию автоматического сохранения на странице Дополнительные параметры.

    Чтобы сохранить текущую презентацию вручную,

    -

    После этого на основе данной презентации будет сгенерирован файл PDF. Его можно открыть и распечатать или сохранить на жестком диске компьютера или съемном носителе, чтобы распечатать позже.

    -

    Чтобы скачать готовую презентацию и сохранить ее на жестком диске компьютера,

    -
      -
    1. щелкните по значку Файл Значок Файл на левой боковой панели,
    2. -
    3. выберите опцию Скачать как...,
    4. -
    5. выберите один из доступных форматов в зависимости от того, что вам нужно: PDF, PPTX.
    6. -
    -
    +
    +

    После этого на основе данной презентации будет сгенерирован файл PDF. Его можно открыть и распечатать или сохранить на жестком диске компьютера или съемном носителе, чтобы распечатать позже.

    +

    Чтобы скачать готовую презентацию и сохранить ее на жестком диске компьютера,

    +
      +
    1. щелкните по значку Файл Значок Файл на левой боковой панели,
    2. +
    3. выберите опцию Скачать как...,
    4. +
    5. выберите один из доступных форматов в зависимости от того, что вам нужно: PDF, PPTX.
    6. +
    +
    + \ No newline at end of file diff --git a/apps/presentationeditor/main/resources/help/ru/UsageInstructions/ViewPresentationInfo.htm b/apps/presentationeditor/main/resources/help/ru/UsageInstructions/ViewPresentationInfo.htm index a379c5b71..6f6811178 100644 --- a/apps/presentationeditor/main/resources/help/ru/UsageInstructions/ViewPresentationInfo.htm +++ b/apps/presentationeditor/main/resources/help/ru/UsageInstructions/ViewPresentationInfo.htm @@ -12,10 +12,12 @@

    Чтобы получить доступ к подробным сведениям о редактируемой презентации, щелкните по значку Файл Значок Файл на левой боковой панели и выберите опцию Сведения о презентации.

    Общие сведения

    Сведения о презентации включают название презентации, автора, размещение и дату создания.

    +

    Сведения о правах доступа

    Примечание: эта опция недоступна для пользователей с правами доступа Только чтение.

    Чтобы узнать, у кого есть права на просмотр и редактирование этой презентации, выберите опцию Права доступа... на левой боковой панели.

    Вы можете также изменить выбранные в настоящий момент права доступа, нажав на кнопку Изменить права доступа в разделе Люди, имеющие права.

    +

    Чтобы закрыть панель Файл и вернуться к редактированию презентации, выберите опцию Вернуться к презентации.

    diff --git a/apps/presentationeditor/main/resources/img/docformat.png b/apps/presentationeditor/main/resources/img/docformat.png index 634b0ccbc..77528805a 100644 Binary files a/apps/presentationeditor/main/resources/img/docformat.png and b/apps/presentationeditor/main/resources/img/docformat.png differ diff --git a/apps/presentationeditor/main/resources/img/docformat@2x.png b/apps/presentationeditor/main/resources/img/docformat@2x.png index 4cc6f62ac..5cab80522 100644 Binary files a/apps/presentationeditor/main/resources/img/docformat@2x.png and b/apps/presentationeditor/main/resources/img/docformat@2x.png differ diff --git a/apps/presentationeditor/main/resources/less/leftmenu.less b/apps/presentationeditor/main/resources/less/leftmenu.less index 15678684c..5300f2365 100644 --- a/apps/presentationeditor/main/resources/less/leftmenu.less +++ b/apps/presentationeditor/main/resources/less/leftmenu.less @@ -189,7 +189,7 @@ background-repeat: no-repeat; background-position: 0 0; - .background-ximage('@{app-image-path}/docformat.png', '@{app-image-path}/docformat@2x.png', 714px); + .background-ximage('@{app-image-path}/docformat.png', '@{app-image-path}/docformat@2x.png', 918px); .icon-document-format(@shift-x, @shift-y: 0) { background-position: @shift-x @shift-y; @@ -201,6 +201,7 @@ &.pptx {.icon-document-format(-102px);} &.pdf {.icon-document-format(-306px);} + &.odp {.icon-document-format(-816px);} } } } diff --git a/apps/presentationeditor/mobile/app-dev.js b/apps/presentationeditor/mobile/app-dev.js index 020c907f2..022594cbb 100644 --- a/apps/presentationeditor/mobile/app-dev.js +++ b/apps/presentationeditor/mobile/app-dev.js @@ -52,9 +52,6 @@ require.config({ text : '../vendor/requirejs-text/text', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jszip : '../vendor/jszip/jszip.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', api : 'api/documents/api', core : 'common/main/lib/core/application', extendes : 'common/mobile/utils/extendes', @@ -119,9 +116,6 @@ require([ 'analytics', 'gateway', 'locale', - 'jszip', - 'jsziputils', - 'jsrsasign', 'sockjs' ], function (Backbone, Framework7, Core) { Backbone.history.start(); diff --git a/apps/presentationeditor/mobile/app.js b/apps/presentationeditor/mobile/app.js index c4606d588..b7c7d32ee 100644 --- a/apps/presentationeditor/mobile/app.js +++ b/apps/presentationeditor/mobile/app.js @@ -52,9 +52,6 @@ require.config({ text : '../vendor/requirejs-text/text', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jszip : '../vendor/jszip/jszip.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', allfonts : '../../sdkjs/common/AllFonts', sdk : '../../sdkjs/slide/sdk-all-min', api : 'api/documents/api', @@ -104,10 +101,7 @@ require.config({ 'underscore', 'allfonts', 'xregexp', - 'sockjs', - 'jszip', - 'jsziputils', - 'jsrsasign' + 'sockjs' ] }, gateway: { diff --git a/apps/presentationeditor/mobile/app/controller/Main.js b/apps/presentationeditor/mobile/app/controller/Main.js index c7db0bd76..23c75f241 100644 --- a/apps/presentationeditor/mobile/app/controller/Main.js +++ b/apps/presentationeditor/mobile/app/controller/Main.js @@ -543,7 +543,7 @@ define([ me.permissions.review = (me.permissions.review === undefined) ? (me.permissions.edit !== false) : me.permissions.review; me.appOptions.canAnalytics = params.asc_getIsAnalyticsEnable(); - me.appOptions.canLicense = (licType === Asc.c_oLicenseResult.Success); + me.appOptions.canLicense = (licType === Asc.c_oLicenseResult.Success || licType === Asc.c_oLicenseResult.SuccessLimit); me.appOptions.isLightVersion = params.asc_getIsLight(); /** coauthoring begin **/ me.appOptions.canCoAuthoring = !me.appOptions.isLightVersion; @@ -572,7 +572,7 @@ define([ me._state.licenseWarning = (licType===Asc.c_oLicenseResult.Connections) && me.appOptions.canEdit && me.editorConfig.mode !== 'view'; - me.appOptions.canBranding = params.asc_getCanBranding() && (typeof me.editorConfig.customization == 'object'); + me.appOptions.canBranding = (licType === Asc.c_oLicenseResult.Success) && (typeof me.editorConfig.customization == 'object'); me.applyModeCommonElements(); me.applyModeEditorElements(); diff --git a/apps/presentationeditor/mobile/app/template/Settings.template b/apps/presentationeditor/mobile/app/template/Settings.template index b3eaa9fd0..d6d6d6ddd 100644 --- a/apps/presentationeditor/mobile/app/template/Settings.template +++ b/apps/presentationeditor/mobile/app/template/Settings.template @@ -196,6 +196,18 @@ +
  • + +
    +
    + +
    +
    +
    ODP
    +
    +
    +
    +
  • diff --git a/apps/presentationeditor/mobile/app/view/add/AddSlide.js b/apps/presentationeditor/mobile/app/view/add/AddSlide.js index 91b5bef04..b2984c9ed 100644 --- a/apps/presentationeditor/mobile/app/view/add/AddSlide.js +++ b/apps/presentationeditor/mobile/app/view/add/AddSlide.js @@ -123,7 +123,7 @@ define([ '<% }); %>', '', '<% }); %>' - ].join(''), { + ].join(''))({ layouts: layouts }); diff --git a/apps/presentationeditor/mobile/app/view/edit/EditChart.js b/apps/presentationeditor/mobile/app/view/edit/EditChart.js index 63cee3905..7508662d9 100644 --- a/apps/presentationeditor/mobile/app/view/edit/EditChart.js +++ b/apps/presentationeditor/mobile/app/view/edit/EditChart.js @@ -203,7 +203,7 @@ define([ '<% }); %>', '', '<% }); %>' - ].join(''), { + ].join(''))({ styles: styles }); diff --git a/apps/presentationeditor/mobile/app/view/edit/EditSlide.js b/apps/presentationeditor/mobile/app/view/edit/EditSlide.js index 38ed167df..3acc66e2b 100644 --- a/apps/presentationeditor/mobile/app/view/edit/EditSlide.js +++ b/apps/presentationeditor/mobile/app/view/edit/EditSlide.js @@ -235,7 +235,7 @@ define([ '<% }); %>', '', '<% }); %>' - ].join(''), { + ].join(''))({ layouts: layouts }); @@ -268,7 +268,7 @@ define([ '<% }); %>', '', '<% }); %>' - ].join(''), { + ].join(''))({ themes: themes }); @@ -291,7 +291,7 @@ define([ '', '', '<% }); %>' - ].join(''), { + ].join(''))({ android : Common.SharedSettings.get('android'), types: _arrCurrentEffectTypes }); diff --git a/apps/presentationeditor/mobile/app/view/edit/EditTable.js b/apps/presentationeditor/mobile/app/view/edit/EditTable.js index aa922581b..d0cf8c92a 100644 --- a/apps/presentationeditor/mobile/app/view/edit/EditTable.js +++ b/apps/presentationeditor/mobile/app/view/edit/EditTable.js @@ -138,7 +138,7 @@ define([ '', '<% }); %>', '' - ].join(''), { + ].join(''))({ styles: styles }); diff --git a/apps/presentationeditor/mobile/locale/de.json b/apps/presentationeditor/mobile/locale/de.json index 0e1449396..ee96429e8 100755 --- a/apps/presentationeditor/mobile/locale/de.json +++ b/apps/presentationeditor/mobile/locale/de.json @@ -28,9 +28,9 @@ "PE.Controllers.DocumentHolder.menuCut": "Ausschneiden", "PE.Controllers.DocumentHolder.menuDelete": "Löschen", "PE.Controllers.DocumentHolder.menuEdit": "Bearbeiten", + "PE.Controllers.DocumentHolder.menuMore": "Mehr", "PE.Controllers.DocumentHolder.menuOpenLink": "Link öffnen", "PE.Controllers.DocumentHolder.menuPaste": "Einfügen", - "PE.Controllers.DocumentHolder.menuMore": "More", "PE.Controllers.DocumentHolder.sheetCancel": "Abbrechen", "PE.Controllers.EditContainer.textChart": "Diagramm", "PE.Controllers.EditContainer.textHyperlink": "Hyperlink", @@ -67,6 +67,7 @@ "PE.Controllers.Main.downloadErrorText": "Herinterladen ist fehlgeschlagen.", "PE.Controllers.Main.downloadTextText": "Dokument wird heruntergeladen...", "PE.Controllers.Main.downloadTitleText": "Herunterladen des Dokuments", + "PE.Controllers.Main.errorBadImageUrl": "URL des Bildes ist falsch", "PE.Controllers.Main.errorCoAuthoringDisconnect": "Verbindung zum Server ist verloren gegangen. Sie können nicht mehr editieren.", "PE.Controllers.Main.errorConnectToServer": "Das Dokument konnte nicht gespeichert werden. Bitte überprüfen Sie die Verbindungseinstellungen, oder kontaktieren Sie Ihren Administrator.
    Wann Sie auf den Button \"OK\" klicken, werden Sie aufgefordert, das Dokument herunterzuladen.

    Mehr Information zur Verbindung des Dokument Servers finden Sie hier", "PE.Controllers.Main.errorDatabaseConnection": "Externer Fehler.
    Datenbank-Verbindungsfehler. Wenden Sie sich an den Support.", @@ -403,7 +404,7 @@ "PE.Views.EditText.textSmallCaps": "Kapitälchen", "PE.Views.EditText.textStrikethrough": "Durchgestrichen", "PE.Views.EditText.textSubscript": "Tiefgestellt", - "PE.Views.Search.textSearch": "Search", + "PE.Views.Search.textSearch": "Suche", "PE.Views.Settings.mniSlideStandard": "Standard (4:3)", "PE.Views.Settings.mniSlideWide": "Breitbildschirm (16:9)", "PE.Views.Settings.textAbout": "Über", diff --git a/apps/presentationeditor/mobile/locale/en.json b/apps/presentationeditor/mobile/locale/en.json index 9e5280b5e..e1b9446f8 100755 --- a/apps/presentationeditor/mobile/locale/en.json +++ b/apps/presentationeditor/mobile/locale/en.json @@ -28,9 +28,9 @@ "PE.Controllers.DocumentHolder.menuCut": "Cut", "PE.Controllers.DocumentHolder.menuDelete": "Delete", "PE.Controllers.DocumentHolder.menuEdit": "Edit", + "PE.Controllers.DocumentHolder.menuMore": "More", "PE.Controllers.DocumentHolder.menuOpenLink": "Open Link", "PE.Controllers.DocumentHolder.menuPaste": "Paste", - "PE.Controllers.DocumentHolder.menuMore": "More", "PE.Controllers.DocumentHolder.sheetCancel": "Cancel", "PE.Controllers.EditContainer.textChart": "Chart", "PE.Controllers.EditContainer.textHyperlink": "Hyperlink", @@ -67,6 +67,7 @@ "PE.Controllers.Main.downloadErrorText": "Download failed.", "PE.Controllers.Main.downloadTextText": "Downloading document...", "PE.Controllers.Main.downloadTitleText": "Downloading Document", + "PE.Controllers.Main.errorBadImageUrl": "Image URL is incorrect", "PE.Controllers.Main.errorCoAuthoringDisconnect": "Server connection lost. You can't edit anymore.", "PE.Controllers.Main.errorConnectToServer": " The document could not be saved. Please check connection settings or contact your administrator.
    When you click the 'OK' button, you will be prompted to download the document.

    Find more information about connecting Document Server here", "PE.Controllers.Main.errorDatabaseConnection": "External error.
    Database connection error. Please, contact support.", @@ -83,7 +84,6 @@ "PE.Controllers.Main.errorUsersExceed": "The number of users was exceeded", "PE.Controllers.Main.errorViewerDisconnect": "Connection is lost. You can still view the document,
    but will not be able to download or print until the connection is restored.", "PE.Controllers.Main.leavePageText": "You have unsaved changes in this document. Click 'Stay on this Page' to await the autosave of the document. Click 'Leave this Page' to discard all the unsaved changes.", - "PE.Controllers.Main.errorBadImageUrl": "Image URL is incorrect", "PE.Controllers.Main.loadFontsTextText": "Loading data...", "PE.Controllers.Main.loadFontsTitleText": "Loading Data", "PE.Controllers.Main.loadFontTextText": "Loading data...", diff --git a/apps/presentationeditor/mobile/locale/fr.json b/apps/presentationeditor/mobile/locale/fr.json index a2894967e..86c95856d 100755 --- a/apps/presentationeditor/mobile/locale/fr.json +++ b/apps/presentationeditor/mobile/locale/fr.json @@ -28,9 +28,9 @@ "PE.Controllers.DocumentHolder.menuCut": "Couper", "PE.Controllers.DocumentHolder.menuDelete": "Supprimer", "PE.Controllers.DocumentHolder.menuEdit": "Modifier", + "PE.Controllers.DocumentHolder.menuMore": "Plus", "PE.Controllers.DocumentHolder.menuOpenLink": "Ouvrir le lien", "PE.Controllers.DocumentHolder.menuPaste": "Coller", - "PE.Controllers.DocumentHolder.menuMore": "More", "PE.Controllers.DocumentHolder.sheetCancel": "Annuler", "PE.Controllers.EditContainer.textChart": "Graphique", "PE.Controllers.EditContainer.textHyperlink": "Lien hypertexte", @@ -67,8 +67,9 @@ "PE.Controllers.Main.downloadErrorText": "Échec du téléchargement.", "PE.Controllers.Main.downloadTextText": "Téléchargement du document...", "PE.Controllers.Main.downloadTitleText": "Téléchargement du document", + "PE.Controllers.Main.errorBadImageUrl": "L'URL de l'image est incorrecte", "PE.Controllers.Main.errorCoAuthoringDisconnect": "La connexion au serveur perdue. Désolé, vous ne pouvez plus modifier le document.", - "PE.Controllers.Main.errorConnectToServer": "Impossible d'enregistrer le document. Veuillez vérifier vos paramètres de connexion ou contactez l'administrateur.
    Lorsque vous cliquez sur le bouton 'OK', vous serez invité à télécharger le document.

    Pour en savoir plus sur la connexion de Document Server here", + "PE.Controllers.Main.errorConnectToServer": "Impossible d'enregistrer le document. Veuillez vérifier vos paramètres de connexion ou contactez l'administrateur.
    Lorsque vous cliquez sur le bouton 'OK', vous serez invité à télécharger le document.

    Trouvez plus d'informations sur la connexion de Document Server ici", "PE.Controllers.Main.errorDatabaseConnection": "Erreur externe.
    Erreur de connexion à la base de données.Contactez le support.", "PE.Controllers.Main.errorDataRange": "Plage de données incorrecte.", "PE.Controllers.Main.errorDefaultMessage": "Code d'erreur: %1", @@ -389,7 +390,7 @@ "PE.Views.EditText.textBack": "Retour", "PE.Views.EditText.textBefore": "Avant", "PE.Views.EditText.textBullets": "Puces", - "PE.Views.EditText.textDblStrikethrough": "Double biffés", + "PE.Views.EditText.textDblStrikethrough": "Barré double", "PE.Views.EditText.textDblSuperscript": "Exposant", "PE.Views.EditText.textFontColor": "Couleur de police", "PE.Views.EditText.textFontColors": "Couleurs de police", @@ -403,7 +404,7 @@ "PE.Views.EditText.textSmallCaps": "Petites majuscules", "PE.Views.EditText.textStrikethrough": "Barré", "PE.Views.EditText.textSubscript": "Indice", - "PE.Views.Search.textSearch": "Search", + "PE.Views.Search.textSearch": "Rechercher", "PE.Views.Settings.mniSlideStandard": "Standard (4:3)", "PE.Views.Settings.mniSlideWide": "Écran large (16:9)", "PE.Views.Settings.textAbout": "À propos du produit", diff --git a/apps/presentationeditor/mobile/locale/ru.json b/apps/presentationeditor/mobile/locale/ru.json index 2ff1b0f7f..62bdb8478 100755 --- a/apps/presentationeditor/mobile/locale/ru.json +++ b/apps/presentationeditor/mobile/locale/ru.json @@ -3,7 +3,7 @@ "Common.UI.ThemeColorPalette.textThemeColors": "Цвета темы", "Common.Utils.Metric.txtCm": "см", "Common.Utils.Metric.txtPt": "пт", - "PE.Controllers.AddContainer.textImage": "Картинка", + "PE.Controllers.AddContainer.textImage": "Изображение", "PE.Controllers.AddContainer.textLink": "Ссылка", "PE.Controllers.AddContainer.textShape": "Фигура", "PE.Controllers.AddContainer.textSlide": "Слайд", @@ -28,9 +28,9 @@ "PE.Controllers.DocumentHolder.menuCut": "Вырезать", "PE.Controllers.DocumentHolder.menuDelete": "Удалить", "PE.Controllers.DocumentHolder.menuEdit": "Редактировать", + "PE.Controllers.DocumentHolder.menuMore": "Ещё", "PE.Controllers.DocumentHolder.menuOpenLink": "Перейти по ссылке", "PE.Controllers.DocumentHolder.menuPaste": "Вставить", - "PE.Controllers.DocumentHolder.menuMore": "Еще", "PE.Controllers.DocumentHolder.sheetCancel": "Отмена", "PE.Controllers.EditContainer.textChart": "Диаграмма", "PE.Controllers.EditContainer.textHyperlink": "Гиперссылка", @@ -67,6 +67,7 @@ "PE.Controllers.Main.downloadErrorText": "Загрузка не удалась.", "PE.Controllers.Main.downloadTextText": "Загрузка документа...", "PE.Controllers.Main.downloadTitleText": "Загрузка документа", + "PE.Controllers.Main.errorBadImageUrl": "Неправильный URL-адрес изображения", "PE.Controllers.Main.errorCoAuthoringDisconnect": "Подключение к серверу прервано. Редактирование недоступно.", "PE.Controllers.Main.errorConnectToServer": "Не удается сохранить документ. Проверьте параметры подключения или обратитесь к вашему администратору.
    Когда вы нажмете на кнопку 'OK', вам будет предложено скачать документ.

    Дополнительную информацию о подключении Сервера документов можно найти здесь", "PE.Controllers.Main.errorDatabaseConnection": "Внешняя ошибка.
    Ошибка подключения к базе данных. Пожалуйста, обратитесь в службу технической поддержки.", @@ -403,10 +404,10 @@ "PE.Views.EditText.textSmallCaps": "Малые прописные", "PE.Views.EditText.textStrikethrough": "Зачеркнутый", "PE.Views.EditText.textSubscript": "Подстрочные", - "PE.Views.Search.textSearch": "Найти", + "PE.Views.Search.textSearch": "Поиск", "PE.Views.Settings.mniSlideStandard": "Стандартный (4:3)", "PE.Views.Settings.mniSlideWide": "Широкоэкранный (16:9)", - "PE.Views.Settings.textAbout": "О продукте", + "PE.Views.Settings.textAbout": "О программе", "PE.Views.Settings.textAddress": "адрес", "PE.Views.Settings.textAuthor": "Автор", "PE.Views.Settings.textBack": "Назад", diff --git a/apps/presentationeditor/mobile/resources/css/app-ios.css b/apps/presentationeditor/mobile/resources/css/app-ios.css index 9e36ca66d..69c5bfa43 100644 --- a/apps/presentationeditor/mobile/resources/css/app-ios.css +++ b/apps/presentationeditor/mobile/resources/css/app-ios.css @@ -6624,6 +6624,11 @@ i.icon.icon-format-pptx { height: 22px; background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%22-238%20240%2022%2022%22%20style%3D%22enable-background%3Anew%20-238%20240%2022%2022%3B%22%20xml%3Aspace%3D%22preserve%22%20fill%3D%22%23DF6737%22%3E%3Cg%3E%3Cpath%20id%3D%22XMLID_2_%22%20d%3D%22M-236%2C261h18v-17l-3.9791718-4H-236V261z%20M-219%2C248v12h-16v-19h12l4%2C4V248z%22%2F%3E%3C%2Fg%3E%3Cg%3E%3Cpath%20d%3D%22M-228.8226929%2C250.8646851c0.137085-0.060791%2C0.2341919-0.2302246%2C0.3131104-0.3647461%09c0.0792847-0.1351929%2C0.0861816-0.2935181%2C0.0861816-0.473938c0-0.2221069-0.0613403-0.4186401-0.1723633-0.5601807%09c-0.1102905-0.1405029-0.296875-0.2628784-0.4628906-0.2931519c-0.1210938-0.0233154-0.2396851-0.0012817-0.4535522%2C0.0090942%20l-0.3115234%2C0.010376v1.7925415h0.4523926C-228.9815063%2C250.9927368-228.9586182%2C250.9249878-228.8226929%2C250.8646851z%22%2F%3E%3Cpath%20d%3D%22M-233%2C256.1141357l7.333313%2C1.3553467V245L-233%2C246.3268433V256.1141357z%20M-230.8660889%2C248.2818604l1.4968872-0.0977783%20c0.6077881-0.0397339%2C0.9075317-0.0557251%2C1.1018066-0.0071411c0.3032227%2C0.0736084%2C0.637207%2C0.2349854%2C0.8483276%2C0.538147%09c0.2138672%2C0.3070679%2C0.3555908%2C0.7592163%2C0.3555908%2C1.262085c0%2C0.3878784-0.0623169%2C0.7130737-0.1862793%2C0.9741211%09c-0.1230469%2C0.2590942-0.2780151%2C0.4591064-0.4640503%2C0.6001587c-0.18396%2C0.1394653-0.3991089%2C0.2700195-0.5587769%2C0.3272705%20c-0.3145752%2C0.0774536-0.5286865%2C0.1747437-0.9802856%2C0.1508179h-0.5708618v1.9562378l-1.0423584-0.1081543V248.2818604z%22%2F%3E%3Cpath%20d%3D%22M-221.7266846%2C247H-225v9h3.2733154C-221.3253479%2C256-221%2C255.6746521-221%2C255.2733154v-7.5466309%09C-221%2C247.3253479-221.3253479%2C247-221.7266846%2C247z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); } +i.icon.icon-format-odp { + width: 22px; + height: 22px; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%22-286%20409.89%2022%2022%22%20style%3D%22enable-background%3Anew%20-286%20409.89%2022%2022%3B%22%20xml%3Aspace%3D%22preserve%22%20fill%3D%22%23DF6737%22%3E%3Cg%3E%3Cpath%20id%3D%22XMLID_2_%22%20d%3D%22M-284%2C430.89h18v-17l-3.979-4H-284V430.89z%20M-267%2C417.89v12h-16v-19h12l4%2C4V417.89z%22%2F%3E%3C%2Fg%3E%3Cpath%20d%3D%22M-281.655%2C419.661c0%2C0%2C1.036-1.266%2C3.529-1.381c2.493-0.115%2C3.107%2C0.499%2C3.107%2C0.499s1.072-0.873%2C2.634-0.984%20c1.473-0.106%2C2.244%2C0.134%2C3.657%2C0.639c-3.107-0.038-5.408%2C1.189-6.022%2C1.956C-276.17%2C419.163-278.817%2C418.817-281.655%2C419.661z%22%2F%3E%3Cpath%20d%3D%22M-278.663%2C415.979c1.458-0.767%2C2.864-0.857%2C5.063%2C0c1.189-0.652%2C3.414-0.307%2C4.68%2C0.269c-3.145-0.23-4.104%2C0.422-4.68%2C0.69%09C-274.367%2C416.056-276.86%2C415.595-278.663%2C415.979z%22%2F%3E%3Cg%3E%3Cpath%20d%3D%22M-281.721%2C425.011c0-0.465%2C0.07-0.855%2C0.209-1.172c0.104-0.232%2C0.246-0.441%2C0.425-0.626s0.376-0.322%2C0.59-0.411%20c0.285-0.121%2C0.613-0.181%2C0.985-0.181c0.673%2C0%2C1.212%2C0.208%2C1.616%2C0.626c0.404%2C0.418%2C0.606%2C0.998%2C0.606%2C1.742%20c0%2C0.737-0.2%2C1.314-0.601%2C1.731c-0.401%2C0.417-0.938%2C0.625-1.608%2C0.625c-0.679%2C0-1.22-0.207-1.621-0.622%09C-281.521%2C426.31-281.721%2C425.739-281.721%2C425.011z%20M-280.771%2C424.981c0%2C0.517%2C0.119%2C0.909%2C0.358%2C1.176%09c0.239%2C0.268%2C0.542%2C0.4%2C0.91%2C0.4c0.368%2C0%2C0.669-0.132%2C0.905-0.397c0.236-0.265%2C0.354-0.662%2C0.354-1.191%09c0-0.523-0.115-0.914-0.344-1.172s-0.535-0.387-0.915-0.387c-0.38%2C0-0.687%2C0.131-0.919%2C0.392%20C-280.654%2C424.062-280.771%2C424.455-280.771%2C424.981z%22%2F%3E%3Cpath%20d%3D%22M-276.573%2C422.699h1.686c0.38%2C0%2C0.67%2C0.029%2C0.87%2C0.088c0.267%2C0.079%2C0.498%2C0.219%2C0.689%2C0.421%20c0.191%2C0.201%2C0.336%2C0.448%2C0.436%2C0.74s0.15%2C0.651%2C0.15%2C1.079c0%2C0.377-0.047%2C0.7-0.141%2C0.973c-0.114%2C0.333-0.277%2C0.602-0.489%2C0.808%20c-0.16%2C0.155-0.376%2C0.277-0.648%2C0.364c-0.204%2C0.064-0.476%2C0.097-0.816%2C0.097h-1.736V422.699z%20M-275.65%2C423.472v3.026h0.689%20c0.257%2C0%2C0.443-0.015%2C0.558-0.044c0.149-0.037%2C0.274-0.101%2C0.373-0.19c0.099-0.089%2C0.18-0.236%2C0.241-0.44%20c0.062-0.205%2C0.094-0.483%2C0.094-0.837s-0.031-0.624-0.094-0.813c-0.062-0.189-0.149-0.337-0.262-0.442%20c-0.112-0.106-0.254-0.178-0.427-0.215c-0.129-0.029-0.381-0.044-0.757-0.044H-275.65z%22%2F%3E%3Cpath%20d%3D%22M-271.96%2C427.268v-4.569h1.479c0.562%2C0%2C0.927%2C0.023%2C1.098%2C0.069c0.262%2C0.068%2C0.48%2C0.218%2C0.657%2C0.447%20s0.265%2C0.525%2C0.265%2C0.89c0%2C0.28-0.051%2C0.516-0.152%2C0.707s-0.231%2C0.342-0.388%2C0.45c-0.157%2C0.109-0.316%2C0.182-0.479%2C0.217%09c-0.221%2C0.044-0.539%2C0.065-0.957%2C0.065h-0.602v1.724H-271.96z%20M-271.038%2C423.472v1.297h0.505c0.363%2C0%2C0.606-0.024%2C0.729-0.072%20c0.122-0.048%2C0.219-0.122%2C0.288-0.225c0.069-0.102%2C0.104-0.22%2C0.104-0.354c0-0.167-0.049-0.304-0.146-0.412%09c-0.098-0.107-0.222-0.176-0.371-0.202c-0.109-0.021-0.331-0.031-0.663-0.031H-271.038z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); +} #editor_sdk { position: absolute; left: 0; @@ -6734,4 +6739,3 @@ html.pixel-ratio-3 .numbers li { z-index: 10; -webkit-appearance: none; } -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL2ludHJvLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9ncmlkLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9fbWl4aW5zLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy92aWV3cy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvcGFnZXMubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3Rvb2xiYXJzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy90b29sYmFycy1wYWdlcy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3Mvc2VhcmNoYmFyLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9tZXNzYWdlYmFyLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9pY29ucy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvY29udGVudC1ibG9jay5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvbGlzdHMubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL2Zvcm1zLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9jYXJkcy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvbW9kYWxzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9wYW5lbHMubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3RhYnMubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL21lc3NhZ2VzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9zdGF0dXNiYXIubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3ByZWxvYWRlci5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvcHJvZ3Jlc3NiYXIubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3N3aXBlci5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvcGlja2VyLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9ub3RpZmljYXRpb25zLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9kaXNhYmxlZC5sZXNzIiwiYXBwLWlvcy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy9hcHBzL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvaW9zL19jb250YWluZXIubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvYXBwcy9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL2lvcy9fZGF0YXZpZXcubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvYXBwcy9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL2lvcy9fbGlzdHZpZXcubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvYXBwcy9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL2lvcy9fYnV0dG9uLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL2FwcHMvY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9pb3MvX2NvbnRleHRtZW51Lmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL2FwcHMvY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9pb3MvX2NvbG9yLXBhbGV0dGUubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvYXBwcy9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL2lvcy9fYWJvdXQubGVzcyIsImlvcy9fc2VhcmNoLmxlc3MiLCJpb3MvX2ljb25zLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL2FwcHMvY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9fbWl4aW5zLmxlc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBTTtBQUFNO0VBQ1Isa0JBQUE7RUFDQSxZQUFBO0VBQ0EsV0FBQTtFQUNBLGtCQUFBOztBQUVKO0VBQ0ksb0ZBQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsZ0JBQUE7RUFDQSxXQUFBO0VBQ0EsOEJBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBOztBQUVKO0VBQ0ksZ0JBQUE7O0FBR0osZ0JBQThCLG9CQUFtQixvQkFBNEI7RUFDekU7RUFBTTtFQUFNO0lBQ1IsYUFBQTs7O0FBR1IsZ0JBQThCLG9CQUFtQixvQkFBNEI7RUFDekU7RUFBTTtFQUFNO0lBQ1IsYUFBQTs7O0FBSVI7RUFDSSw2Q0FBQTtFQUNBLDJCQUFBOztBQUVKO0FBQUc7QUFBTztBQUFVO0VBQ2hCLFVB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c291cmNlc0NvbnRlbnQiOlsiQGltZ0Jhc2VVcmw6IFwiLi4vaW1nXCI7XG5odG1sLCBib2R5LCAuZnJhbWV3b3JrNy1yb290IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbn1cbmJvZHkge1xuICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBTRiBVSSBUZXh0LCBIZWx2ZXRpY2EgTmV1ZSwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBjb2xvcjogIzAwMDtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG4uZnJhbWV3b3JrNy1yb290IHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLy8gRml4IGZvciBpUGFkIGluIFNhZmFyaSBpbiBMYW5zY2FwZSBtb2RlXG5AbWVkaWEgYWxsIGFuZCAod2lkdGg6MTAyNHB4KSBhbmQgKGhlaWdodDo2OTFweCkgYW5kIChvcmllbnRhdGlvbjpsYW5kc2NhcGUpIHtcbiAgICBodG1sLCBib2R5LCAuZnJhbWV3b3JrNy1yb290IHtcbiAgICAgICAgaGVpZ2h0OiA2NzFweDtcbiAgICB9XG59XG5AbWVkaWEgYWxsIGFuZCAod2lkdGg6MTAyNHB4KSBhbmQgKGhlaWdodDo2OTJweCkgYW5kIChvcmllbnRhdGlvbjpsYW5kc2NhcGUpIHtcbiAgICBodG1sLCBib2R5LCAuZnJhbWV3b3JrNy1yb290ICB7XG4gICAgICAgIGhlaWdodDogNjcycHg7XG4gICAgfVxufVxuXG4qIHtcbiAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7XG4gICAgLXdlYmtpdC10b3VjaC1jYWxsb3V0Om5vbmU7XG59XG5hLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCB7XG4gICAgb3V0bGluZTogMDtcbn1cblxuYSB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGNvbG9yOiBAdGhlbWVDb2xvcjtcbn1cbnAge1xuICAgIG1hcmdpbjogMWVtIDA7XG59IiwiLyogPT09IEdyaWQgPT09ICovXG4ucm93IHtcbiAgICAuZmxleGJveCgpO1xuICAgIC5qdXN0aWZ5LWNvbnRlbnQoc3BhY2UtYmV0d2Vlbik7XG4gICAgLmZsZXgtd3JhcCh3cmFwKTtcbiAgICAuYWxpZ24taXRlbXMoZmxleC1zdGFydCk7XG4gICAgPiBbY2xhc3MqPVwiY29sLVwiXSB7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxufVxuQGNvbHM6IDUsIDEwLCAxNSwgMjAsIDI1LCAzMCwgMTAwLzMsIDM1LCA0MCwgNDUsIDUwLCA1NSwgNjAsIDY1LCAxMDAqKDIvMyksIDcwLCA3NSwgODAsIDg1LCA5MCwgOTUsIDEwMDtcbi5yb3cge1xuICAgIC5jb2wtYXV0byB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgICAuLShAaTogbGVuZ3RoKEBjb2xzKSkgd2hlbiAoQGkgPiAwKSB7XG4gICAgICAgIEBkaXZpZGVyOiBlKGV4dHJhY3QoQGNvbHMsIEBpKSk7XG4gICAgICAgIEBjbGFzc05hbWU6IGBNYXRoLmZsb29yKEB7ZGl2aWRlcn0pYDtcbiAgICAgICAgQG46IGAxMDAvcGFyc2VGbG9hdChAe2RpdmlkZXJ9KWA7XG4gICAgICAgIEBuLTE6IEBuIC0gMTtcbiAgICAgICAgLmNvbC1Ae2NsYXNzTmFtZX0ge1xuICAgICAgICAgICAgd2lkdGg6IH5cIkB7ZGl2aWRlcn0lXCI7XG4gICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTVweCpAe24tMX0pIC8gQHtufSlcIjsgICBcbiAgICAgICAgICAgIHdpZHRoOiB+XCJjYWxjKCgxMDAlIC0gMTVweCpAe24tMX0pIC8gQHtufSlcIjsgICBcbiAgICAgICAgfVxuICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAuY29sLUB7Y2xhc3NOYW1lfSB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IH5cIkB7ZGl2aWRlcn0lXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLi0oKEBpIC0gMSkpO1xuICAgIH0gLi07XG4gICAgLi0tKEBqOiAxKSB3aGVuIChAaiA8IGxlbmd0aChAY29scykpIHtcbiAgICAgICAgQGRpdmlkZXI6IGUoZXh0cmFjdChAY29scywgQGopKTtcbiAgICAgICAgQGNsYXNzTmFtZTogYE1hdGguZmxvb3IoQHtkaXZpZGVyfSlgO1xuICAgICAgICAuY29sLWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSksIC5jb2wtYXV0bzpudGgtbGFzdC1jaGlsZChAe2p9KSB+IC5jb2wtYXV0byB7XG4gICAgICAgICAgICBAai0xOiBAaiAtIDE7ICBcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlIC8gQGo7XG4gICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTVweCpAe2otMX0pIC8gQHtqfSlcIjsgICBcbiAgICAgICAgICAgIHdpZHRoOiB+XCJjYWxjKCgxMDAlIC0gMTVweCpAe2otMX0pIC8gQHtqfSlcIjsgICBcbiAgICAgICAgfVxuICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAuY29sLWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSksIC5jb2wtYXV0bzpudGgtbGFzdC1jaGlsZChAe2p9KSB+IC5jb2wtYXV0byB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCUgLyBAajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAuLS0oKEBqICsgMSkpO1xuICAgIH0gLi0tO1xuICAgIFxufVxuXG5AbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOjc2OHB4KSB7XG4gICAgLnJvdyB7XG4gICAgICAgIC4tKEBpOiBsZW5ndGgoQGNvbHMpKSB3aGVuIChAaSA+IDApIHtcbiAgICAgICAgICAgIEBkaXZpZGVyOiBlKGV4dHJhY3QoQGNvbHMsIEBpKSk7XG4gICAgICAgICAgICBAY2xhc3NOYW1lOiBgTWF0aC5mbG9vcihAe2RpdmlkZXJ9KWA7XG4gICAgICAgICAgICBAbjogYDEwMC9wYXJzZUZsb2F0KEB7ZGl2aWRlcn0pYDtcbiAgICAgICAgICAgIEBuLTE6IEBuIC0gMTtcbiAgICAgICAgICAgIC50YWJsZXQtQHtjbGFzc05hbWV9IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiQHtkaXZpZGVyfSVcIjtcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTVweCpAe24tMX0pIC8gQHtufSlcIjsgICBcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiY2FsYygoMTAwJSAtIDE1cHgqQHtuLTF9KSAvIEB7bn0pXCI7ICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAgICAgLnRhYmxldC1Ae2NsYXNzTmFtZX0ge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogflwiQHtkaXZpZGVyfSVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAuLSgoQGkgLSAxKSk7XG4gICAgICAgIH0gLi07XG4gICAgICAgIC4tLShAajogMSkgd2hlbiAoQGogPCBsZW5ndGgoQGNvbHMpKSB7XG4gICAgICAgICAgICAudGFibGV0LWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSksIC50YWJsZXQtYXV0bzpudGgtbGFzdC1jaGlsZChAe2p9KSB+IC5jb2wtYXV0byB7XG4gICAgICAgICAgICAgICAgQGotMTogQGogLSAxOyAgXG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCUgLyBAajtcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTVweCpAe2otMX0pIC8gQHtqfSlcIjsgICBcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiY2FsYygoMTAwJSAtIDE1cHgqQHtqLTF9KSAvIEB7an0pXCI7ICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAgICAgLnRhYmxldC1hdXRvOm50aC1sYXN0LWNoaWxkKEB7an0pLCAudGFibGV0LWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSkgfiAudGFibGV0LWF1dG8ge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJSAvIEBqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC4tLSgoQGogKyAxKSk7XG4gICAgICAgIH0gLi0tO1xuICAgIH1cblxufVxuIiwiLnRyYW5zaXRpb24oQGQpIHtcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IEBkO1xuICAgIHRyYW5zaXRpb24tZHVyYXRpb246IEBkO1xufVxuLmRlbGF5KEBkKSB7XG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiBAZDtcbiAgICB0cmFuc2l0aW9uLWRlbGF5OiBAZDtcbn1cbi50cmFuc2Zvcm0oQHQpIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogQHQ7XG4gICAgdHJhbnNmb3JtOiBAdDtcbn1cbi50cmFuc2Zvcm0tb3JpZ2luKEB0bykge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogQHRvO1xuICAgIHRyYW5zZm9ybS1vcmlnaW46IEB0bztcbn1cbi50cmFuc2xhdGUzZChAeDowLCBAeTowLCBAejowKSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKEB4LEB5LEB6KTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKEB4LEB5LEB6KTtcbn1cbi5hbmltYXRpb24oQGEpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogQGE7XG4gICAgYW5pbWF0aW9uOiBAYTtcbn1cbi5zY3JvbGxhYmxlKCl7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xufVxuLmZsZXhib3goKSB7XG4gICAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gICAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gICAgZGlzcGxheTogLXdlYmtpdC1mbGV4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG4uZmxleGJveC1pbmxpbmUoKSB7XG4gICAgZGlzcGxheTogLXdlYmtpdC1pbmxpbmUtYm94O1xuICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDtcbiAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4O1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuLmZsZXgtd3JhcChAZncpIHdoZW4gKEBmdyA9IG5vd3JhcCkge1xuICAgIC13ZWJraXQtYm94LWxpbmVzOiBzaW5nbGU7XG4gICAgLW1vei1ib3gtbGluZXM6IHNpbmdsZTtcbiAgICAtd2Via2l0LWZsZXgtd3JhcDogbm93cmFwO1xuICAgIC1tcy1mbGV4LXdyYXA6IG5vbmU7XG4gICAgLW1zLWZsZXgtd3JhcDogbm93cmFwO1xuICAgIGZsZXgtd3JhcDogbm93cmFwO1xufVxuLmZsZXgtd3JhcChAZncpIHdoZW4gKEBmdyA9IHdyYXApIHtcbiAgICAtd2Via2l0LWJveC1saW5lczogbXVsdGlwbGU7XG4gICAgLW1vei1ib3gtbGluZXM6IG11bHRpcGxlO1xuICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwO1xuICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7XG4gICAgZmxleC13cmFwOiB3cmFwO1xufVxuLmZsZXgtd3JhcChAZncpIHdoZW4gbm90IChAZncgPSB3cmFwKSBhbmQgbm90IChAZncgPSBub3dyYXApIHtcbiAgICAtd2Via2l0LWZsZXgtd3JhcDogQGZ3O1xuICAgIC1tcy1mbGV4LXdyYXA6IEBmdztcbiAgICBmbGV4LXdyYXA6IEBmdztcbn1cbi5mbGV4LXNocmluayhAZnMpIHtcbiAgICAtd2Via2l0LWZsZXgtc2hyaW5rOiBAZnM7XG4gICAgLW1zLWZsZXg6IDAgQGZzIGF1dG87XG4gICAgZmxleC1zaHJpbms6IEBmcztcbn1cbi5qdXN0aWZ5LWNvbnRlbnQoQGpjKSB3aGVuIChAamMgPSBmbGV4LXN0YXJ0KSB7XG4gICAgLXdlYmtpdC1ib3gtcGFjazogc3RhcnQ7XG4gICAgLW1zLWZsZXgtcGFjazogc3RhcnQ7XG4gICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xufVxuLmp1c3RpZnktY29udGVudChAamMpIHdoZW4gKEBqYyA9IGZsZXgtZW5kKSB7XG4gICAgLXdlYmtpdC1ib3gtcGFjazogZW5kO1xuICAgIC1tcy1mbGV4LXBhY2s6IGVuZDtcbiAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbn1cbi5qdXN0aWZ5LWNvbnRlbnQoQGpjKSB3aGVuIChAamMgPSBzcGFjZS1iZXR3ZWVuKSB7XG4gICAgLXdlYmtpdC1ib3gtcGFjazoganVzdGlmeTtcbiAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5O1xuICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcbn1cbi5qdXN0aWZ5LWNvbnRlbnQoQGpjKSB3aGVuIG5vdCAoQGpjID0gZmxleC1zdGFydCkgYW5kIG5vdCAoQGpjID0gZmxleC1lbmQpIGFuZCBub3QgKEBqYyA9IHNwYWNlLWJldHdlZW4pIHtcbiAgICAtd2Via2l0LWJveC1wYWNrOiBAamM7XG4gICAgLW1zLWZsZXgtcGFjazogQGpjO1xuICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBAamM7XG4gICAganVzdGlmeS1jb250ZW50OiBAamM7XG59XG4uYWxpZ24taXRlbXMoQGFpKSB3aGVuIChAYWkgPSBmbGV4LXN0YXJ0KSB7XG4gICAgLXdlYmtpdC1ib3gtYWxpZ246IHN0YXJ0O1xuICAgIC1tcy1mbGV4LWFsaWduOiBzdGFydDtcbiAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xufVxuLmFsaWduLWl0ZW1zKEBhaSkgd2hlbiAoQGFpID0gZmxleC1lbmQpIHtcbiAgICAtd2Via2l0LWJveC1hbGlnbjogZW5kO1xuICAgIC1tcy1mbGV4LWFsaWduOiBlbmQ7XG4gICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1lbmQ7XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xufVxuLmFsaWduLWl0ZW1zKEBhaSkgd2hlbiBub3QgKEBhaSA9IGZsZXgtc3RhcnQpIGFuZCBub3QgKEBhaSA9IGZsZXgtZW5kKSB7XG4gICAgLXdlYmtpdC1ib3gtYWxpZ246IEBhaTtcbiAgICAtbXMtZmxleC1hbGlnbjogQGFpO1xuICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IEBhaTtcbiAgICBhbGlnbi1pdGVtczogQGFpO1xufVxuLmFsaWduLWNvbnRlbnQoQGFpKSB7XG4gICAgLW1zLWZsZXgtbGluZS1wYWNrOiBAYWk7XG4gICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBAYWk7XG4gICAgYWxpZ24tY29udGVudDogQGFpO1xufVxuLmFsaWduLXNlbGYoQGFzKSB7XG4gICAgLW1zLWZsZXgtaXRlbS1hbGlnbjogQGFzO1xuICAgIC13ZWJraXQtYWxpZ24tc2VsZjogQGFzO1xuICAgIGFsaWduLXNlbGY6IEBhcztcbn1cbi5jbGVhcmZpeCgpIHtcbiAgICAmOmJlZm9yZSxcbiAgICAmOmFmdGVyIHtcbiAgICAgICAgY29udGVudDogXCIgXCI7XG4gICAgICAgIGRpc3BsYXk6IHRhYmxlO1xuICAgIH1cbiAgICAmOmFmdGVyIHtcbiAgICAgICAgY2xlYXI6IGJvdGg7XG4gICAgfVxufVxuLmhhaXJsaW5lKEBwb3NpdGlvbiwgQGNvbG9yKSB3aGVuIChAcG9zaXRpb24gPSB0b3ApIHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgYm90dG9tOiBhdXRvO1xuICAgICAgICByaWdodDogYXV0bztcbiAgICAgICAgaGVpZ2h0OiAxcHg7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB6LWluZGV4OiAxNTtcbiAgICAgICAgLnRyYW5zZm9ybS1vcmlnaW4oNTAlIDAlKTtcbiAgICAgICAgaHRtbC5waXhlbC1yYXRpby0yICYge1xuICAgICAgICAgICAgLnRyYW5zZm9ybShzY2FsZVkoMC41KSk7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbC5waXhlbC1yYXRpby0zICYge1xuICAgICAgICAgICAgLnRyYW5zZm9ybShzY2FsZVkoMC4zMykpO1xuICAgICAgICB9XG4gICAgfVxufVxuLmhhaXJsaW5lKEBwb3NpdGlvbiwgQGNvbG9yKSB3aGVuIChAcG9zaXRpb24gPSBsZWZ0KSB7XG4gICAgJjpiZWZvcmUge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGJvdHRvbTogYXV0bztcbiAgICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICAgIHdpZHRoOiAxcHg7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgei1pbmRleDogMTU7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKDAlIDUwJSk7XG4gICAgICAgIGh0bWwucGl4ZWwtcmF0aW8tMiAmIHtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGVYKDAuNSkpO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwucGl4ZWwtcmF0aW8tMyAmIHtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGVYKDAuMzMpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi5oYWlybGluZShAcG9zaXRpb24sIEBjb2xvcikgd2hlbiAoQHBvc2l0aW9uID0gYm90dG9tKSB7XG4gICAgJjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICAgIHRvcDogYXV0bztcbiAgICAgICAgaGVpZ2h0OiAxcHg7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB6LWluZGV4OiAxNTtcbiAgICAgICAgLnRyYW5zZm9ybS1vcmlnaW4oNTAlIDEwMCUpO1xuICAgICAgICBodG1sLnBpeGVsLXJhdGlvLTIgJiB7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlWSgwLjUpKTtcbiAgICAgICAgfVxuICAgICAgICBodG1sLnBpeGVsLXJhdGlvLTMgJiB7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlWSgwLjMzKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4uaGFpcmxpbmUoQHBvc2l0aW9uLCBAY29sb3IpIHdoZW4gKEBwb3NpdGlvbiA9IHJpZ2h0KSB7XG4gICAgJjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGxlZnQ6IGF1dG87XG4gICAgICAgIGJvdHRvbTogYXV0bztcbiAgICAgICAgd2lkdGg6IDFweDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB6LWluZGV4OiAxNTtcbiAgICAgICAgLnRyYW5zZm9ybS1vcmlnaW4oMTAwJSA1MCUpO1xuICAgICAgICBodG1sLnBpeGVsLXJhdGlvLTIgJiB7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlWCgwLjUpKTtcbiAgICAgICAgfVxuICAgICAgICBodG1sLnBpeGVsLXJhdGlvLTMgJiB7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlWCgwLjMzKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBGb3IgcmlnaHQgYW5kIGJvdHRvbVxuLmhhaXJsaW5lLXJlbW92ZShAcG9zaXRpb24pIHdoZW4gbm90IChAcG9zaXRpb24gPSBsZWZ0KSBhbmQgbm90IChAcG9zaXRpb24gPSB0b3ApIHtcbiAgICAmOmFmdGVyIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG59XG4vLyBGb3IgbGVmdCBhbmQgdG9wXG4uaGFpcmxpbmUtcmVtb3ZlKEBwb3NpdGlvbikgd2hlbiBub3QgKEBwb3NpdGlvbiA9IHJpZ2h0KSBhbmQgbm90IChAcG9zaXRpb24gPSBib3R0b20pIHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxufVxuLy8gRm9yIHJpZ2h0IGFuZCBib3R0b21cbi5oYWlybGluZS1jb2xvcihAcG9zaXRpb24sIEBjb2xvcikgd2hlbiBub3QgKEBwb3NpdGlvbiA9IGxlZnQpIGFuZCBub3QgKEBwb3NpdGlvbiA9IHRvcCkge1xuICAgICY6YWZ0ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgfVxufVxuLy8gRm9yIGxlZnQgYW5kIHRvcFxuLmhhaXJsaW5lLWNvbG9yKEBwb3NpdGlvbiwgQGNvbG9yKSB3aGVuIG5vdCAoQHBvc2l0aW9uID0gcmlnaHQpIGFuZCBub3QgKEBwb3NpdGlvbiA9IGJvdHRvbSkge1xuICAgICY6YmVmb3JlIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yO1xuICAgIH1cbn1cblxuLy8gRW5jb2RlZCBTVkcgQmFja2dyb3VuZFxuLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoQHN2Zykge1xuICAgIEB1cmw6IGBlbmNvZGVVUklDb21wb25lbnQoQHtzdmd9KWA7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsQHt1cmx9XCIpO1xufVxuXG4vLyBCYWNrZHJvcCBCbHVyXG4uYmFja2Ryb3AtYmx1cihAYmx1cikge1xuICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKEBibHVyKTtcbiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoQGJsdXIpO1xufVxuXG4vLyBQcmVzZXJ2ZTNEXG4ucHJlc2VydmUzZCgpIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgLW1vei10cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgIC1tcy10cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgIHRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG59XG5cbi8vIE5vIFNjcm9sbGJhclxuLm5vLXNjcm9sbGJhcigpIHtcbiAgICAmOjotd2Via2l0LXNjcm9sbGJhciB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgd2lkdGg6IDAgIWltcG9ydGFudDtcbiAgICAgICAgaGVpZ2h0OiAwICFpbXBvcnRhbnQ7XG4gICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgb3BhY2l0eTogMCAhaW1wb3J0YW50O1xuICAgIH1cbn1cbi8vIEJhcnMgSW5wdXRcbi5iYXJzLWlucHV0KCkge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgIC1tcy1hcHBlYXJhbmNlOiBub25lO1xuICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgIGNvbG9yOiMwMDA7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgcGFkZGluZzogMCA4cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cbi5uby1oYWlybGluZXMoKSB7XG4gICAgJi5uby1oYWlybGluZXMsICYubm8taGFpcmxpbmVzIHVsLCAmLm5vLWhhaXJsaW5lcyAuY29udGVudC1ibG9jay1pbm5lciB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUodG9wKTtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgIH1cbn1cbi5uby1oYWlybGluZXMtYmV0d2VlbigpIHtcbiAgICAmLm5vLWhhaXJsaW5lcy1iZXR3ZWVuIHtcbiAgICAgICAgLml0ZW0taW5uZXIsIC5saXN0LWJ1dHRvbiwgLml0ZW0tZGl2aWRlciwgLmxpc3QtZ3JvdXAtdGl0bGUsIC5saXN0LWdyb3VwLXRpdGxlIHtcbiAgICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKiA9PT0gVmlld3MgPT09ICovXG4udmlld3MsIC52aWV3IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHotaW5kZXg6IDUwMDA7XG59XG4udmlld3Mge1xuICAgIC5zY3JvbGxhYmxlKCk7XG59XG4udmlldyB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuIiwiLyogPT09IFBhZ2VzID09PSAqL1xuXG4vLyBQYWdlcyBhbmltYXRpb25zXG5AcGFnZUR1cmF0aW9uOiA0MDBtcztcblxuLnBhZ2VzIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYmFja2dyb3VuZDogIzAwMDtcbn1cbi5wYWdlIHtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYmFja2dyb3VuZDogI2VmZWZmNDtcbiAgICAudHJhbnNsYXRlM2QoMCwwLDApO1xuICAgICYuY2FjaGVkIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG59XG4ucGFnZS1vbi1sZWZ0IHtcbiAgICBvcGFjaXR5OiAwLjk7XG4gICAgLnRyYW5zbGF0ZTNkKC0yMCUpO1xufVxuLnBhZ2Utb24tY2VudGVyIHtcbiAgICAuc3dpcGViYWNrLXBhZ2Utc2hhZG93IHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG59XG4ucGFnZS1vbi1yaWdodCB7XG4gICAgLnRyYW5zbGF0ZTNkKDEwMCUpO1xuICAgIC5zd2lwZWJhY2stcGFnZS1zaGFkb3cge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgIH1cbn1cbi5wYWdlLWNvbnRlbnQge1xuICAgIC5zY3JvbGxhYmxlKCk7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDE7XG59XG5cbi8vIFBhZ2UgU2hhZG93XG4ucGFnZS1mYWtlLXNoYWRvdygpIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDEwMCU7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxNnB4O1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDAsMCwwLDApIDAlLCByZ2JhKDAsMCwwLDApIDEwJSwgcmdiYSgwLDAsMCwwLjAxKSA1MCUsIHJnYmEoMCwwLDAsMC4yKSAxMDAlKTtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwwLDAsMCkgMCUsIHJnYmEoMCwwLDAsMCkgMTAlLCByZ2JhKDAsMCwwLDAuMDEpIDUwJSwgcmdiYSgwLDAsMCwwLjIpIDEwMCUpO1xuICAgIHotaW5kZXg6IC0xO1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIGh0bWwuYW5kcm9pZCAmIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgLmFuaW1hdGlvbihub25lKTtcbiAgICB9XG59XG4uc3dpcGViYWNrLXBhZ2Utc2hhZG93IHtcbiAgICAucGFnZS1mYWtlLXNoYWRvdygpO1xufVxuXG5cbi8vQ2xhc3MgdGhhdCB3aWxsIHRyaWdnZXIgdHJhbnNpdGlvbiBkdXJpbmcgcGFnZSBjdXN0b20gdHJhbnNpdGlvbnMgKGxpa2Ugc3dpcGUtYmFjaylcbi5wYWdlLXRyYW5zaXRpb25pbmcge1xuICAgICYsIC5zd2lwZWJhY2stcGFnZS1zaGFkb3cge1xuICAgICAgICAudHJhbnNpdGlvbihAcGFnZUR1cmF0aW9uKTtcbiAgICB9XG59XG4ucGFnZS1mcm9tLXJpZ2h0LXRvLWNlbnRlciwgLnBhZ2UtZnJvbS1jZW50ZXItdG8tcmlnaHQge1xuICAgICY6YmVmb3JlIHtcbiAgICAgICAgLnBhZ2UtZmFrZS1zaGFkb3coKTtcbiAgICB9XG59XG4vLyBGcm9tL3RvIFJpZ2h0IFRvL2Zyb20gQ2VudGVyIGFuaW1hdGlvbnNcbi5wYWdlLWZyb20tcmlnaHQtdG8tY2VudGVyIHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICAgIC5hbmltYXRpb24ocGFnZUZyb21SaWdodFRvQ2VudGVyU2hhZG93IEBwYWdlRHVyYXRpb24gZm9yd2FyZHMpO1xuICAgIH1cbiAgICAuYW5pbWF0aW9uKHBhZ2VGcm9tUmlnaHRUb0NlbnRlciBAcGFnZUR1cmF0aW9uIGZvcndhcmRzKTtcbn1cbi5wYWdlLWZyb20tY2VudGVyLXRvLXJpZ2h0IHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICAgIC5hbmltYXRpb24ocGFnZUZyb21DZW50ZXJUb1JpZ2h0U2hhZG93IEBwYWdlRHVyYXRpb24gZm9yd2FyZHMpO1xuICAgIH1cbiAgICAuYW5pbWF0aW9uKHBhZ2VGcm9tQ2VudGVyVG9SaWdodCBAcGFnZUR1cmF0aW9uIGZvcndhcmRzKTtcbn1cbkAtd2Via2l0LWtleWZyYW1lcyBwYWdlRnJvbVJpZ2h0VG9DZW50ZXIge1xuICAgIGZyb20ge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTAwJSwwLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBwYWdlRnJvbVJpZ2h0VG9DZW50ZXIge1xuICAgIGZyb20ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsMCwwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgcGFnZUZyb21SaWdodFRvQ2VudGVyU2hhZG93IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcGFnZUZyb21SaWdodFRvQ2VudGVyU2hhZG93IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBwYWdlRnJvbUNlbnRlclRvUmlnaHQge1xuICAgIGZyb20ge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMDAlLDAsMCk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBwYWdlRnJvbUNlbnRlclRvUmlnaHQge1xuICAgIGZyb20ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsMCwwKTtcbiAgICB9XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgcGFnZUZyb21DZW50ZXJUb1JpZ2h0U2hhZG93IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcGFnZUZyb21DZW50ZXJUb1JpZ2h0U2hhZG93IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgIH1cbn1cblxuXG4vLyBGcm9tL3RvIENlbnRlciBUby9mcm9tIExlZnQgYW5pbWF0aW9uc1xuLnBhZ2UtZnJvbS1jZW50ZXItdG8tbGVmdCB7XG4gICAgLmFuaW1hdGlvbihwYWdlRnJvbUNlbnRlclRvTGVmdCBAcGFnZUR1cmF0aW9uIGZvcndhcmRzKTtcbn1cbi5wYWdlLWZyb20tbGVmdC10by1jZW50ZXIge1xuICAgIC5hbmltYXRpb24ocGFnZUZyb21MZWZ0VG9DZW50ZXIgQHBhZ2VEdXJhdGlvbiBmb3J3YXJkcyk7XG59XG5cbkAtd2Via2l0LWtleWZyYW1lcyBwYWdlRnJvbUNlbnRlclRvTGVmdCB7XG4gICAgZnJvbSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgb3BhY2l0eTogMC45O1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTIwJSwwLDApO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcGFnZUZyb21DZW50ZXJUb0xlZnQge1xuICAgIGZyb20ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAwLjk7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTIwJSwwLDApO1xuICAgIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBwYWdlRnJvbUxlZnRUb0NlbnRlciB7XG4gICAgZnJvbSB7XG4gICAgICAgIG9wYWNpdHk6IDAuOTtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0yMCUsMCwwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcGFnZUZyb21MZWZ0VG9DZW50ZXIge1xuICAgIGZyb20ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0yMCUsMCwwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59IiwiLyogPT09IFRvb2xiYXJzID09PSAqL1xuXG4vL1Rvb2xiYXIvTmF2YmFyXG5AdG9vbGJhckJnIDogI2Y3ZjdmODtcbkB0b29sYmFyQmdCbHVyZWQ6IHJnYmEoMjQ4LDI0OCwyNDksIDAuODUpO1xuQHRvb2xiYXJCb3JkZXJDb2xvcjogI2M0YzRjNDtcbkB0b29sYmFyTGlua3NDb2xvcjogQHRoZW1lQ29sb3I7XG5AdG9vbGJhclNpemU6IDQ0cHg7XG5cbi8vVGFiIGJhclxuQHRhYmJhckxhYmVsc1NpemU6IDUwcHg7XG5AdGFiYmFyTGlua3NDb2xvcjogIzkyOTI5MjtcbkB0YWJiYXJBY3RpdmVMaW5rc0NvbG9yOiBAdGhlbWVDb2xvcjtcbkB0YWJiYXJMYWJlbHNTaXplVGFibGV0OiA1NnB4O1xuXG4vLyBUb29sYmFycyBhbmltYXRpb25zXG5AdG9vbGJhckR1cmF0aW9uOiA0MDBtcztcblxuLm5hdmJhci1pbm5lciwgLnRvb2xiYXItaW5uZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgcGFkZGluZzogMCA4cHg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAuZmxleGJveCgpO1xuICAgIC5qdXN0aWZ5LWNvbnRlbnQoc3BhY2UtYmV0d2Vlbik7XG4gICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG59XG4ubmF2YmFyLWlubmVyLmNhY2hlZCB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5uYXZiYXIsIC50b29sYmFyIHtcbiAgICBoZWlnaHQ6IEB0b29sYmFyU2l6ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGZvbnQtc2l6ZTogMTdweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHotaW5kZXg6IDUwMDtcbiAgICAtd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgYiB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIGh0bWwuaW9zLWd0LTggJiB7XG4gICAgICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICB9XG4gICAgfVxufVxuLm5hdmJhciwgLnRvb2xiYXIsIC5zdWJuYXZiYXIge1xuICAgIGJhY2tncm91bmQ6IEB0b29sYmFyQmc7XG4gICAgYS5saW5rIHtcbiAgICAgICAgbGluZS1oZWlnaHQ6IEB0b29sYmFyU2l6ZTtcbiAgICAgICAgaGVpZ2h0OiBAdG9vbGJhclNpemU7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAuanVzdGlmeS1jb250ZW50KGZsZXgtc3RhcnQpO1xuICAgICAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZVooMHB4KSk7XG4gICAgICAgIGh0bWw6bm90KC53YXRjaC1hY3RpdmUtc3RhdGUpICY6YWN0aXZlLCAmLmFjdGl2ZS1zdGF0ZSB7XG4gICAgICAgICAgICBvcGFjaXR5OiAwLjM7XG4gICAgICAgICAgICAudHJhbnNpdGlvbigwbXMpO1xuICAgICAgICB9XG4gICAgICAgIGkrc3BhbiwgaStpLCBzcGFuK2ksIHNwYW4rc3BhbiB7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogN3B4O1xuICAgICAgICB9XG4gICAgfVxuICAgIGEuaWNvbi1vbmx5IHtcbiAgICAgICAgbWluLXdpZHRoOiBAdG9vbGJhclNpemU7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5qdXN0aWZ5LWNvbnRlbnQoY2VudGVyKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gICAgaS5pY29uIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxufVxuLm5hdmJhciB7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgLmhhaXJsaW5lKGJvdHRvbSwgQHRvb2xiYXJCb3JkZXJDb2xvcik7XG4gICAgJjphZnRlciB7XG4gICAgICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICB9XG4gICAgJi5uby1ib3JkZXIge1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgfVxuICAgIC5jZW50ZXIge1xuICAgICAgICBmb250LXNpemU6IDE3cHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIGh0bWwuaW9zLWd0LTggJiB7XG4gICAgICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICB9XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiBAdG9vbGJhclNpemU7XG4gICAgICAgIC5mbGV4LXNocmluaygxMCk7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5hbGlnbi1pdGVtcyhjZW50ZXIpO1xuICAgIH1cbiAgICAubGVmdCwgLnJpZ2h0IHtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDApO1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAuanVzdGlmeS1jb250ZW50KGZsZXgtc3RhcnQpO1xuICAgICAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAgICAgYSthIHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC5sZWZ0IHtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgIH1cbiAgICAucmlnaHQge1xuICAgICAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgICB9XG4gICAgLnJpZ2h0OmZpcnN0LWNoaWxkIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICByaWdodDogOHB4O1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgfVxuICAgIC5wb3B1cCAmIHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59XG4uc3VibmF2YmFyIHtcbiAgICBoZWlnaHQ6IEB0b29sYmFyU2l6ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDEwMCU7XG4gICAgbWFyZ2luLXRvcDogLTFweDtcbiAgICB6LWluZGV4OiAyMDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHBhZGRpbmc6IDAgOHB4O1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmp1c3RpZnktY29udGVudChzcGFjZS1iZXR3ZWVuKTtcbiAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAuaGFpcmxpbmUoYm90dG9tLCBAdG9vbGJhckJvcmRlckNvbG9yKTtcbiAgICAmLm5vLWJvcmRlciB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICB9XG4gICAgLm5hdmJhci5uby1ib3JkZXIgJiB7XG4gICAgICAgIG1hcmdpbi10b3A6IDA7XG4gICAgfVxuICAgIC5uYXZiYXItb24tbGVmdCAmLCAubmF2YmFyLW9uLXJpZ2h0ICZ7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cbiAgICAubmF2YmFyICYsIC5wYWdlICYge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICAgIC5wYWdlID4gJiB7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICB9XG4gICAgPiAuYnV0dG9ucy1yb3cge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gICAgLnNlYXJjaGJhciwgJi5zZWFyY2hiYXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICAgICYuc2VhcmNoYmFyLCAuc2VhcmNoYmFyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgICAuc2VhcmNoYmFyIHtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgIH1cbn1cbi50b29sYmFyIHtcbiAgICBsZWZ0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICAuaGFpcmxpbmUodG9wLCBAdG9vbGJhckJvcmRlckNvbG9yKTtcbiAgICAmLm5vLWJvcmRlciB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUodG9wKTtcbiAgICB9XG4gICAgYSB7XG4gICAgICAgIC5mbGV4LXNocmluaygxKTtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIH1cbn1cblxuLy8gVGFiYmFyXG4udGFiYmFyIHtcbiAgICBjb2xvcjogQHRhYmJhckxpbmtzQ29sb3I7XG4gICAgei1pbmRleDogNTAwMTtcbiAgICBhIHtcbiAgICAgICAgY29sb3I6IEB0YWJiYXJMaW5rc0NvbG9yO1xuICAgIH1cbiAgICBhLmFjdGl2ZSB7XG4gICAgICAgIGNvbG9yOiBAdGFiYmFyQWN0aXZlTGlua3NDb2xvcjtcbiAgICB9XG4gICAgYS5saW5rIHtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICB9XG4gICAgYS50YWItbGluaywgYS5saW5rIHtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgLmZsZXhib3goKTtcbiAgICAgICAgLmp1c3RpZnktY29udGVudChjZW50ZXIpO1xuICAgICAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgICAgIC13ZWJraXQtYm94LWZsZXg6IDE7XG4gICAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgICAgICAtbW96LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIH1cbiAgICBpLmljb24ge1xuICAgICAgICBoZWlnaHQ6IDMwcHg7XG4gICAgfVxufVxuLnRhYmJhci1sYWJlbHMge1xuICAgIGhlaWdodDogQHRhYmJhckxhYmVsc1NpemU7XG4gICAgYS50YWItbGluaywgYS5saW5rIHtcbiAgICAgICAgcGFkZGluZy10b3A6IDRweDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDRweDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAuanVzdGlmeS1jb250ZW50KHNwYWNlLWJldHdlZW4pO1xuICAgICAgICBpICsgc3BhbiB7XG4gICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3Bhbi50YWJiYXItbGFiZWwge1xuICAgICAgICBsaW5lLWhlaWdodDogMTtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTtcbiAgICAgICAgZm9udC1zaXplOiAxMHB4O1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cbn1cbi5zdWJuYXZiYXIsIC5uYXZiYXIge1xuICAgIGlucHV0W3R5cGU9XCJ0ZXh0XCJdLCBpbnB1dFt0eXBlPVwicGFzc3dvcmRcIl0sIGlucHV0W3R5cGU9XCJzZWFyY2hcIl0sIGlucHV0W3R5cGU9XCJlbWFpbFwiXSwgaW5wdXRbdHlwZT1cInRlbFwiXSwgaW5wdXRbdHlwZT1cInVybFwiXSB7XG4gICAgICAgIC5iYXJzLWlucHV0KCk7XG4gICAgfVxufVxuQG1lZGlhIGFsbCBhbmQgKG1pbi13aWR0aDo3NjhweCkge1xuICAgIC50YWJiYXIge1xuICAgICAgICAudG9vbGJhci1pbm5lciB7XG4gICAgICAgICAgICAuanVzdGlmeS1jb250ZW50KGNlbnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgYS50YWItbGluaywgYS5saW5rIHtcbiAgICAgICAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgICAgICAgbWluLXdpZHRoOiAxMDVweDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAudGFiYmFyLWxhYmVscyB7XG4gICAgICAgIGhlaWdodDogQHRhYmJhckxhYmVsc1NpemVUYWJsZXQ7XG4gICAgICAgIHNwYW4udGFiYmFyLWxhYmVsIHtcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLm5hdmJhci1mcm9tLXJpZ2h0LXRvLWNlbnRlciB7XG4gICAgLmxlZnQsIC5yaWdodCwgLmNlbnRlciwgLnN1Ym5hdmJhciwgLmZhZGluZyB7XG4gICAgICAgIC5hbmltYXRpb24obmF2YmFyRWxlbWVudEZhZGVJbiBAdG9vbGJhckR1cmF0aW9uIGZvcndhcmRzKTtcbiAgICB9XG4gICAgLnNsaWRpbmcge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgICBcbn1cbi5uYXZiYXItZnJvbS1jZW50ZXItdG8tcmlnaHQge1xuICAgIC5sZWZ0LCAucmlnaHQsIC5jZW50ZXIsIC5zdWJuYXZiYXIsIC5mYWRpbmcge1xuICAgICAgICAuYW5pbWF0aW9uKG5hdmJhckVsZW1lbnRGYWRlT3V0IEB0b29sYmFyRHVyYXRpb24gZm9yd2FyZHMpO1xuICAgIH1cbiAgICAuc2xpZGluZyB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxuICAgIC5zdWJuYXZiYXIuc2xpZGluZyB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIG5hdmJhckVsZW1lbnRGYWRlSW4ge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxufVxuQGtleWZyYW1lcyBuYXZiYXJFbGVtZW50RmFkZUluIHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn1cbi5uYXZiYXItZnJvbS1jZW50ZXItdG8tbGVmdCB7XG4gICAgLmxlZnQsIC5yaWdodCwgLmNlbnRlciwgLnN1Ym5hdmJhciwgLmZhZGluZyB7XG4gICAgICAgIC5hbmltYXRpb24obmF2YmFyRWxlbWVudEZhZGVPdXQgQHRvb2xiYXJEdXJhdGlvbiBmb3J3YXJkcyk7XG4gICAgfVxuICAgIC5zbGlkaW5nIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gICAgLnN1Ym5hdmJhci5zbGlkaW5nIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG59XG4ubmF2YmFyLWZyb20tbGVmdC10by1jZW50ZXIge1xuICAgIC5sZWZ0LCAucmlnaHQsIC5jZW50ZXIsIC5zdWJuYXZiYXIsIC5mYWRpbmcge1xuICAgICAgICAuYW5pbWF0aW9uKG5hdmJhckVsZW1lbnRGYWRlSW4gQHRvb2xiYXJEdXJhdGlvbiBmb3J3YXJkcyk7XG4gICAgfVxuICAgIC5zbGlkaW5nIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG59XG4ubmF2YmFyLW9uLWxlZnQge1xuICAgIC5sZWZ0LCAucmlnaHQsIC5jZW50ZXIsIC5zdWJuYXZiYXIsIC5mYWRpbmcge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgIH1cbiAgICAuc2xpZGluZyB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxuICAgIC5zdWJuYXZiYXIuc2xpZGluZyB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIC50cmFuc2xhdGUzZCgtMTAwJSwwLDApO1xuICAgIH1cbn1cbi5uYXZiYXItb24tcmlnaHQge1xuICAgIC5sZWZ0LCAucmlnaHQsIC5jZW50ZXIsIC5zdWJuYXZiYXIsIC5mYWRpbmcge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgIH1cbiAgICAuc2xpZGluZyB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxuICAgIC5zdWJuYXZiYXIuc2xpZGluZyB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgxMDAlLDAsMCk7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIG5hdmJhckVsZW1lbnRGYWRlT3V0IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgbmF2YmFyRWxlbWVudEZhZGVPdXQge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxufVxuLm5hdmJhci1mcm9tLXJpZ2h0LXRvLWNlbnRlciwgLm5hdmJhci1mcm9tLWNlbnRlci10by1yaWdodCwgLm5hdmJhci1mcm9tLWNlbnRlci10by1sZWZ0LCAubmF2YmFyLWZyb20tbGVmdC10by1jZW50ZXIge1xuICAgIC5sZWZ0LnNsaWRpbmcgLmJhY2subGluayAuaWNvbiB7XG4gICAgICAgIC50cmFuc2l0aW9uKEB0b29sYmFyRHVyYXRpb24pO1xuICAgIH1cbiAgICAuc2xpZGluZyB7XG4gICAgICAgIC50cmFuc2l0aW9uKEB0b29sYmFyRHVyYXRpb24pO1xuICAgICAgICAuYW5pbWF0aW9uKG5vbmUpO1xuICAgIH1cbn0iLCIvKiA9PT0gUmVsYXRpb24gYmV0d2VlbiB0b29sYmFyL25hdmJhciB0eXBlcyBhbmQgcGFnZXMgPT09ICovXG4ucGFnZSwgLnZpZXcsIC52aWV3c3tcbiAgICA+Lm5hdmJhciwgPi50b29sYmFyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbn1cbi5zdWJuYXZiYXIgfiAucGFnZS1jb250ZW50IHtcbiAgICBwYWRkaW5nLXRvcDogQHRvb2xiYXJTaXplO1xufVxuLm5hdmJhci10aHJvdWdoLCAubmF2YmFyLWZpeGVkIHtcbiAgICAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy10b3A6IEB0b29sYmFyU2l6ZTtcbiAgICB9XG4gICAgLndpdGgtc3VibmF2YmFyIC5wYWdlLWNvbnRlbnQsIC5wYWdlLWNvbnRlbnQud2l0aC1zdWJuYXZiYXIsIC5zdWJuYXZiYXIgfiAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy10b3A6IEB0b29sYmFyU2l6ZSAqIDI7XG4gICAgfVxuICAgIC5wYWdlIC5zdWJuYXZiYXIsICYucGFnZSAuc3VibmF2YmFyIHtcbiAgICAgICAgdG9wOiBAdG9vbGJhclNpemU7XG4gICAgfVxufVxuXG4udG9vbGJhci10aHJvdWdoLCAudG9vbGJhci1maXhlZCwgLnRhYmJhci10aHJvdWdoLCAudGFiYmFyLWZpeGVkIHtcbiAgICAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IEB0b29sYmFyU2l6ZTtcbiAgICB9XG59XG4udGFiYmFyLWxhYmVscy1maXhlZCwgLnRhYmJhci1sYWJlbHMtdGhyb3VnaCB7XG4gICAgLnBhZ2UtY29udGVudCB7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiBAdGFiYmFyTGFiZWxzU2l6ZTtcbiAgICAgICAgQG1lZGlhIGFsbCBhbmQgKG1pbi13aWR0aDo3NjhweCkge1xuICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IEB0YWJiYXJMYWJlbHNTaXplVGFibGV0O1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gUGFnZSBIaWRkZW4gTmF2YmFyXG4ubmF2YmFyIHtcbiAgICAmLm5hdmJhci1oaWRpbmcge1xuICAgICAgICAudHJhbnNpdGlvbig0MDBtcyk7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgICAgICYgfiAucGFnZS1jb250ZW50LCAmIH4gLnBhZ2VzLCAmIH4gLnBhZ2Uge1xuICAgICAgICAgICAgLmxpc3QtZ3JvdXAtdGl0bGUge1xuICAgICAgICAgICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC5zdWJuYXZiYXIge1xuICAgICAgICAgICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAmLm5hdmJhci1oaWRkZW4ge1xuICAgICAgICAudHJhbnNpdGlvbig0MDBtcyk7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLC0xMDAlLDApO1xuICAgICAgICAmIH4gLnBhZ2UtY29udGVudCwgJiB+IC5wYWdlcywgJiB+IC5wYWdlIHtcbiAgICAgICAgICAgIC5saXN0LWdyb3VwLXRpdGxlIHtcbiAgICAgICAgICAgICAgICAudHJhbnNpdGlvbig0MDBtcyk7XG4gICAgICAgICAgICAgICAgdG9wOi1AdG9vbGJhclNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAuc3VibmF2YmFyIHtcbiAgICAgICAgICAgICAgICAudHJhbnNsYXRlM2QoMCwtMTAwJSwwKTtcbiAgICAgICAgICAgICAgICAudHJhbnNpdGlvbig0MDBtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4ucGFnZS5uby1uYXZiYXIge1xuICAgIC5wYWdlLWNvbnRlbnQge1xuICAgICAgICBwYWRkaW5nLXRvcDogMDtcbiAgICB9XG4gICAgJi53aXRoLXN1Ym5hdmJhciAucGFnZS1jb250ZW50LCAud2l0aC1zdWJuYXZiYXIgJiAucGFnZS1jb250ZW50LCAucGFnZS1jb250ZW50LndpdGgtc3VibmF2YmFyIHtcbiAgICAgICAgcGFkZGluZy10b3A6IEB0b29sYmFyU2l6ZTtcbiAgICB9XG59XG4vLyBQYWdlIEhpZGRlbiBUb29sYmFyXG4udG9vbGJhciwgLnRhYmJhciB7XG4gICAgJi50b29sYmFyLWhpZGluZywgJi50YWJiYXItaGlkaW5nIHtcbiAgICAgICAgLnRyYW5zaXRpb24oNDAwbXMpO1xuICAgICAgICAudHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbiAgICAmLnRvb2xiYXItaGlkZGVuLCAmLnRhYmJhci1oaWRkZW4ge1xuICAgICAgICAudHJhbnNpdGlvbig0MDBtcyk7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDEwMCUsMCk7XG4gICAgfVxufVxuLnBhZ2Uubm8tdG9vbGJhciAucGFnZS1jb250ZW50LCAucGFnZS5uby10YWJiYXIgLnBhZ2UtY29udGVudCB7XG4gICAgcGFkZGluZy1ib3R0b206IDA7XG59XG4iLCIvKiA9PT0gU2VhcmNoIEJhciA9PT0gKi9cbkBzZWFyY2hiYXJCZzogI2M5YzljZTtcbkBzZWFyY2hiYXJCb3JkZXJDb2xvcjogI2I0YjRiNDtcbkBzZWFyY2hiYXJTaXplOiA0NHB4O1xuLnNlYXJjaGJhciB7XG4gICAgaGVpZ2h0OiBAc2VhcmNoYmFyU2l6ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiBAc2VhcmNoYmFyQmc7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAuaGFpcmxpbmUoYm90dG9tLCBAc2VhcmNoYmFyQm9yZGVyQ29sb3IpO1xuICAgIHBhZGRpbmc6IDAgOHB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgLnNlYXJjaGJhci1pbnB1dCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDI4cHg7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDEpO1xuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwic2VhcmNoXCJdIHtcbiAgICAgICAgLmJhcnMtaW5wdXQoKTtcbiAgICAgICAgcGFkZGluZzogMCAyOHB4O1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDhweCBjZW50ZXI7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxMyAxMycgZW5hYmxlLWJhY2tncm91bmQ9J25ldyAwIDAgMTMgMTMnPjxnPjxwYXRoIGZpbGw9JyM5MzkzOTgnIGQ9J001LDFjMi4yLDAsNCwxLjgsNCw0UzcuMiw5LDUsOVMxLDcuMiwxLDVTMi44LDEsNSwxIE01LDBDMi4yLDAsMCwyLjIsMCw1czIuMiw1LDUsNXM1LTIuMiw1LTVTNy44LDAsNSwwIEw1LDB6Jy8+PC9nPjxsaW5lIHN0cm9rZT0nIzkzOTM5OCcgc3Ryb2tlLW1pdGVybGltaXQ9JzEwJyB4MT0nMTIuNicgeTE9JzEyLjYnIHgyPSc4LjInIHkyPSc4LjInLz48L3N2Zz5cIik7XG4gICAgICAgIC13ZWJraXQtYmFja2dyb3VuZC1zaXplOiAxM3B4IDEzcHg7XG4gICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTNweCAxM3B4O1xuICAgICAgICAmOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgICAgICAgICAgIGNvbG9yOiAjOTM5Mzk4O1xuICAgICAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgfVxuICAgICAgICAmOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uIHtcbiAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTpub25lO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5zZWFyY2hiYXItY2xlYXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHdpZHRoOiAyOHB4O1xuICAgICAgICBoZWlnaHQ6IDI4cHg7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOm5vbmU7XG4gICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoXCI8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDI4IDI4Jz48Y2lyY2xlIGN4PScxNCcgY3k9JzE0JyByPScxNCcgZmlsbD0nIzhlOGU5MycvPjxsaW5lIHN0cm9rZT0nI2ZmZmZmZicgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbWl0ZXJsaW1pdD0nMTAnIHgxPSc4JyB5MT0nOCcgeDI9JzIwJyB5Mj0nMjAnLz48bGluZSBmaWxsPSdub25lJyBzdHJva2U9JyNmZmZmZmYnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLW1pdGVybGltaXQ9JzEwJyB4MT0nMjAnIHkxPSc4JyB4Mj0nOCcgeTI9JzIwJy8+PC9zdmc+XCIpO1xuICAgICAgICAtd2Via2l0LWJhY2tncm91bmQtc2l6ZTogMTRweCAxNHB4O1xuICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDE0cHggMTRweDtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuICAgIC5zZWFyY2hiYXItY2FuY2VsIHtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICAudHJhbnNsYXRlM2QoMCwwLDApO1xuICAgICAgICBmb250LXNpemU6IDE3cHg7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDApO1xuICAgICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6bm9uZTtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgJi5zZWFyY2hiYXItYWN0aXZlIHtcbiAgICAgICAgLnNlYXJjaGJhci1jYW5jZWwge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgICAgICAgIGh0bWw6bm90KC53YXRjaC1hY3RpdmUtc3RhdGUpICY6YWN0aXZlLCAmLmFjdGl2ZS1zdGF0ZSB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMC4zO1xuICAgICAgICAgICAgICAgIC50cmFuc2l0aW9uKDBtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5zZWFyY2hiYXItbm90LWVtcHR5IHtcbiAgICAgICAgLnNlYXJjaGJhci1jbGVhciB7XG4gICAgICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIH1cbiAgICB9XG59XG4uc2VhcmNoYmFyLW92ZXJsYXkge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgei1pbmRleDogMTAwO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgcG9pbnRlci1ldmVudHM6bm9uZTtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNCk7XG4gICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgJi5zZWFyY2hiYXItb3ZlcmxheS1hY3RpdmUge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICB9XG59XG4uc2VhcmNoYmFyLW5vdC1mb3VuZCB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5oaWRkZW4tYnktc2VhcmNoYmFyLCAubGlzdC1ibG9jayAuaGlkZGVuLWJ5LXNlYXJjaGJhciwgLmxpc3QtYmxvY2sgbGkuaGlkZGVuLWJ5LXNlYXJjaGJhciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5wYWdlID4gLnNlYXJjaGJhciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHotaW5kZXg6IDIwMDtcbiAgICAmIH4gLnBhZ2UtY29udGVudCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiBAc2VhcmNoYmFyU2l6ZTtcbiAgICB9XG59XG4ubmF2YmFyLWZpeGVkLCAubmF2YmFyLXRocm91Z2gge1xuICAgIC5wYWdlID4gLnNlYXJjaGJhciwgPiAuc2VhcmNoYmFyIHtcbiAgICAgICAgdG9wOiBAdG9vbGJhclNpemU7XG4gICAgICAgICYgfiAucGFnZS1jb250ZW50IHtcbiAgICAgICAgICAgIHBhZGRpbmctdG9wOiBAc2VhcmNoYmFyU2l6ZSArIEB0b29sYmFyU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKiA9PT0gTWVzc2FnZSBCYXIgPT09ICovXG4ubWVzc2FnZWJhciB7XG4gICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAudHJhbnNpdGlvbigwbXMpO1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgLmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgIHRleHRhcmVhIHtcbiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tcy1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2M4YzhjZDtcbiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTdweDtcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBhZGRpbmc6IDZweCAxNXB4O1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDM0cHg7XG4gICAgICAgIGNvbG9yOiAjMDAwO1xuICAgICAgICBmb250LXNpemU6IDE3cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICAgICAgcmVzaXplOm5vbmU7XG4gICAgICAgIC5mbGV4LXNocmluaygxKTtcbiAgICB9XG4gICAgLmxpbmsge1xuICAgICAgICAuYWxpZ24tc2VsZihmbGV4LWVuZCk7XG4gICAgfVxuICAgIC5saW5rLmljb24tb25seTpmaXJzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAtNnB4O1xuICAgIH1cbiAgICAubGluazpub3QoLmljb24tb25seSkgKyB0ZXh0YXJlYSB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7XG4gICAgfVxuICAgIHRleHRhcmVhICsgLmxpbmsge1xuICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgIH1cbiAgICAubGluayB7XG4gICAgICAgIC5mbGV4LXNocmluaygwKTtcbiAgICB9XG4gICAgfiAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IEB0b29sYmFyU2l6ZTtcbiAgICB9XG4gICAgLnBhZ2Uubm8tdG9vbGJhciAmIH4ucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IEB0b29sYmFyU2l6ZTtcbiAgICB9XG4gICAgLmhpZGRlbi10b29sYmFyICYge1xuICAgICAgICAudHJhbnNsYXRlM2QoMCwwLDApO1xuICAgICAgICAudHJhbnNpdGlvbigwbXMpO1xuICAgIH1cbn1cbiIsIi8qID09PSBJY29ucyA9PT0gKi9cbmkuaWNvbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlIGF1dG87XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgZm9udC1zdHlsZTogbm9ybWFsO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAmLmljb24tYmFjayB7XG4gICAgICAgIHdpZHRoOiAxMnB4O1xuICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxMiAyMCc+PHBhdGggZD0nTTEwLDBsMiwybC04LDhsOCw4bC0yLDJMMCwxMEwxMCwweicgZmlsbD0nQHt0aGVtZUNvbG9yfScvPjwvc3ZnPlwiKTtcbiAgICB9XG4gICAgJi5pY29uLWZvcndhcmQge1xuICAgICAgICB3aWR0aDogMTJweDtcbiAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMTIgMjAnPjxwYXRoIGQ9J00yLDIwbC0yLTJsOC04TDAsMmwyLTJsMTAsMTBMMiwyMHonIGZpbGw9J0B7dGhlbWVDb2xvcn0nLz48L3N2Zz5cIik7XG4gICAgfVxuICAgICYuaWNvbi1iYXJzIHtcbiAgICAgICAgd2lkdGg6IDIxcHg7XG4gICAgICAgIGhlaWdodDogMTRweDtcbiAgICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoXCI8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDIxIDE0Jz48cGF0aCBmaWxsPSdAe3RoZW1lQ29sb3J9JyBkPSdNMCwwaDJ2MkgwVjB6IE00LDBoMTd2MUg0VjB6IE0wLDZoMnYySDBWNnogTTQsNmgxN3YxSDRWNnogTTAsMTJoMnYySDBWMTJ6IE00LDEyaDE3djFINFYxMnonLz48L3N2Zz5cIik7XG4gICAgICAgIEBtZWRpYSAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwgKG1pbi1yZXNvbHV0aW9uOiAyZGRweCkge1xuICAgICAgICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoXCI8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDQyIDI2Jz48cGF0aCBmaWxsPSdAe3RoZW1lQ29sb3J9JyBkPSdNMCwwaDR2NEgwVjB6IE04LDFoMzR2Mkg4VjF6IE0wLDExaDR2NEgwVjExeiBNOCwxMmgzNHYySDhWMTJ6IE0wLDIyaDR2NEgwVjIyeiBNOCwyM2gzNHYySDhWMjN6Jy8+PC9zdmc+XCIpO1xuICAgICAgICAgICAgaGVpZ2h0OiAxM3B4O1xuICAgICAgICB9XG4gICAgfVxuICAgICYuaWNvbi1jYW1lcmEge1xuICAgICAgICB3aWR0aDogMjVweDtcbiAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4PScwcHgnIHk9JzBweCcgdmlld0JveD0nMCAwIDI1IDIwJz48cGF0aCBmaWxsPScjOEM4RDkyJyBkPSdNMTMuMyw1LjVjLTIuNywwLTUsMi4yLTUsNXMyLjIsNSw1LDVjMi43LDAsNS0yLjIsNS01UzE2LDUuNSwxMy4zLDUuNXonLz48cGF0aCBmaWxsPScjOEM4RDkyJyBkPSdNMjIuOCwxLjhoLTMuM2MtMC4yLTEuMy0xLTEuOC0yLTEuOEg4LjFjLTEsMC0xLjgsMC40LTIsMS44SDIuOEMxLjQsMS44LDAsMi44LDAsNC4ydjEyLjYgYzAsMS40LDEuNCwyLjUsMi44LDIuNWgyMGMxLjQsMCwyLjItMS4xLDIuMi0yLjVWNC4yQzI1LDIuOCwyNC4yLDEuOCwyMi44LDEuOHogTTMuNSw2LjRDMi42LDYuNCwyLDUuOCwyLDVjMC0wLjgsMC43LTEuNSwxLjUtMS41IFM1LDQuMSw1LDVDNSw1LjgsNC4zLDYuNCwzLjUsNi40eiBNMTMuMywxNi44Yy0zLjUsMC02LjMtMi43LTYuMy02LjJjMC0zLjMsMi41LTYuMiw1LjctNi4yaDEuMmMzLjIsMCw1LjcsMi45LDUuNyw2LjIgQzE5LjYsMTQuMSwxNi43LDE2LjgsMTMuMywxNi44eicvPjwvc3ZnPlwiKTtcbiAgICB9XG4gICAgJi5pY29uLWY3IHtcbiAgICAgICAgd2lkdGg6IDI5cHg7XG4gICAgICAgIGhlaWdodDogMjlweDtcbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiQHtpbWdCYXNlVXJsfS9pLWY3LWlvcy5wbmdcIik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICB9XG4gICAgJi5pY29uLW5leHQsICYuaWNvbi1wcmV2IHtcbiAgICAgICAgd2lkdGg6IDE1cHg7XG4gICAgICAgIGhlaWdodDogMTVweDtcbiAgICB9XG4gICAgJi5pY29uLW5leHQge1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMTUgMTUnPjxnPjxwYXRoIGZpbGw9J0B7dGhlbWVDb2xvcn0nIGQ9J00xLDEuNmwxMS44LDUuOEwxLDEzLjRWMS42IE0wLDB2MTVsMTUtNy42TDAsMEwwLDB6Jy8+PC9nPjwvc3ZnPlwiKTtcbiAgICB9XG4gICAgJi5pY29uLXByZXYge1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMTUgMTUnPjxnPjxwYXRoIGZpbGw9J0B7dGhlbWVDb2xvcn0nIGQ9J00xNCwxLjZ2MTEuOEwyLjIsNy42TDE0LDEuNiBNMTUsMEwwLDcuNkwxNSwxNVYwTDE1LDB6Jy8+PC9nPjwvc3ZnPlwiKTtcbiAgICB9XG4gICAgJi5pY29uLXBsdXMge1xuICAgICAgICB3aWR0aDogMjVweDtcbiAgICAgICAgaGVpZ2h0OiAyNXB4O1xuICAgICAgICBmb250LXNpemU6IDMxcHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiAxMDA7XG4gICAgfVxufVxuLmZyYW1ld29yazctaWNvbnMsIC5mNy1pY29ucyB7XG4gICAgLm5hdmJhciAmLCAudG9vbGJhciAmIHtcbiAgICAgICAgZm9udC1zaXplOiAyMnB4O1xuICAgIH1cbiAgICAudGFiYmFyICYsIC50YWJiYXItbGFiZWxzICYge1xuICAgICAgICBmb250LXNpemU6IDI1cHg7XG4gICAgfVxufVxuIiwiLyogPT09IENvbnRlbnQgQmxvY2sgPT09ICovXG5AY29udGVudEJsb2NrQm9yZGVyQ29sb3I6ICNjOGM3Y2M7XG5AY29udGVudEJsb2NrQ29sb3I6ICM2ZDZkNzI7XG5AY29udGVudEJsb2NrVGl0bGU6IEBjb250ZW50QmxvY2tDb2xvcjtcbi5jb250ZW50LWJsb2NrIHtcbiAgICBtYXJnaW46IDM1cHggMDtcbiAgICBwYWRkaW5nOiAwIDE1cHg7XG4gICAgY29sb3I6IEBjb250ZW50QmxvY2tUaXRsZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC5uby1oYWlybGluZXMoKTtcbn1cbi5jb250ZW50LWJsb2NrLXRpdGxlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBtYXJnaW46IDA7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgICBjb2xvcjogQGNvbnRlbnRCbG9ja0NvbG9yO1xuICAgIG1hcmdpbjogMzVweCAxNXB4IDEwcHg7XG4gICAgKyAubGlzdC1ibG9jaywgKyAuY29udGVudC1ibG9jaywgKy5jYXJkIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICB9XG59XG4uY29udGVudC1ibG9jay1pbm5lciB7XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICBwYWRkaW5nOiAxMHB4IDE1cHg7XG4gICAgbWFyZ2luLWxlZnQ6IC0xNXB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAuaGFpcmxpbmUodG9wLCBAY29udGVudEJsb2NrQm9yZGVyQ29sb3IpO1xuICAgIC5oYWlybGluZShib3R0b20sIEBjb250ZW50QmxvY2tCb3JkZXJDb2xvcik7XG4gICAgY29sb3I6ICMwMDA7XG59XG4uY29udGVudC1ibG9jay5pbnNldCB7XG4gICAgbWFyZ2luLWxlZnQ6IDE1cHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDdweDtcbiAgICAuY29udGVudC1ibG9jay1pbm5lciB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUodG9wKTtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA3cHg7XG4gICAgfVxufVxuQG1lZGlhIGFsbCBhbmQgKG1pbi13aWR0aDo3NjhweCkge1xuICAgIC5jb250ZW50LWJsb2NrLnRhYmxldC1pbnNldCB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDdweFxuICAgIH1cbiAgICBcbiAgICAuY29udGVudC1ibG9jay50YWJsZXQtaW5zZXQgLmNvbnRlbnQtYmxvY2staW5uZXIge1xuICAgIFx0LmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgXHRib3JkZXItcmFkaXVzOiA3cHg7XG4gICAgfVxufVxuIiwiLyogPT09IExpc3RzID09PSAqL1xuQGxpc3RCbG9ja0JvcmRlckNvbG9yOiAjYzhjN2NjO1xuQGxpc3RCbG9ja0JnOiAjZmZmO1xuQGRpdmlkZXJCZzogI0Y3RjdGNztcbkBkaXZpZGVyQ29sb3I6ICM4ZThlOTM7XG4ubGlzdC1ibG9jayB7XG4gICAgbWFyZ2luOiAzNXB4IDA7XG4gICAgZm9udC1zaXplOiAxN3B4O1xuICAgIHVsIHtcbiAgICAgICAgYmFja2dyb3VuZDogQGxpc3RCbG9ja0JnO1xuICAgICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgLmhhaXJsaW5lKHRvcCwgQGxpc3RCbG9ja0JvcmRlckNvbG9yKTtcbiAgICAgICAgLmhhaXJsaW5lKGJvdHRvbSwgQGxpc3RCbG9ja0JvcmRlckNvbG9yKTtcbiAgICAgICAgdWwge1xuICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiA0NXB4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLmFsaWduLXRvcCwgLmFsaWduLXRvcCAuaXRlbS1jb250ZW50LCAuYWxpZ24tdG9wIC5pdGVtLWlubmVyIHtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGZsZXgtc3RhcnQpO1xuICAgIH1cbiAgICBcbiAgICAuaW5zZXQoKSB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDdweDtcbiAgICAgICAgLmNvbnRlbnQtYmxvY2stdGl0bGUge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgICAgIH1cbiAgICAgICAgdWwge1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogN3B4O1xuICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICB9XG4gICAgICAgIGxpOmZpcnN0LWNoaWxkID4gYXtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDdweCA3cHggMCAwO1xuICAgICAgICB9XG4gICAgICAgIGxpOmxhc3QtY2hpbGQgPiBhe1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDdweCA3cHg7XG4gICAgICAgIH1cbiAgICAgICAgbGk6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCA+IGEge1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogN3B4O1xuICAgICAgICB9XG4gICAgfVxuICAgICYuaW5zZXQge1xuICAgICAgICAuaW5zZXQoKVxuICAgIH1cbiAgICAmLnRhYmxldC1pbnNldCB7XG4gICAgICAgIEBtZWRpYSBhbGwgYW5kIChtaW4td2lkdGg6NzY4cHgpIHtcbiAgICAgICAgICAgIC5pbnNldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGlzdCBpdGVtc1xuICAgIGxpIHtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICBcbiAgICAuaXRlbS1tZWRpYSB7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5mbGV4LXNocmluaygwKTtcbiAgICAgICAgLmZsZXgtd3JhcChub3dyYXApO1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAgICAgcGFkZGluZy10b3A6IDdweDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgICAgICAgaSArIGkge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICAgICAgfVxuICAgICAgICBpICsgaW1nIHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tbWVkaWEgKyAuaXRlbS1pbm5lciB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xuICAgIH1cbiAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDE1cHg7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgLmhhaXJsaW5lKGJvdHRvbSwgQGxpc3RCbG9ja0JvcmRlckNvbG9yKTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHBhZGRpbmctdG9wOiA4cHg7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiA3cHg7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDQ0cHg7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC13ZWJraXQtYm94LWZsZXg6MTtcbiAgICAgICAgLW1zLWZsZXg6MTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgLmp1c3RpZnktY29udGVudChzcGFjZS1iZXR3ZWVuKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgIC5hbGlnbi1zZWxmKHN0cmV0Y2gpO1xuICAgIH1cbiAgICAuaXRlbS10aXRsZSB7XG4gICAgICAgIC5mbGV4LXNocmluaygxKTtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgfVxuICAgIC5pdGVtLWFmdGVyIHtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgY29sb3I6ICM4ZThlOTM7XG4gICAgICAgIC5mbGV4LXNocmluaygwKTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICAgICAgLmZsZXhib3goKTtcbiAgICAgICAgbWF4LWhlaWdodDogMjhweDtcbiAgICB9XG4gICAgLnNtYXJ0LXNlbGVjdCAuaXRlbS1hZnRlciwgLmF1dG9jb21wbGV0ZS1vcGVuZXIgLml0ZW0tYWZ0ZXIge1xuICAgICAgICBtYXgtd2lkdGg6IDcwJTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIC5pdGVtLWxpbmsge1xuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBjb2xvcjogaW5oZXJpdDtcblxuICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzNXB4O1xuICAgICAgICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoXCI8c3ZnIHZpZXdCb3g9JzAgMCA2MCAxMjAnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PHBhdGggZD0nbTYwIDYxLjUtMzguMjUgMzguMjUtOS43NS05Ljc1IDI5LjI1LTI4LjUtMjkuMjUtMjguNSA5Ljc1LTkuNzV6JyBmaWxsPScjYzdjN2NjJy8+PC9zdmc+XCIpO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1zaXplOiAxMHB4IDIwcHg7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogOTUlIGNlbnRlcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC13ZWJraXQtY2FsYyh+XCIxMDAlIC0gMTVweFwiKSBjZW50ZXI7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjYWxjKH5cIjEwMCUgLSAxNXB4XCIpIGNlbnRlcjtcbiAgICAgICAgfVxuICAgICAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oMG1zKTtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWQ5ZDk7XG4gICAgICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICAgICAgLmhhaXJsaW5lLWNvbG9yKGJvdHRvbSwgdHJhbnNwYXJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICYubGlzdC1idXR0b24ge1xuICAgICAgICAgICAgcGFkZGluZzogMCAxNXB4O1xuICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgICAgY29sb3I6IEBibHVlO1xuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAuaGFpcmxpbmUoYm90dG9tLCBAbGlzdEJsb2NrQm9yZGVyQ29sb3IpO1xuICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDQzcHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tY29udGVudCB7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgIHBhZGRpbmctbGVmdDogMTVweDtcbiAgICAgICAgbWluLWhlaWdodDogNDRweDtcbiAgICAgICAgLmZsZXhib3goKTtcbiAgICAgICAgLmp1c3RpZnktY29udGVudChzcGFjZS1iZXR3ZWVuKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgfVxuICAgIC8vIExhYmVsIGFmdGVyIExpc3QgYmxvY2tcbiAgICAubGlzdC1ibG9jay1sYWJlbCB7XG4gICAgICAgIG1hcmdpbjogMTBweCAwIDM1cHg7XG4gICAgICAgIHBhZGRpbmc6IDAgMTVweDtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBjb2xvcjogIzhmOGY5NDtcbiAgICB9XG5cbiAgICAvLyBTd2lwZSBvdXRzXG4gICAgLnN3aXBlb3V0IHtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgICAgICB0cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgIH1cbiAgICAuc3dpcGVvdXQuZGVsZXRpbmcge1xuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgICAgIC5zd2lwZW91dC1jb250ZW50IHtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlWCgtMTAwJSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5zd2lwZW91dC50cmFuc2l0aW9uaW5nIHtcbiAgICAgICAgLnN3aXBlb3V0LWNvbnRlbnQsIC5zd2lwZW91dC1hY3Rpb25zLXJpZ2h0IGEsIC5zd2lwZW91dC1hY3Rpb25zLWxlZnQgYSwgLnN3aXBlb3V0LW92ZXJzd2lwZSB7XG4gICAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IDMwMG1zO1xuICAgICAgICAgICAgdHJhbnNpdGlvbjogMzAwbXM7XG4gICAgICAgIH0gICAgXG4gICAgfVxuICAgIC5zd2lwZW91dC1jb250ZW50IHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICB9XG4gICAgLnN3aXBlb3V0LW92ZXJzd2lwZSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogMjAwbXMgbGVmdDtcbiAgICAgICAgdHJhbnNpdGlvbjogMjAwbXMgbGVmdDtcbiAgICB9XG4gICAgLnN3aXBlb3V0LWFjdGlvbnMtbGVmdCwgLnN3aXBlb3V0LWFjdGlvbnMtcmlnaHQge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICBhIHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDAgMzBweDtcbiAgICAgICAgICAgIGNvbG9yOiNmZmY7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiAjYzdjN2NjO1xuICAgICAgICAgICAgLmZsZXhib3goKTtcbiAgICAgICAgICAgIC5hbGlnbi1pdGVtcyhjZW50ZXIpO1xuICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgICAgICY6YWZ0ZXIge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6Jyc7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICAgICAgICB3aWR0aDogNjAwJTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogaW5oZXJpdDtcbiAgICAgICAgICAgICAgICB6LWluZGV4OiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhLnN3aXBlb3V0LWRlbGV0ZSB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBAcmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5zd2lwZW91dC1hY3Rpb25zLXJpZ2h0IHtcbiAgICAgICAgcmlnaHQ6IDAlO1xuICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZVgoMTAwJSkpO1xuICAgICAgICBhOmFmdGVyIHtcbiAgICAgICAgICAgIGxlZnQ6IDEwMCU7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogLTFweDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAuc3dpcGVvdXQtYWN0aW9ucy1sZWZ0IHtcbiAgICAgICAgbGVmdDogMCU7XG4gICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlWCgtMTAwJSkpO1xuICAgICAgICBhOmFmdGVyIHtcbiAgICAgICAgICAgIHJpZ2h0OiAxMDAlO1xuICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAtMXB4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC5pdGVtLXN1YnRpdGxlIHtcbiAgICAgICAgZm9udC1zaXplOiAxNXB4O1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzplbGxpcHNpcztcbiAgICB9XG4gICAgLml0ZW0tdGV4dCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgICAgICAgY29sb3I6ICM4ZThlOTM7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAyMXB4O1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIGhlaWdodDogNDJweDtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzplbGxpcHNpcztcbiAgICAgICAgLXdlYmtpdC1saW5lLWNsYW1wOiAyO1xuICAgICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgICB9XG4gICAgJi5tZWRpYS1saXN0LCBsaS5tZWRpYS1pdGVtIHtcbiAgICAgICAgLml0ZW0tdGl0bGUge1xuICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgICAgIGh0bWwuaW9zLWd0LTggJiB7XG4gICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgIHBhZGRpbmctdG9wOiAxMHB4O1xuICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDlweDtcbiAgICAgICAgICAgIC5hbGlnbi1zZWxmKHN0cmV0Y2gpO1xuICAgICAgICB9XG4gICAgICAgIC5pdGVtLWxpbmsgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDE1cHg7XG4gICAgICAgIH1cbiAgICAgICAgLml0ZW0tbGluayAuaXRlbS10aXRsZS1yb3cge1xuICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMjBweDtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IG5vLXJlcGVhdCByaWdodCBjZW50ZXI7XG4gICAgICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgdmlld0JveD0nMCAwIDYwIDEyMCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJz48cGF0aCBkPSdtNjAgNjEuNS0zOC4yNSAzOC4yNS05Ljc1LTkuNzUgMjkuMjUtMjguNS0yOS4yNS0yOC41IDkuNzUtOS43NXonIGZpbGw9JyNjN2M3Y2MnLz48L3N2Zz5cIik7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDEwcHggMjBweDtcbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1tZWRpYSB7XG4gICAgICAgICAgICBwYWRkaW5nLXRvcDogOXB4O1xuICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDEwcHg7XG4gICAgICAgICAgICBpbWcge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC5pdGVtLXRpdGxlLXJvdyB7XG4gICAgICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAgICAgLmp1c3RpZnktY29udGVudChzcGFjZS1iZXR3ZWVuKTtcbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1jb250ZW50ID4gLml0ZW0tYWZ0ZXIge1xuICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmxpc3QtZ3JvdXAge1xuICAgICAgICB1bCB7XG4gICAgICAgICAgICAmOmFmdGVyLCAmOmJlZm9yZSB7XG4gICAgICAgICAgICAgICAgei1pbmRleDogMjU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgKyAubGlzdC1ncm91cCB1bCB7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7ICAgXG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tZGl2aWRlciwgLmxpc3QtZ3JvdXAtdGl0bGUge1xuICAgICAgICBiYWNrZ3JvdW5kOiBAZGl2aWRlckJnO1xuICAgICAgICAuaGFpcmxpbmUodG9wLCBAbGlzdEJsb2NrQm9yZGVyQ29sb3IpO1xuICAgICAgICBtYXJnaW4tdG9wOiAtMXB4O1xuICAgICAgICBwYWRkaW5nOiA0cHggMTVweDtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBjb2xvcjogQGRpdmlkZXJDb2xvcjtcbiAgICAgICAgei1pbmRleDogMTU7XG4gICAgfVxuICAgIC5saXN0LWdyb3VwLXRpdGxlIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7XG4gICAgICAgIHBvc2l0aW9uOiAtbW96LXN0aWNreTtcbiAgICAgICAgcG9zaXRpb246IHN0aWNreTtcbiAgICAgICAgdG9wOiAwcHg7XG4gICAgICAgIHotaW5kZXg6IDIwO1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgfVxuICAgIC8vIFNvcnRhYmxlXG4gICAgLnNvcnRhYmxlLWhhbmRsZXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGJvdHRvbTogMXB4O1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAgICAgYmFja2dyb3VuZC1zaXplOiAxOHB4IDEycHg7XG4gICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcbiAgICAgICAgd2lkdGg6IDM1cHg7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxOCAxMicgZmlsbD0nI2M3YzdjYyc+PHBhdGggZD0nTTAsMlYwaDIydjJIMHonLz48cGF0aCBkPSdNMCw3VjVoMjJ2MkgweicvPjxwYXRoIGQ9J00wLDEydi0yaDIydjJIMHonLz48L3N2Zz5cIik7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgfVxuICAgICYuc29ydGFibGUge1xuICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7ICAgICAgIFxuICAgICAgICB9XG4gICAgfVxuICAgICYuc29ydGFibGUtb3BlbmVkIHtcbiAgICAgICAgLnNvcnRhYmxlLWhhbmRsZXIge1xuICAgICAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIH1cbiAgICAgICAgLml0ZW0taW5uZXIsIC5pdGVtLWxpbmsgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMzVweDtcbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1saW5rIC5pdGVtLWlubmVyLCAuaXRlbS1saW5rIC5pdGVtLXRpdGxlLXJvdyB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgICAgICB9XG4gICAgfVxuICAgICYuc29ydGFibGUtc29ydGluZyB7XG4gICAgICAgIGxpIHtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsaS5zb3J0aW5nIHtcbiAgICAgICAgei1pbmRleDogNTA7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC44KTtcbiAgICAgICAgYm94LXNoYWRvdzogMHB4IDJweCA4cHggcmdiYSgwLDAsMCwwLjYpO1xuICAgICAgICAudHJhbnNpdGlvbigwbXMpO1xuICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMYXN0LWNoaWxkc1xuICAgIGxpIHtcbiAgICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgICAgIC5saXN0LWJ1dHRvbiB7XG4gICAgICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICY6bGFzdC1jaGlsZCwgJjpsYXN0LWNoaWxkIGxpOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsaTpsYXN0LWNoaWxkLCAmOmxhc3QtY2hpbGQgbGkge1xuICAgICAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgICAgIC5oYWlybGluZShib3R0b20sIEBsaXN0QmxvY2tCb3JkZXJDb2xvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLm5vLWhhaXJsaW5lcygpO1xuICAgIC5uby1oYWlybGluZXMtYmV0d2VlbigpXG59XG4iLCIvKiA9PT0gRm9ybXMgPT09ICovXG4vLyBJbnB1dHNcbi5saXN0LWJsb2NrIHtcbiAgICBpbnB1dFt0eXBlPVwidGV4dFwiXSwgaW5wdXRbdHlwZT1cInBhc3N3b3JkXCJdLCBpbnB1dFt0eXBlPVwic2VhcmNoXCJdLCBpbnB1dFt0eXBlPVwiZW1haWxcIl0sIGlucHV0W3R5cGU9XCJ0ZWxcIl0sIGlucHV0W3R5cGU9XCJ1cmxcIl0sIGlucHV0W3R5cGU9XCJkYXRlXCJdLCBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0sIGlucHV0W3R5cGU9XCJ0aW1lXCJdLCBpbnB1dFt0eXBlPVwibnVtYmVyXCJdLCBzZWxlY3QsIHRleHRhcmVhIHtcbiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tcy1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCAwIDA7XG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwYWRkaW5nOiAwcHg7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogNDNweDtcbiAgICAgICAgY29sb3I6ICMwMDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMTdweDtcbiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG5cbiAgICB9XG4gICAgLml0ZW0tdGl0bGUubGFiZWwge1xuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICAgICAgICArIC5pdGVtLWlucHV0IHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5wdXRbdHlwZT1cImRhdGVcIl0sIGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSB7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiA0NHB4O1xuICAgIH1cbiAgICBzZWxlY3Qge1xuICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgfVxuICAgIHRleHRhcmVhIHtcbiAgICAgICAgaGVpZ2h0OiAxMDBweDtcbiAgICAgICAgcmVzaXplOm5vbmU7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gICAgICAgIHBhZGRpbmctdG9wOiA4cHg7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiA3cHg7XG4gICAgICAgICYucmVzaXphYmxlIHtcbiAgICAgICAgICAgIGhlaWdodDogNDNweDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAuaXRlbS1pbnB1dCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBtYXJnaW4tdG9wOiAtOHB4O1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAtN3B4O1xuICAgICAgICAtd2Via2l0LWJveC1mbGV4OjE7XG4gICAgICAgIC1tcy1mbGV4OjE7XG4gICAgICAgIC5mbGV4LXNocmluaygxKTtcbiAgICB9XG4gICAgLml0ZW0tdGl0bGUubGFiZWwge1xuICAgICAgICB3aWR0aDogMzUlO1xuICAgICAgICAuZmxleC1zaHJpbmsoMCk7XG4gICAgfVxufVxuXG4vL1N3aXRjaFxuLmxhYmVsLXN3aXRjaCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgd2lkdGg6IDUycHg7XG4gICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGhlaWdodDogMzJweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIC5hbGlnbi1zZWxmKGNlbnRlcik7XG4gICAgLmNoZWNrYm94IHtcbiAgICAgICAgd2lkdGg6IDUycHg7IFxuICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4O1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBoZWlnaHQ6IDMycHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICNlNWU1ZTU7XG4gICAgICAgIHotaW5kZXg6IDA7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tcy1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgICAgICBib3JkZXI6bm9uZTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgJjpiZWZvcmUge1xuICAgICAgICAgICAgY29udGVudDonICc7XG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICBsZWZ0OiAycHg7XG4gICAgICAgICAgICB0b3A6IDJweDtcbiAgICAgICAgICAgIHdpZHRoOiA0OHB4O1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgICBoZWlnaHQ6IDI4cHg7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgICAgICAgICAgei1pbmRleDogMTtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGUoMSkpO1xuICAgICAgICB9XG4gICAgICAgICY6YWZ0ZXIge1xuICAgICAgICAgICAgY29udGVudDonICc7XG4gICAgICAgICAgICBoZWlnaHQ6IDI4cHg7XG4gICAgICAgICAgICB3aWR0aDogMjhweDtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDI4cHg7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgei1pbmRleDogMjtcbiAgICAgICAgICAgIHRvcDogMnB4O1xuICAgICAgICAgICAgbGVmdDogMnB4O1xuICAgICAgICAgICAgYm94LXNoYWRvdzogMCAycHggNXB4IHJnYmEoMCwwLDAsMC40KTtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlWCgwcHgpKTtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICAmOmNoZWNrZWQge1xuICAgICAgICAgICAgJisgLmNoZWNrYm94IHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjNGNkOTY0O1xuICAgICAgICAgICAgICAgICY6YmVmb3JlIHtcbiAgICAgICAgICAgICAgICAgICAgLnRyYW5zZm9ybShzY2FsZSgwKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICY6YWZ0ZXIge1xuICAgICAgICAgICAgICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZVgoMjBweCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmh0bWwuYW5kcm9pZCB7XG4gICAgLmxhYmVsLXN3aXRjaCBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAgICAgICAmKyAuY2hlY2tib3gge1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oMCk7XG4gICAgICAgICAgICAmOmFmdGVyLCAmOmJlZm9yZSB7XG4gICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vL0J1dHRvbnNcbi5idXR0b24ge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIEB0aGVtZUNvbG9yO1xuICAgIGNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICBsaW5lLWhlaWdodDogMjdweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIHBhZGRpbmc6IDAgMTBweDtcbiAgICBtYXJnaW46IDA7XG4gICAgaGVpZ2h0OiAyOXB4O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzplbGxpcHNpcztcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIG91dGxpbmU6IDA7XG4gICAgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSYsIGlucHV0W3R5cGU9XCJidXR0b25cIl0me1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKHJlZChAdGhlbWVDb2xvciksIGdyZWVuKEB0aGVtZUNvbG9yKSwgYmx1ZShAdGhlbWVDb2xvciksIC4xNSk7XG4gICAgfVxuICAgICYuYnV0dG9uLXJvdW5kIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMjdweDtcbiAgICB9XG4gICAgJi5hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgY29sb3I6ICNmZmY7XG4gICAgfVxuICAgICYuYnV0dG9uLWJpZyB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTdweDtcbiAgICAgICAgaGVpZ2h0OiA0NHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogNDJweDtcbiAgICB9XG4gICAgJi5idXR0b24tZmlsbCB7XG4gICAgICAgIGNvbG9yOiNmZmY7XG4gICAgICAgIGJhY2tncm91bmQ6IEB0aGVtZUNvbG9yO1xuICAgICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICAgICAgb3BhY2l0eTogMC44O1xuICAgICAgICB9XG4gICAgfVxuICAgIGkuaWNvbiB7XG4gICAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgICAgICB9XG4gICAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgICAgICAgfVxuICAgICAgICAmOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgICAgIH1cbiAgICB9XG59XG4uYnV0dG9ucy1yb3cge1xuICAgIC5hbGlnbi1zZWxmKGNlbnRlcik7XG4gICAgLmZsZXhib3goKTtcbiAgICAuZmxleC13cmFwKG5vd3JhcCk7XG4gICAgLmJ1dHRvbiB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCAwIDA7XG4gICAgICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgLXdlYmtpdC1ib3gtZmxleDoxO1xuICAgICAgICAtbXMtZmxleDoxO1xuICAgIH1cbiAgICAuYnV0dG9uOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4IDAgMCA1cHg7XG4gICAgICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7XG4gICAgICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDtcbiAgICB9XG4gICAgLmJ1dHRvbjpsYXN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCA1cHggNXB4IDA7XG4gICAgfVxuICAgIC5idXR0b246Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICB9XG4gICAgLmJ1dHRvbi5idXR0b24tcm91bmQ6Zmlyc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItcmFkaXVzOiAyN3B4IDAgMCAyN3B4O1xuICAgIH1cbiAgICAuYnV0dG9uLmJ1dHRvbi1yb3VuZDpsYXN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAyN3B4IDI3cHggMDtcbiAgICB9XG59XG5cblxuLy8gU2xpZGVyXG4ucmFuZ2Utc2xpZGVyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwYWRkaW5nLWxlZnQ6IDNweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7XG4gICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgLmFsaWduLXNlbGYoY2VudGVyKTtcbiAgICBpbnB1dFt0eXBlPVwicmFuZ2VcIl0ge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGhlaWdodDogMjhweDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIG1hcmdpbjogNHB4IDAgNXB4IDA7XG4gICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDUwJSAwLCA1MCUgMTAwJSwgY29sb3Itc3RvcCgwLCAjYjdiOGI3KSwgY29sb3Itc3RvcCgxMDAlLCAjYjdiOGI3KSk7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgI2I3YjhiNyAwLCAjYjdiOGI3IDEwMCUpO1xuICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAycHg7XG4gICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICAgIG91dGxpbmU6IDA7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICAgIC1tcy1iYWNrZ3JvdW5kLXBvc2l0aW9uLXk6IDUwMHB4O1xuICAgICAgICAmOmZvY3VzLCAmOmFjdGl2ZSB7XG4gICAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgICAgICBvdXRsaW5lOiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuXG4gICAgXG4gICAgLy8gUmFuZ2UgdGh1bWIgbWl4aW5cbiAgICAucmFuZ2UtdGh1bWIoKSB7XG4gICAgICAgIGhlaWdodDogMjhweDtcbiAgICAgICAgd2lkdGg6IDI4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDI4cHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjQpO1xuICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgIG91dGxpbmU6IDA7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgY29udGVudDogJyAnO1xuICAgIH1cbiAgICBcbiAgICAvLyA9PT09PT09IFdlYktpdC9CbGluayA9PT09PT09PVxuXG4gICAgLy8gQmVmb3JlIFRyYWNrXG4gICAgaW5wdXRbdHlwZT1cInJhbmdlXCJdOmFmdGVyIHtcbiAgICAgICAgaGVpZ2h0OiAycHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgICAgIGNvbnRlbnQ6JyAnO1xuICAgICAgICB3aWR0aDogNXB4O1xuICAgICAgICB0b3A6IDUwJTtcbiAgICAgICAgbWFyZ2luLXRvcDogLTFweDtcbiAgICAgICAgbGVmdDogLTVweDtcbiAgICAgICAgei1pbmRleDogMTtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgICAvLyBUaHVtYlxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LXdlYmtpdC1zbGlkZXItdGh1bWIge1xuICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgaGVpZ2h0OiAyOHB4O1xuICAgICAgICB3aWR0aDogMjhweDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwicmFuZ2VcIl06Oi13ZWJraXQtc2xpZGVyLXRodW1iOmFmdGVyIHtcbiAgICAgICAgLnJhbmdlLXRodW1iKCk7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICB9XG4gICAgLy8gVHJhY2sgQWN0aXZlIEhpZ2hsaWdodFxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LXdlYmtpdC1zbGlkZXItdGh1bWI6YmVmb3JlIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDUwJTtcbiAgICAgICAgcmlnaHQ6IDEwMCU7XG4gICAgICAgIHdpZHRoOiAyMDAwcHg7XG4gICAgICAgIGhlaWdodDogMnB4O1xuICAgICAgICBtYXJnaW4tdG9wOiAtMXB4O1xuICAgICAgICB6LWluZGV4OiAxO1xuICAgICAgICBiYWNrZ3JvdW5kOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgY29udGVudDogJyAnO1xuICAgIH1cblxuICAgIC8vID09PT09PT0gRmlyZUZveCA9PT09PT09PVxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LW1vei1yYW5nZS10cmFjayB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDJweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2I3YjhiNztcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBvdXRsaW5lOiAwO1xuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwicmFuZ2VcIl06Oi1tb3otcmFuZ2UtdGh1bWIge1xuICAgICAgICAucmFuZ2UtdGh1bWIoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gPT09PT09PSBJRSA9PT09PT09PVxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LW1zLXRyYWNrIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMnB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgICBjb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgfVxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LW1zLXRodW1iIHtcbiAgICAgICAgLnJhbmdlLXRodW1iKCk7XG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwwLDAsMC4yKTtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgfVxuXG4gICAgaW5wdXRbdHlwZT1cInJhbmdlXCJdOjotbXMtZmlsbC1sb3dlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IEB0aGVtZUNvbG9yO1xuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwicmFuZ2VcIl06Oi1tcy1maWxsLXVwcGVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogI2I3YjhiNztcbiAgICB9XG59XG5cbi8vIENoZWNrYm94ZXNcbmxhYmVsLmxhYmVsLWNoZWNrYm94IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgaS5pY29uLWZvcm0tY2hlY2tib3gge1xuICAgICAgICB3aWR0aDogMjJweDtcbiAgICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDIycHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjN2M3Y2M7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cbiAgICAgICAgJjphZnRlciB7XG4gICAgICAgICAgICBjb250ZW50OicgJztcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAtNnB4O1xuICAgICAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgICAgICBtYXJnaW4tdG9wOiAtNHB4O1xuICAgICAgICAgICAgd2lkdGg6IDEycHg7XG4gICAgICAgICAgICBoZWlnaHQ6IDlweDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0sIGlucHV0W3R5cGU9XCJyYWRpb1wiXSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgICY6Y2hlY2tlZCArIC5pdGVtLW1lZGlhe1xuICAgICAgICAgICAgaS5pY29uLWZvcm0tY2hlY2tib3gge1xuICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkuaWNvbi1mb3JtLWNoZWNrYm94OmFmdGVyIHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBuby1yZXBlYXQgY2VudGVyO1xuICAgICAgICAgICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHg9JzBweCcgeT0nMHB4JyB2aWV3Qm94PScwIDAgMTIgOScgeG1sOnNwYWNlPSdwcmVzZXJ2ZSc+PHBvbHlnb24gZmlsbD0nI2ZmZmZmZicgcG9pbnRzPScxMiwwLjcgMTEuMywwIDMuOSw3LjQgMC43LDQuMiAwLDQuOSAzLjksOC44IDMuOSw4LjggMy45LDguOCAnLz48L3N2Zz5cIik7XG4gICAgICAgICAgICAgICAgLXdlYmtpdC1iYWNrZ3JvdW5kLXNpemU6IDEycHggOXB4O1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTJweCA5cHg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5sYWJlbC5sYWJlbC1yYWRpbyB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSwgaW5wdXRbdHlwZT1cInJhZGlvXCJdIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgfiAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzNXB4O1xuICAgICAgICB9XG4gICAgICAgICY6Y2hlY2tlZCB+IC5pdGVtLWlubmVye1xuICAgICAgICAgICAgYmFja2dyb3VuZDogbm8tcmVwZWF0IGNlbnRlcjtcbiAgICAgICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxMyAxMCc+PHBvbHlnb24gZmlsbD0nQHt0aGVtZUNvbG9yfScgcG9pbnRzPScxMS42LDAgNC40LDcuMiAxLjQsNC4yIDAsNS42IDQuNCwxMCA0LjQsMTAgNC40LDEwIDEzLDEuNCAnLz48L3N2Zz5cIik7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA5MCUgY2VudGVyO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogflwiLXdlYmtpdC1jYWxjKDEwMCUgLSAxNXB4KVwiIGNlbnRlcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IH5cImNhbGMoMTAwJSAtIDE1cHgpXCIgY2VudGVyO1xuICAgICAgICAgICAgLXdlYmtpdC1iYWNrZ3JvdW5kLXNpemU6IDEzcHggMTBweDtcbiAgICAgICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTNweCAxMHB4O1xuICAgICAgICB9XG4gICAgfVxufVxubGFiZWwubGFiZWwtY2hlY2tib3gsIGxhYmVsLmxhYmVsLXJhZGlvIHtcbiAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgaHRtbDpub3QoLndhdGNoLWFjdGl2ZS1zdGF0ZSkgJjphY3RpdmUsICYuYWN0aXZlLXN0YXRlIHtcbiAgICAgICAgLnRyYW5zaXRpb24oMG1zKTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDlkOTtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgLmhhaXJsaW5lLWNvbG9yKGJvdHRvbSwgdHJhbnNwYXJlbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBTbWFydCBzZWxlY3RzXG4uc21hcnQtc2VsZWN0IHtcbiAgICBzZWxlY3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cbiIsIi8qID09PSBDYXJkcyA9PT0gKi9cbi5jYXJkcy1saXN0LCAuY2FyZCAubGlzdC1ibG9jayB7XG4gICAgdWwge1xuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIH1cbiAgICA+IHVsIHtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgfVxufVxuLmNhcmQge1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgYm94LXNoYWRvdzogMHB4IDFweCAycHggcmdiYSgwLDAsMCwwLjMpO1xuICAgIG1hcmdpbjogMTBweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAubGlzdC1ibG9jaywgLmNvbnRlbnQtYmxvY2sge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgfVxuICAgIC5yb3c6bm90KC5uby1ndXR0ZXIpIC5jb2wgPiAmIHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICB9XG59XG4uY2FyZC1jb250ZW50IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4uY2FyZC1jb250ZW50LWlubmVyIHtcbiAgICBwYWRkaW5nOiAxNXB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICA+IHA6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgIH1cbiAgICA+IHA6bGFzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgfVxuICAgID4gLmxpc3QtYmxvY2ssID4uY29udGVudC1ibG9jayB7XG4gICAgICAgIG1hcmdpbjogLTE1cHg7XG4gICAgfVxufVxuLmNhcmQtaGVhZGVyLCAuY2FyZC1mb290ZXIge1xuICAgIG1pbi1oZWlnaHQ6IDQ0cHg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHBhZGRpbmc6IDEwcHggMTVweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmp1c3RpZnktY29udGVudChzcGFjZS1iZXR3ZWVuKTtcbiAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAmW3ZhbGlnbj1cInRvcFwiXSB7XG4gICAgICAgIC5hbGlnbi1pdGVtcyhmbGV4LXN0YXJ0KTtcbiAgICB9XG4gICAgJlt2YWxpZ249XCJib3R0b21cIl0ge1xuICAgICAgICAuYWxpZ24taXRlbXMoZmxleC1lbmQpO1xuICAgIH1cbiAgICBhLmxpbmsge1xuICAgICAgICBsaW5lLWhlaWdodDogNDRweDtcbiAgICAgICAgaGVpZ2h0OiA0NHB4O1xuICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgbWFyZ2luLXRvcDogLTEwcHg7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IC0xMHB4O1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAuanVzdGlmeS1jb250ZW50KGZsZXgtc3RhcnQpO1xuICAgICAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICAgICAgb3BhY2l0eTogMC4zO1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oMG1zKTtcbiAgICAgICAgfVxuICAgICAgICBpK3NwYW4sIGkraSwgc3BhbitpLCBzcGFuK3NwYW4ge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDdweDtcbiAgICAgICAgfVxuICAgICAgICBpLmljb24ge1xuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYS5pY29uLW9ubHkge1xuICAgICAgICBtaW4td2lkdGg6IDQ0cHg7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5qdXN0aWZ5LWNvbnRlbnQoY2VudGVyKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICB9XG59XG4uY2FyZC1oZWFkZXIge1xuICAgIGJvcmRlci1yYWRpdXM6IDJweCAycHggMCAwO1xuICAgIGZvbnQtc2l6ZTogMTdweDtcbiAgICAuaGFpcmxpbmUoYm90dG9tLCAjZTFlMWUxKTtcbiAgICAmLm5vLWJvcmRlciB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICB9XG59XG4uY2FyZC1mb290ZXIge1xuICAgIGJvcmRlci1yYWRpdXM6IDAgMCAycHggMnB4O1xuICAgIGNvbG9yOiM2ZDZkNzI7XG4gICAgLmhhaXJsaW5lKHRvcCwgI2UxZTFlMSk7XG4gICAgJi5uby1ib3JkZXIge1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgfVxuXG59IiwiLyogPT09IE1vZGFscyA9PT0gKi9cbkBtb2RhbEJnOiByZ2JhKDI1NSwyNTUsMjU1LDAuOTUpO1xuQG1vZGFsQnV0b25Db2xvciA6IEB0aGVtZUNvbG9yO1xuQG1vZGFsQnV0b25BY3RpdmVCZzogcmdiYSgyMzAsMjMwLDIzMCwwLjk1KTtcbkBtb2RhbEhhaXJsaW5lQ29sb3I6IHJnYmEoMCwwLDAsMC4yKTtcbkBtb2RhbER1cmF0aW9uOiA0MDBtcztcblxuQGFjdGlvbnNNb2RhbEJnOiByZ2JhKDI1NSwyNTUsMjU1LDAuOTUpO1xuQGFjdGlvbnNNb2RhbEJ1dHRvbkFjdGl2ZUJnOiByZ2JhKDIzMCwyMzAsMjMwLDAuOSk7XG5AYWN0aW9uc01vZGFsSGFpcmxpbmVDb2xvcjogcmdiYSgwLDAsMCwwLjIpO1xuQGFjdGlvbnNNb2RhbER1cmF0aW9uOiAzMDBtcztcblxuQHBvcG92ZXJCZzogcmdiYSgyNTUsMjU1LDI1NSwwLjk1KTtcblxuQHBvcHVwRHVyYXRpb246IDQwMG1zO1xuXG5AYWN0aW9uc1BvcG92ZXJIYWlybGluZTogcmdiYSgwLDAsMCwwLjIpO1xuLm1vZGFsLW92ZXJsYXksIC5wcmVsb2FkZXItaW5kaWNhdG9yLW92ZXJsYXksIC5wb3B1cC1vdmVybGF5IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC40KTtcbiAgICB6LWluZGV4OiAxMzAwMDtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgb3BhY2l0eTogMDtcbiAgICAudHJhbnNpdGlvbihAbW9kYWxEdXJhdGlvbik7XG4gICAgJi5tb2RhbC1vdmVybGF5LXZpc2libGUge1xuICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn1cbi5wb3B1cC1vdmVybGF5IHtcbiAgICB6LWluZGV4OiAxMDUwMDtcbn1cbi5tb2RhbCB7XG4gICAgd2lkdGg6IDI3MHB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB6LWluZGV4OiAxMzUwMDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0xMzVweDtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICAgIHRvcDogNTAlO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBib3JkZXItcmFkaXVzOiAxM3B4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgb3BhY2l0eTogMDtcbiAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZTNkKDAsMCwwKSBzY2FsZSgxLjE4NSkpO1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm0sIG9wYWNpdHk7XG4gICAgLW1vei10cmFuc2l0aW9uLXByb3BlcnR5OiAtbW96LXRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgICAtbXMtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLW1zLXRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgICAtby10cmFuc2l0aW9uLXByb3BlcnR5OiAtby10cmFuc2Zvcm0sIG9wYWNpdHk7XG4gICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICAgIGNvbG9yOiMwMDA7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBcbiAgICAmLm1vZGFsLWluIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgLnRyYW5zaXRpb24oQG1vZGFsRHVyYXRpb24pO1xuICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZTNkKDAsMCwwKSBzY2FsZSgxKSk7XG4gICAgfVxuICAgICYubW9kYWwtb3V0IHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgei1pbmRleDogMTM1MDAtMTtcbiAgICAgICAgLnRyYW5zaXRpb24oQG1vZGFsRHVyYXRpb24pO1xuICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZTNkKDAsMCwwKSBzY2FsZSgxKSk7XG4gICAgfVxufVxuLm1vZGFsLWlubmVyIHtcbiAgICBwYWRkaW5nOiAxNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEzcHggMTNweCAwIDA7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGJhY2tncm91bmQ6IEBtb2RhbEJnO1xuICAgIC5oYWlybGluZShib3R0b20sIEBtb2RhbEhhaXJsaW5lQ29sb3IpO1xuICAgICAgICBcbn1cbi5tb2RhbC10aXRsZSB7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBmb250LXNpemU6IDE4cHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGh0bWwuaW9zLWd0LTggJiB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgfVxuICAgICsubW9kYWwtdGV4dCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDVweDtcbiAgICB9XG59XG4ubW9kYWwtYnV0dG9ucyB7XG4gICAgaGVpZ2h0OiA0NHB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAuZmxleGJveCgpO1xuICAgIC5qdXN0aWZ5LWNvbnRlbnQoY2VudGVyKTtcbiAgICAmLm1vZGFsLWJ1dHRvbnMtdmVydGljYWwge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgIH1cbn1cbi5tb2RhbC1idXR0b24ge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmc6IDAgNXB4O1xuICAgIGhlaWdodDogNDRweDtcbiAgICBmb250LXNpemU6IDE3cHg7XG4gICAgbGluZS1oZWlnaHQ6IDQ0cHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGNvbG9yOiBAbW9kYWxCdXRvbkNvbG9yO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtd2Via2l0LWJveC1mbGV4OjE7XG4gICAgLW1zLWZsZXg6MTtcbiAgICBiYWNrZ3JvdW5kOiBAbW9kYWxCZztcbiAgICAuaGFpcmxpbmUocmlnaHQsIEBtb2RhbEhhaXJsaW5lQ29sb3IpO1xuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgMCAxM3B4O1xuICAgIH1cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHJpZ2h0KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDEzcHggMDtcbiAgICB9XG4gICAgJjpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDEzcHggMTNweDtcbiAgICB9XG4gICAgJi5tb2RhbC1idXR0b24tYm9sZCB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIGh0bWwuaW9zLWd0LTggJiB7XG4gICAgICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGh0bWw6bm90KC53YXRjaC1hY3RpdmUtc3RhdGUpICY6YWN0aXZlLCAmLmFjdGl2ZS1zdGF0ZSB7XG4gICAgICAgIGJhY2tncm91bmQ6IEBtb2RhbEJ1dG9uQWN0aXZlQmc7XG4gICAgfVxuICAgIC5tb2RhbC1idXR0b25zLXZlcnRpY2FsICYge1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHJpZ2h0KTtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAuaGFpcmxpbmUoYm90dG9tLCBAbW9kYWxIYWlybGluZUNvbG9yKTtcbiAgICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCAxM3B4IDEzcHg7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4ubW9kYWwtbm8tYnV0dG9ucyB7XG4gICAgLm1vZGFsLWlubmVyIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTNweDtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgIH1cbiAgICAubW9kYWwtYnV0dG9ucyB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxufVxuLy8gQWN0aW9uIHNoZWV0XG4uYWN0aW9ucy1tb2RhbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHotaW5kZXg6IDEzNTAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwxMDAlLDApKTtcbiAgICBtYXgtaGVpZ2h0OiAxMDAlO1xuICAgIC5zY3JvbGxhYmxlKCk7XG4gICAgQG1lZGlhIChtaW4td2lkdGg6NDk2cHgpIHtcbiAgICAgICAgd2lkdGg6IDQ4MHB4O1xuICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAtMjQwcHg7XG4gICAgfVxuICAgICYubW9kYWwtaW4ge1xuICAgICAgICAudHJhbnNpdGlvbihAYWN0aW9uc01vZGFsRHVyYXRpb24pO1xuICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZTNkKDAsMCwwKSk7XG4gICAgfVxuICAgICYubW9kYWwtb3V0IHtcbiAgICAgICAgei1pbmRleDogMTM1MDAtMTtcbiAgICAgICAgLnRyYW5zaXRpb24oQGFjdGlvbnNNb2RhbER1cmF0aW9uKTtcbiAgICAgICAgLnRyYW5zZm9ybSh0cmFuc2xhdGUzZCgwLDEwMCUsMCkpO1xuICAgIH1cbn1cbi5hY3Rpb25zLW1vZGFsLWdyb3VwIHtcbiAgICBtYXJnaW46IDhweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYm9yZGVyLXJhZGl1czogMTNweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwwLDApKTtcbn1cbi5hY3Rpb25zLW1vZGFsLWJ1dHRvbiwgLmFjdGlvbnMtbW9kYWwtbGFiZWwge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIG1hcmdpbjogMDtcbiAgICBiYWNrZ3JvdW5kOiBAYWN0aW9uc01vZGFsQmc7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAuaGFpcmxpbmUoYm90dG9tLCBAYWN0aW9uc01vZGFsSGFpcmxpbmVDb2xvcik7XG4gICAgYSB7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICBiIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgaHRtbC5pb3MtZ3QtOCAmIHtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5hY3Rpb25zLW1vZGFsLWJ1dHRvbi1ib2xkIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgaHRtbC5pb3MtZ3QtOCAmIHtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5hY3Rpb25zLW1vZGFsLWJ1dHRvbi1yZWQge1xuICAgICAgICBjb2xvcjogQHJlZDtcbiAgICB9XG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEzcHggMTNweCAwIDA7XG4gICAgfVxuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDEzcHggMTNweDtcbiAgICB9XG4gICAgJjpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTNweDtcbiAgICB9XG4gICAgJi5kaXNhYmxlZCB7XG4gICAgICAgIG9wYWNpdHk6IDAuOTtcbiAgICAgICAgY29sb3I6QGdyYXk7XG4gICAgfVxufVxuLmFjdGlvbnMtbW9kYWwtYnV0dG9uIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgaGVpZ2h0OiA1N3B4O1xuICAgIGxpbmUtaGVpZ2h0OiA1N3B4O1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICBjb2xvcjogQHRoZW1lQ29sb3I7XG4gICAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICBiYWNrZ3JvdW5kOiBAYWN0aW9uc01vZGFsQnV0dG9uQWN0aXZlQmc7XG4gICAgfVxufVxuLmFjdGlvbnMtbW9kYWwtbGFiZWwge1xuICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICBsaW5lLWhlaWdodDogMS4zO1xuICAgIG1pbi1oZWlnaHQ6IDU3cHg7XG4gICAgcGFkZGluZzogOHB4IDEwcHg7XG4gICAgY29sb3I6ICM4YThhOGE7XG4gICAgLmZsZXhib3goKTtcbiAgICAuanVzdGlmeS1jb250ZW50KGNlbnRlcik7XG4gICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG59XG5AbWVkaWEgKG9yaWVudGF0aW9uOmxhbmRzY2FwZSkge1xuICAgIC5hY3Rpb25zLW1vZGFsLWxhYmVsIHtcbiAgICAgICAgbWluLWhlaWdodDogNDRweDtcbiAgICB9XG4gICAgLmFjdGlvbnMtbW9kYWwtYnV0dG9uIHtcbiAgICAgICAgaGVpZ2h0OiA0NHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogNDRweDtcbiAgICB9XG59XG4vLyBQcm9tcHRcbmlucHV0Lm1vZGFsLXRleHQtaW5wdXQge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgaGVpZ2h0OiAyNnB4O1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgbWFyZ2luOiAwO1xuICAgIG1hcmdpbi10b3A6IDE1cHg7XG4gICAgcGFkZGluZzogMCA1cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLDAsMCwwLjMpO1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIHJnYmEoMCwwLDAsMCk7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTtcbiAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgICsgaW5wdXQubW9kYWwtdGV4dC1pbnB1dCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDVweDtcbiAgICB9XG59XG4ubW9kYWwtaW5wdXQtZG91YmxlIHtcbiAgICBpbnB1dC5tb2RhbC10ZXh0LWlucHV0IHtcbiAgICB9XG4gICAgLm1vZGFsLWlucHV0LWRvdWJsZSArICYge1xuICAgICAgICBpbnB1dC5tb2RhbC10ZXh0LWlucHV0IHtcbiAgICAgICAgICAgIGJvcmRlci10b3A6IDA7XG4gICAgICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gUG9wb3ZlclxuLnBvcG92ZXIge1xuICAgIHdpZHRoOiAzMjBweDtcbiAgICBiYWNrZ3JvdW5kOkBwb3BvdmVyQmc7XG4gICAgei1pbmRleDogMTM1MDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIHRvcDogMDtcbiAgICBvcGFjaXR5OiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgYm9yZGVyLXJhZGl1czogMTNweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICAudHJhbnNmb3JtKG5vbmUpO1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eTtcbiAgICAtbW96LXRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHk7XG4gICAgLW1zLXRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHk7XG4gICAgLW8tdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eTtcbiAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5O1xuICAgICYubW9kYWwtaW4ge1xuICAgICAgICAudHJhbnNpdGlvbihAYWN0aW9uc01vZGFsRHVyYXRpb24pO1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgICAubGlzdC1ibG9jayB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgdWwge1xuICAgICAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgfVxuICAgICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgIHVsIHtcbiAgICAgICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTNweCAxM3B4IDAgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpOmZpcnN0LWNoaWxkIGF7XG4gICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTNweCAxM3B4IDAgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgdWwge1xuICAgICAgICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgMTNweCAxM3B4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGk6bGFzdC1jaGlsZCBhe1xuICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCAxM3B4IDEzcHg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgJjpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkIHtcbiAgICAgICAgICAgIGxpOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQgYSwgdWw6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTNweDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICArIC5saXN0LWJsb2NrIHtcbiAgICAgICAgICAgIG1hcmdpbi10b3A6IDM1cHg7XG4gICAgICAgIH1cbiAgICB9XG59XG4ucG9wb3Zlci1hbmdsZSB7XG4gICAgd2lkdGg6IDI2cHg7XG4gICAgaGVpZ2h0OiAyNnB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAtMjZweDtcbiAgICB0b3A6IDA7XG4gICAgei1pbmRleDogMTAwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgJjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6JyAnO1xuICAgICAgICBiYWNrZ3JvdW5kOiBAcG9wb3ZlckJnO1xuICAgICAgICB3aWR0aDogMjZweDtcbiAgICAgICAgaGVpZ2h0OiAyNnB4O1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgICAgICAudHJhbnNmb3JtKHJvdGF0ZSg0NWRlZykpO1xuICAgIH1cbiAgICAmLm9uLWxlZnQge1xuICAgICAgICBsZWZ0OiAtMjZweDtcbiAgICAgICAgJjphZnRlciB7XG4gICAgICAgICAgICBsZWZ0OiAxOXB4O1xuICAgICAgICAgICAgdG9wOiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgICYub24tcmlnaHQge1xuICAgICAgICBsZWZ0OiAxMDAlO1xuICAgICAgICAmOmFmdGVyIHtcbiAgICAgICAgICAgIGxlZnQ6IC0xOXB4O1xuICAgICAgICAgICAgdG9wOiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgICYub24tdG9wIHtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAtMjZweDtcbiAgICAgICAgJjphZnRlciB7XG4gICAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgICAgdG9wOiAxOXB4O1xuICAgICAgICB9XG4gICAgfVxuICAgICYub24tYm90dG9tIHtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAxMDAlO1xuICAgICAgICAmOmFmdGVyIHtcbiAgICAgICAgICAgIGxlZnQ6IDA7XG4gICAgICAgICAgICB0b3A6IC0xOXB4O1xuICAgICAgICB9XG4gICAgfVxufVxuLnBvcG92ZXItaW5uZXIge1xuICAgIC5zY3JvbGxhYmxlKCk7ICAgIFxufVxuLmFjdGlvbnMtcG9wb3ZlciB7XG4gICAgLmxpc3QtYmxvY2sgKyAubGlzdC1ibG9jayB7XG4gICAgICAgIG1hcmdpbi10b3A6IDIwcHg7XG4gICAgfVxuICAgIC5saXN0LWJsb2NrIHVsIHtcbiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICB9XG59XG4uYWN0aW9ucy1wb3BvdmVyLWxhYmVsIHtcbiAgICBwYWRkaW5nOiA4cHggMTBweDtcbiAgICBjb2xvcjojOGE4YThhO1xuICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICBsaW5lLWhlaWdodDogMS4zO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgLmhhaXJsaW5lKGJvdHRvbSwgQGFjdGlvbnNQb3BvdmVySGFpcmxpbmUpO1xuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICB9XG59XG4vLyBQb3B1cFxuLnBvcHVwLCAubG9naW4tc2NyZWVuIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHotaW5kZXg6IDExMDAwO1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIC5zY3JvbGxhYmxlKCk7XG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTtcbiAgICAtbW96LXRyYW5zaXRpb24tcHJvcGVydHk6IC1tb3otdHJhbnNmb3JtO1xuICAgIC1tcy10cmFuc2l0aW9uLXByb3BlcnR5OiAtbXMtdHJhbnNmb3JtO1xuICAgIC1vLXRyYW5zaXRpb24tcHJvcGVydHk6IC1vLXRyYW5zZm9ybTtcbiAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm07XG4gICAgLnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTtcbiAgICAmLm1vZGFsLWluLCAmLm1vZGFsLW91dCB7XG4gICAgICAgIC50cmFuc2l0aW9uKEBwb3B1cER1cmF0aW9uKTtcbiAgICB9XG4gICAgJi5tb2RhbC1pbiB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxuICAgICYubW9kYWwtb3V0IHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTtcbiAgICB9XG59XG4ubG9naW4tc2NyZWVuLm1vZGFsLWluLCAubG9naW4tc2NyZWVuLm1vZGFsLW91dCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG4vLyBpUGFkIFBvcHVwXG5AbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOjYzMHB4KSBhbmQgKG1pbi1oZWlnaHQ6NjMwcHgpIHtcbiAgICAucG9wdXA6bm90KC50YWJsZXQtZnVsbHNjcmVlbikge1xuICAgICAgICB3aWR0aDogNjMwcHg7XG4gICAgICAgIGhlaWdodDogNjMwcHg7XG4gICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAtMzE1cHg7XG4gICAgICAgIG1hcmdpbi10b3A6IC0zMTVweDtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMTAyNHB4LDApO1xuICAgICAgICAmLm1vZGFsLWluIHtcbiAgICAgICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgICAgIH1cbiAgICAgICAgJi5tb2RhbC1vdXQge1xuICAgICAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMTAyNHB4LDApO1xuICAgICAgICB9XG4gICAgfVxufVxuaHRtbC53aXRoLXN0YXR1c2Jhci1vdmVybGF5IHtcbiAgICAvLyBpUGhvbmUgd2l0aCBzdGF0dXNiYXIgb3ZlcmxheVxuICAgIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6NjI5cHgpLCAobWF4LWhlaWdodDo2MjlweCkge1xuICAgICAgICAucG9wdXAge1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCItd2Via2l0LWNhbGMoMTAwJSAtIDIwcHgpXCI7XG4gICAgICAgICAgICBoZWlnaHQ6IH5cImNhbGMoMTAwJSAtIDIwcHgpXCI7XG4gICAgICAgICAgICB0b3A6IDIwcHg7XG4gICAgICAgIH1cbiAgICAgICAgLnBvcHVwLW92ZXJsYXkge1xuICAgICAgICAgICAgei1pbmRleDogOTUwMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAubG9naW4tc2NyZWVuLCAucG9wdXAudGFibGV0LWZ1bGxzY3JlZW4ge1xuICAgICAgICBoZWlnaHQ6IH5cIi13ZWJraXQtY2FsYygxMDAlIC0gMjBweClcIjtcbiAgICAgICAgaGVpZ2h0OiB+XCJjYWxjKDEwMCUgLSAyMHB4KVwiO1xuICAgICAgICB0b3A6IDIwcHg7XG4gICAgfVxufVxuXG4vL1ByZWxvYWRlcnMgbW9kYWxzXG4ubW9kYWwgLnByZWxvYWRlciB7XG4gICAgd2lkdGg6IDM0cHg7XG4gICAgaGVpZ2h0OiAzNHB4O1xufVxuLnByZWxvYWRlci1pbmRpY2F0b3Itb3ZlcmxheSB7XG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICBvcGFjaXR5OiAwO1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG59XG4ucHJlbG9hZGVyLWluZGljYXRvci1tb2RhbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDUwJTtcbiAgICB0b3A6IDUwJTtcbiAgICBwYWRkaW5nOiA4cHg7XG4gICAgbWFyZ2luLWxlZnQ6IC0yNXB4O1xuICAgIG1hcmdpbi10b3A6IC0yNXB4O1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC44KTtcbiAgICB6LWluZGV4OiAxMzUwMDtcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgLnByZWxvYWRlciB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogMzRweDtcbiAgICAgICAgaGVpZ2h0OiAzNHB4O1xuICAgIH1cbn1cblxuLy8gUGlja2VyIE1vZGFsXG4ucGlja2VyLW1vZGFsIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICBib3R0b206IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAyNjBweDtcbiAgICB6LWluZGV4OiAxMjUwMDtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm07XG4gICAgLW1vei10cmFuc2l0aW9uLXByb3BlcnR5OiAtbW96LXRyYW5zZm9ybTtcbiAgICAtbXMtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLW1zLXRyYW5zZm9ybTtcbiAgICAtby10cmFuc2l0aW9uLXByb3BlcnR5OiAtby10cmFuc2Zvcm07XG4gICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtO1xuICAgIGJhY2tncm91bmQ6ICNjZmQ1ZGE7XG4gICAgLnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTtcbiAgICAmLm1vZGFsLWluLCAmLm1vZGFsLW91dCB7XG4gICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICB9XG4gICAgJi5tb2RhbC1pbiB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxuICAgICYubW9kYWwtb3V0IHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTtcbiAgICB9XG4gICAgLnBpY2tlci1tb2RhbC1pbm5lciB7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICAudG9vbGJhciB7XG4gICAgICAgIC5oYWlybGluZSh0b3AsICM5Mjk0OTkpO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZjdmN2Y4O1xuICAgICAgICArIC5waWNrZXItbW9kYWwtaW5uZXIge1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCItd2Via2l0LWNhbGMoMTAwJSAtIEB7dG9vbGJhclNpemV9KVwiO1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCItbW96LWNhbGMoMTAwJSAtIEB7dG9vbGJhclNpemV9KVwiO1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCJjYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSlcIjsgICAgXG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5waWNrZXItbW9kYWwtaW5saW5lLCAucG9wb3ZlciAmIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgei1pbmRleDogaW5oZXJpdDtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAgICAgLnRvb2xiYXIge1xuICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAgICAgLmhhaXJsaW5lKGJvdHRvbSwgIzkyOTQ5OSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnBvcG92ZXIgJiB7XG4gICAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgICAudG9vbGJhciB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICB9XG4gICAgfVxuICAgICYuc21hcnQtc2VsZWN0LXBpY2tlciB7XG4gICAgICAgIC5wYWdlIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgICAgIH1cbiAgICAgICAgLnRvb2xiYXIge1xuICAgICAgICAgICAgLmhhaXJsaW5lKGJvdHRvbSwgI2M0YzRjNCk7XG4gICAgICAgIH1cbiAgICAgICAgLmxpc3QtYmxvY2sge1xuICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgdWwge1xuICAgICAgICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUodG9wKTtcbiAgICAgICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyogPT09IFBhbmVscyA9PT0gKi9cbkBwYW5lbFdpZHRoOjI2MHB4O1xuQHBhbmVsc0R1cmF0aW9uOiA0MDBtcztcbi5wYW5lbC1vdmVybGF5IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMCk7XG4gICAgb3BhY2l0eTogMDtcbiAgICB6LWluZGV4OiA1OTk5O1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG4ucGFuZWwge1xuICAgIHotaW5kZXg6IDEwMDA7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiAjMTExO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLnNjcm9sbGFibGUoKTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IEBwYW5lbFdpZHRoO1xuICAgIHRvcDogMDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgLnRyYW5zbGF0ZTNkKDApO1xuICAgIC50cmFuc2l0aW9uKEBwYW5lbHNEdXJhdGlvbik7XG5cbiAgICAmLnBhbmVsLWxlZnQge1xuICAgICAgICAmLnBhbmVsLWNvdmVyIHtcbiAgICAgICAgICAgIHotaW5kZXg6IDYwMDA7XG4gICAgICAgICAgICBsZWZ0OiAtQHBhbmVsV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgJi5wYW5lbC1yZXZlYWwge1xuICAgICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAmLnBhbmVsLXJpZ2h0IHtcbiAgICAgICAgJi5wYW5lbC1jb3ZlciB7XG4gICAgICAgICAgICB6LWluZGV4OiA2MDAwO1xuICAgICAgICAgICAgcmlnaHQ6IC1AcGFuZWxXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICAmLnBhbmVsLXJldmVhbCB7XG4gICAgICAgICAgICByaWdodDogMDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmJvZHkud2l0aC1wYW5lbC1sZWZ0LWNvdmVyLCBib2R5LndpdGgtcGFuZWwtcmlnaHQtY292ZXIge1xuICAgIC52aWV3cyB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwKTtcbiAgICB9XG4gICAgLnBhbmVsLW92ZXJsYXkge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG59XG5ib2R5LndpdGgtcGFuZWwtbGVmdC1yZXZlYWwsIGJvZHkud2l0aC1wYW5lbC1yaWdodC1yZXZlYWwge1xuICAgIC52aWV3cyB7XG4gICAgICAgIC50cmFuc2l0aW9uKEBwYW5lbHNEdXJhdGlvbik7XG4gICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm07XG4gICAgICAgIC1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTogLW1vei10cmFuc2Zvcm07XG4gICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTtcbiAgICB9XG4gICAgLnBhbmVsLW92ZXJsYXkge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG59XG5ib2R5LndpdGgtcGFuZWwtbGVmdC1yZXZlYWwge1xuICAgIC52aWV3cyB7XG4gICAgICAgIC50cmFuc2xhdGUzZChAcGFuZWxXaWR0aCk7XG4gICAgfVxuICAgIC5wYW5lbC1vdmVybGF5IHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IEBwYW5lbFdpZHRoO1xuICAgIH1cbn1cbmJvZHkud2l0aC1wYW5lbC1sZWZ0LWNvdmVyIHtcbiAgICAucGFuZWwtbGVmdCB7XG4gICAgICAgIC50cmFuc2xhdGUzZChAcGFuZWxXaWR0aCk7XG4gICAgfVxufVxuYm9keS53aXRoLXBhbmVsLXJpZ2h0LXJldmVhbCB7XG4gICAgLnZpZXdzIHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKC1AcGFuZWxXaWR0aCk7XG4gICAgfVxuICAgIC5wYW5lbC1vdmVybGF5IHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IC1AcGFuZWxXaWR0aDtcbiAgICB9XG59XG5ib2R5LndpdGgtcGFuZWwtcmlnaHQtY292ZXIge1xuICAgIC5wYW5lbC1yaWdodCB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgtQHBhbmVsV2lkdGgpO1xuICAgIH1cbn1cbmJvZHkucGFuZWwtY2xvc2luZyB7XG4gICAgLnZpZXdzIHtcbiAgICAgICAgLnRyYW5zaXRpb24oQHBhbmVsc0R1cmF0aW9uKTtcbiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTtcbiAgICAgICAgLW1vei10cmFuc2l0aW9uLXByb3BlcnR5OiAtbW96LXRyYW5zZm9ybTtcbiAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtO1xuICAgIH1cbn0iLCIvKiA9PT0gVGFicyA9PT0gKi9cbi50YWJzIHtcbiAgICAudGFiIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgLnRhYi5hY3RpdmUge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG59XG4udGFicy1hbmltYXRlZC13cmFwIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgPi50YWJzIHtcbiAgICAgICAgLmZsZXhib3goKTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgICAgID4udGFiIHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAuZmxleC1zaHJpbmsoMCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4udGFicy1zd2lwZWFibGUtd3JhcCB7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgID4gLnRhYnMgPiAudGFiIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxufSIsIi8qID09PSBNZXNzYWdlcyA9PT0gKi9cbi5tZXNzYWdlcy1jb250ZW50IHtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xufVxuLm1lc3NhZ2VzIHtcbiAgICAuZmxleGJveCgpO1xuICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XG4gICAgLW1vei1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cbi5tZXNzYWdlcy1kYXRlIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBmb250LXNpemU6IDExcHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgbWFyZ2luOiAxMHB4IDE1cHg7XG4gICAgY29sb3I6ICM4ZThlOTM7XG4gICAgaHRtbC5pb3MtZ3QtOCAmIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICB9XG4gICAgc3BhbiB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgfVxufVxuLm1lc3NhZ2Uge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgbWFyZ2luOiAxcHggMTBweCAwO1xuICAgIG1heC13aWR0aDogNzAlO1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgICAtbW96LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICAgIH1cbiAgICAubWVzc2FnZS10ZXh0IHtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICAgICAgcGFkZGluZzogNnB4IDE2cHggOXB4O1xuICAgICAgICBtaW4td2lkdGg6IDQ4cHg7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDM1cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTdweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMjtcbiAgICAgICAgd29yZC1icmVhazogYnJlYWstd29yZDtcbiAgICAgICAgaW1nIHtcbiAgICAgICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgfVxuICAgIH1cbiAgICAmLm1lc3NhZ2UtcGljIHtcbiAgICAgICAgLm1lc3NhZ2UtdGV4dCB7XG4gICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgfVxuICAgICAgICBpbWcge1xuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4O1xuICAgICAgICB9XG4gICAgfVxufVxuLm1lc3NhZ2UtbmFtZSB7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIGNvbG9yOiAjOGU4ZTkzO1xuICAgIG1hcmdpbi1ib3R0b206IDJweDtcbiAgICBtYXJnaW4tdG9wOiA3cHg7XG4gICAgLm1lc3NhZ2UtaGlkZS1uYW1lICYge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cbi5tZXNzYWdlLWxhYmVsIHtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgY29sb3I6ICM4ZThlOTM7XG4gICAgbWFyZ2luLXRvcDogNHB4O1xuICAgIC5tZXNzYWdlLWhpZGUtbGFiZWwgJiB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxufVxuLm1lc3NhZ2UtYXZhdGFyIHtcbiAgICB3aWR0aDogMjlweDtcbiAgICBoZWlnaHQ6IDI5cHg7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgICBtYXJnaW4tdG9wOiAtMjlweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAxcHg7XG4gICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcbiAgICBvcGFjaXR5OiAxO1xuICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAubWVzc2FnZS1oaWRlLWF2YXRhciAmIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG59XG4ubWVzc2FnZS1kYXRlIHtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgbWFyZ2luLXRvcDogNHB4O1xuICAgIG9wYWNpdHk6IDAuODtcbiAgICAubWVzc2FnZS1waWMgaW1nICsgJiB7XG4gICAgICAgIG1hcmdpbi10b3A6IDhweDtcbiAgICB9XG4gICAgLm1lc3NhZ2Utc2VudCAmIHtcbiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgfVxufVxuLm1lc3NhZ2Utc2VudCB7XG4gICAgLW1zLWZsZXgtaXRlbS1hbGlnbjogZW5kO1xuICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1lbmQ7XG4gICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XG4gICAgLmFsaWduLWl0ZW1zKGZsZXgtZW5kKTtcbiAgICAubWVzc2FnZS1uYW1lIHtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNnB4O1xuICAgIH1cbiAgICAubWVzc2FnZS1sYWJlbCB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogNnB4O1xuICAgIH1cbiAgICAmLm1lc3NhZ2Utd2l0aC1hdmF0YXIge1xuICAgICAgICAubWVzc2FnZS10ZXh0IHtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMjlweDtcbiAgICAgICAgfVxuICAgICAgICAubWVzc2FnZS1uYW1lIHtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogNDVweDtcbiAgICAgICAgfVxuICAgICAgICAubWVzc2FnZS1sYWJlbCB7XG4gICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDM0cHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLm1lc3NhZ2UtdGV4dCB7XG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDIycHg7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMwMGQ0NDk7XG4gICAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgICAgIC13ZWJraXQtbWFzay1ib3gtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LDxzdmcgaGVpZ2h0PSczNScgdmlld0JveD0nMCAwIDk2IDcwJyB3aWR0aD0nNDgnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PHBhdGggZD0nbTg0IDM1YzEgNy01IDM3LTQyIDM1LTM3IDItNDMtMjgtNDItMzUtMS03IDUtMzcgNDItMzUgMzctMiA0MyAyOCA0MiAzNXonLz48L3N2Zz5cIikgNTAlIDU2JSA0NiUgNDIlO1xuICAgIH1cbiAgICAmLm1lc3NhZ2UtbGFzdCwgJi5tZXNzYWdlLXdpdGgtdGFpbCB7XG4gICAgICAgIC5tZXNzYWdlLXRleHQge1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTZweCAxNnB4IDAgMTZweDtcbiAgICAgICAgICAgIC13ZWJraXQtbWFzay1ib3gtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LDxzdmcgaGVpZ2h0PSczNScgdmlld0JveD0nMCAwIDk2IDcwJyB3aWR0aD0nNDgnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PHBhdGggZD0nbTg0IDM1YzEgNy01IDM3LTQyIDM1LTM3IDItNDMtMjgtNDItMzUtMS03IDUtMzcgNDItMzUgMzctMiA0MyAyOCA0MiAzNXonLz48cGF0aCBkPSdtOTYgNzBjLTYtMi0xMi0xMC0xMi0xOXYtMTZsLTE0IDI3czggOCAyNiA4eicvPjwvc3ZnPlwiKSA1MCUgNTYlIDQ2JSA0MiU7XG4gICAgICAgIH1cbiAgICAgICAgJi5tZXNzYWdlLXBpYyBpbWd7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4IDE2cHggMCAxNnB4O1xuICAgICAgICB9XG4gICAgfVxufVxuLm1lc3NhZ2UtcmVjZWl2ZWQge1xuICAgIC1tcy1mbGV4LWl0ZW0tYWxpZ246IHN0YXJ0O1xuICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1zdGFydDtcbiAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xuICAgIC5hbGlnbi1pdGVtcyhmbGV4LXN0YXJ0KTtcbiAgICAubWVzc2FnZS10ZXh0IHtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAyMnB4O1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTVlNWVhO1xuICAgICAgICBjb2xvcjogIzAwMDtcbiAgICAgICAgLXdlYmtpdC1tYXNrLWJveC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyBoZWlnaHQ9JzM1JyB2aWV3Qm94PScwIDAgOTYgNzAnIHdpZHRoPSc0OCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJz48cGF0aCBkPSdtOTYgMzVjMSA3LTUgMzctNDIgMzUtMzcgMi00My0yOC00Mi0zNS0xLTcgNS0zNyA0Mi0zNSAzNy0yIDQzIDI4IDQyIDM1eicvPjwvc3ZnPlwiKSA1MCUgNDIlIDQ2JSA1NiU7XG4gICAgfVxuICAgIC5tZXNzYWdlLW5hbWUge1xuICAgICAgICBtYXJnaW4tbGVmdDogMTZweDtcbiAgICB9XG4gICAgLm1lc3NhZ2UtbGFiZWwge1xuICAgICAgICBtYXJnaW4tbGVmdDogNnB4O1xuICAgIH1cbiAgICAmLm1lc3NhZ2Utd2l0aC1hdmF0YXIge1xuICAgICAgICAubWVzc2FnZS10ZXh0IHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAyOXB4O1xuICAgICAgICB9XG4gICAgICAgIC5tZXNzYWdlLW5hbWUge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDQ1cHg7XG4gICAgICAgIH1cbiAgICAgICAgLm1lc3NhZ2UtbGFiZWwge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDM0cHg7XG4gICAgICAgIH1cbiAgICB9ICAgIFxuICAgICYubWVzc2FnZS1sYXN0LCAmLm1lc3NhZ2Utd2l0aC10YWlsIHtcbiAgICAgICAgLm1lc3NhZ2UtdGV4dCB7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4IDE2cHggMTZweCAwO1xuICAgICAgICAgICAgLXdlYmtpdC1tYXNrLWJveC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyBoZWlnaHQ9JzM1JyB2aWV3Qm94PScwIDAgOTYgNzAnIHdpZHRoPSc0OCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJz48cGF0aCBkPSdtOTYgMzVjMSA3LTUgMzctNDIgMzUtMzcgMi00My0yOC00Mi0zNS0xLTcgNS0zNyA0Mi0zNSAzNy0yIDQzIDI4IDQyIDM1eicvPjxwYXRoIGQ9J20wIDcwYzYtMiAxMi0xMCAxMi0xOXYtMTZsMTQgMjdzLTggOC0yNiA4eicvPjwvc3ZnPlwiKSA1MCUgNDIlIDQ2JSA1NiU7XG4gICAgICAgIH1cbiAgICAgICAgJi5tZXNzYWdlLXBpYyBpbWd7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4IDE2cHggMTZweCAwO1xuICAgICAgICB9XG4gICAgfVxufVxuLm1lc3NhZ2UtbGFzdCB7XG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xufVxuLm1lc3NhZ2UtYXBwZWFyLWZyb20tYm90dG9tIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogbWVzc2FnZUFwcGVhckZyb21Cb3R0b20gNDAwbXM7XG4gICAgYW5pbWF0aW9uOiBtZXNzYWdlQXBwZWFyRnJvbUJvdHRvbSA0MDBtcztcbn1cbi5tZXNzYWdlLWFwcGVhci1mcm9tLXRvcCB7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IG1lc3NhZ2VBcHBlYXJGcm9tVG9wIDQwMG1zO1xuICAgIGFuaW1hdGlvbjogbWVzc2FnZUFwcGVhckZyb21Ub3AgNDAwbXM7ICAgXG59XG4ubWVzc2FnZXMtYXV0by1sYXlvdXQge1xuICAgIC5tZXNzYWdlLW5hbWUsIC5tZXNzYWdlLWxhYmVsIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgLm1lc3NhZ2UtYXZhdGFyIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gICAgLm1lc3NhZ2UtZmlyc3Qge1xuICAgICAgICAubWVzc2FnZS1uYW1lIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5tZXNzYWdlLWxhc3Qge1xuICAgICAgICAubWVzc2FnZS1hdmF0YXIge1xuICAgICAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgfVxuICAgICAgICAubWVzc2FnZS1sYWJlbCB7XG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuICAgIH1cbn1cbmh0bWwucmV0aW5hLmlvcy02IHtcbiAgICAubWVzc2FnZSwgLm1lc3NhZ2UubWVzc2FnZS1waWMgaW1nIHtcbiAgICAgICAgLXdlYmtpdC1tYXNrLWJveC1pbWFnZTpub25lO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4O1xuICAgIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBtZXNzYWdlQXBwZWFyRnJvbUJvdHRvbSB7XG4gICAgZnJvbSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDEwMCUsMCk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59XG5Aa2V5ZnJhbWVzIG1lc3NhZ2VBcHBlYXJGcm9tQm90dG9tIHtcbiAgICBmcm9tIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDEwMCUsMCk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIG1lc3NhZ2VBcHBlYXJGcm9tVG9wIHtcbiAgICBmcm9tIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59XG5Aa2V5ZnJhbWVzIG1lc3NhZ2VBcHBlYXJGcm9tVG9wIHtcbiAgICBmcm9tIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLC0xMDAlLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbn1cbiIsIi8qID09PSBTdGF0dXNiYXIgb3ZlcmxheSA9PT0gKi9cbmh0bWwud2l0aC1zdGF0dXNiYXItb3ZlcmxheSBib2R5e1xuICAgIHBhZGRpbmctdG9wOiAyMHB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLnN0YXR1c2Jhci1vdmVybGF5IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIC5wYW5lbCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAyMHB4O1xuICAgIH1cbn1cbi5zdGF0dXNiYXItb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZDogQHRvb2xiYXJCZztcbiAgICB6LWluZGV4OiAxMDAwMDsgLy8gQSBiaXQgbG93ZXIgdGhhbiAubW9kYWxzLW92ZXJsYXlcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgaGVpZ2h0OiAyMHB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgLnRyYW5zaXRpb24oQHBhbmVsc0R1cmF0aW9uKTtcbn0iLCIvKiA9PT0gUHJlbG9hZGVyID09PSAqL1xuLnByZWxvYWRlciB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAyMHB4O1xuICAgIGhlaWdodDogMjBweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgdmlld0JveD0nMCAwIDEyMCAxMjAnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgeG1sbnM6eGxpbms9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnPjxkZWZzPjxsaW5lIGlkPSdsJyB4MT0nNjAnIHgyPSc2MCcgeTE9JzcnIHkyPScyNycgc3Ryb2tlPScjNmM2YzZjJyBzdHJva2Utd2lkdGg9JzExJyBzdHJva2UtbGluZWNhcD0ncm91bmQnLz48L2RlZnM+PGc+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjI3Jy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjI3JyB0cmFuc2Zvcm09J3JvdGF0ZSgzMCA2MCw2MCknLz48dXNlIHhsaW5rOmhyZWY9JyNsJyBvcGFjaXR5PScuMjcnIHRyYW5zZm9ybT0ncm90YXRlKDYwIDYwLDYwKScvPjx1c2UgeGxpbms6aHJlZj0nI2wnIG9wYWNpdHk9Jy4yNycgdHJhbnNmb3JtPSdyb3RhdGUoOTAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjI3JyB0cmFuc2Zvcm09J3JvdGF0ZSgxMjAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjI3JyB0cmFuc2Zvcm09J3JvdGF0ZSgxNTAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjM3JyB0cmFuc2Zvcm09J3JvdGF0ZSgxODAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjQ2JyB0cmFuc2Zvcm09J3JvdGF0ZSgyMTAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjU2JyB0cmFuc2Zvcm09J3JvdGF0ZSgyNDAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjY2JyB0cmFuc2Zvcm09J3JvdGF0ZSgyNzAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjc1JyB0cmFuc2Zvcm09J3JvdGF0ZSgzMDAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjg1JyB0cmFuc2Zvcm09J3JvdGF0ZSgzMzAgNjAsNjApJy8+PC9nPjwvc3ZnPlwiKTtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1MCU7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IHByZWxvYWRlci1zcGluIDFzIHN0ZXBzKDEyLCBlbmQpIGluZmluaXRlO1xuICAgIGFuaW1hdGlvbjogcHJlbG9hZGVyLXNwaW4gMXMgc3RlcHMoMTIsIGVuZCkgaW5maW5pdGU7XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgcHJlbG9hZGVyLXNwaW4ge1xuICAgIDEwMCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBwcmVsb2FkZXItc3BpbiB7XG4gICAgMTAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgfVxufVxuIiwiLyogPT09IFByb2dyZXNzIEJhciA9PT0gKi9cbi5wcm9ncmVzc2JhciwgLnByb2dyZXNzYmFyLWluZmluaXRlIHtcbiAgICBoZWlnaHQ6IDJweDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBiYWNrZ3JvdW5kOiAjYjZiNmI2O1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICAudHJhbnNmb3JtLW9yaWdpbihjZW50ZXIgdG9wKTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDtcbn1cbi8vIERldGVybWluZWRcbi5wcm9ncmVzc2JhciB7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBzcGFuIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGJhY2tncm91bmQ6IEB0aGVtZUNvbG9yO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICAudHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApO1xuICAgICAgICAudHJhbnNpdGlvbigxNTBtcyk7XG4gICAgfVxufVxuLy8gSW5maW5pdGVcbi5wcm9ncmVzc2Jhci1pbmZpbml0ZSB7XG4gICAgJjpiZWZvcmUge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGJhY2tncm91bmQ6IEB0aGVtZUNvbG9yO1xuICAgICAgICAudHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKGxlZnQgY2VudGVyKTtcbiAgICAgICAgLmFuaW1hdGlvbihwcm9ncmVzc2Jhci1pbmZpbml0ZSAxcyBsaW5lYXIgaW5maW5pdGUpO1xuICAgIH1cbiAgICBodG1sLndpdGgtc3RhdHVzYmFyLW92ZXJsYXkgYm9keSA+ICYsIGh0bWwud2l0aC1zdGF0dXNiYXItb3ZlcmxheSAuZnJhbWV3b3JrNy1yb290ID4gJiB7XG4gICAgICAgIHRvcDogMjBweDtcbiAgICB9XG59XG4vLyBNdWx0aWNvbG9yXG4ucHJvZ3Jlc3NiYXItaW5maW5pdGUuY29sb3ItbXVsdGkge1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgJjpiZWZvcmUge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIHdpZHRoOiA0MDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsICM0Y2Q5NjQsICM1YWM4ZmEsICMwMDdhZmYsICMzNGFhZGMsICM1ODU2ZDYsICNmZjJkNTUsICM1ODU2ZDYsICMzNGFhZGMsICMwMDdhZmYsICM1YWM4ZmEsICM0Y2Q5NjQpO1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICM0Y2Q5NjQsICM1YWM4ZmEsICMwMDdhZmYsICMzNGFhZGMsICM1ODU2ZDYsICNmZjJkNTUsICM1ODU2ZDYsICMzNGFhZGMsICMwMDdhZmYsICM1YWM4ZmEsICM0Y2Q5NjQpO1xuICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDI1JSAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgICAgICAgLmFuaW1hdGlvbihwcm9ncmVzc2Jhci1pbmZpbml0ZS1tdWx0aWNvbG9yIDNzIGxpbmVhciBpbmZpbml0ZSk7XG4gICAgfVxuICAgIGh0bWwud2l0aC1zdGF0dXNiYXItb3ZlcmxheSBib2R5ID4gJiAsIGh0bWwud2l0aC1zdGF0dXNiYXItb3ZlcmxheSAuZnJhbWV3b3JrNy1yb290ID4gJiB7XG4gICAgICAgIHRvcDogMjBweDtcbiAgICB9XG59XG5ib2R5LCAudmlldywgLnZpZXdzLCAucGFnZSwgLnBhbmVsLCAucG9wdXAsIC5mcmFtZXdvcms3LXJvb3Qge1xuICAgID4gLnByb2dyZXNzYmFyLCA+IC5wcm9ncmVzc2Jhci1pbmZpbml0ZSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICB6LWluZGV4OiAxNTAwMDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICB9XG59XG4vLyBBbmltYXRpb25zXG4ucHJvZ3Jlc3NiYXItaW4ge1xuICAgIC5hbmltYXRpb24ocHJvZ3Jlc3NiYXItaW4gMzAwbXMgZm9yd2FyZHMpO1xufVxuLnByb2dyZXNzYmFyLW91dCB7XG4gICAgLmFuaW1hdGlvbihwcm9ncmVzc2Jhci1vdXQgMzAwbXMgZm9yd2FyZHMpO1xufVxuXG5odG1sLndpdGgtc3RhdHVzYmFyLW92ZXJsYXkgYm9keSA+IC5wcm9ncmVzc2JhciB7XG4gICAgdG9wOiAyMHB4O1xufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzYmFyLWluIHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWSgwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVZKDEpO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJvZ3Jlc3NiYXItaW4ge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWSgwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWSgxKTtcbiAgICB9XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgcHJvZ3Jlc3NiYXItb3V0IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWSgxKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVZKDApO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJvZ3Jlc3NiYXItb3V0IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMSk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMCk7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzYmFyLWluZmluaXRlIHtcbiAgICAwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtNTAlLCAwLCAwKSBzY2FsZVgoMC41KTtcbiAgICB9XG4gICAgMTAwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKSBzY2FsZVgoMC41KTtcbiAgICB9XG59XG5Aa2V5ZnJhbWVzIHByb2dyZXNzYmFyLWluZmluaXRlIHtcbiAgICAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTUwJSwgMCwgMCkgc2NhbGVYKDAuNSk7XG4gICAgfVxuICAgIDEwMCUge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApIHNjYWxlWCgwLjUpO1xuICAgIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBwcm9ncmVzc2Jhci1pbmZpbml0ZS1tdWx0aWNvbG9yIHtcbiAgICBmcm9tIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAlLCAwLCAwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTUwJSwgMCwgMCk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBwcm9ncmVzc2Jhci1pbmZpbml0ZS1tdWx0aWNvbG9yIHtcbiAgICBmcm9tIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwJSwgMCwgMCk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtNTAlLCAwLCAwKTtcbiAgICB9XG59IiwiLyogPT09IFN3aXBlciA9PT0gKi9cbi5zd2lwZXItY29udGFpbmVyIHtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gICAgcG9zaXRpb246cmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6aGlkZGVuO1xuICAgIC8qIEZpeCBvZiBXZWJraXQgZmxpY2tlcmluZyAqL1xuICAgIHotaW5kZXg6MTtcbn1cbi5zd2lwZXItY29udGFpbmVyLW5vLWZsZXhib3gge1xuICAgIC5zd2lwZXItc2xpZGUge1xuICAgICAgICBmbG9hdDogbGVmdDtcbiAgICB9XG59XG4uc3dpcGVyLWNvbnRhaW5lci12ZXJ0aWNhbCA+IC5zd2lwZXItd3JhcHBlcntcbiAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgIC1tb3otYm94LW9yaWVudDogdmVydGljYWw7XG4gICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XG4uc3dpcGVyLXdyYXBwZXIge1xuICAgIHBvc2l0aW9uOnJlbGF0aXZlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB6LWluZGV4OiAxO1xuICAgIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICAgIGRpc3BsYXk6IC1tb3otYm94O1xuICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5Oi13ZWJraXQtdHJhbnNmb3JtO1xuICAgIC1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTotbW96LXRyYW5zZm9ybTtcbiAgICAtby10cmFuc2l0aW9uLXByb3BlcnR5Oi1vLXRyYW5zZm9ybTtcbiAgICAtbXMtdHJhbnNpdGlvbi1wcm9wZXJ0eTotbXMtdHJhbnNmb3JtO1xuICAgIHRyYW5zaXRpb24tcHJvcGVydHk6dHJhbnNmb3JtO1xuICAgIFxuICAgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgLW1vei1ib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbn1cbi5zd2lwZXItY29udGFpbmVyLWFuZHJvaWQgLnN3aXBlci1zbGlkZSwgLnN3aXBlci13cmFwcGVyIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwcHgsMCwwKTtcbiAgICAtbW96LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwcHgsMCwwKTtcbiAgICAtby10cmFuc2Zvcm06dHJhbnNsYXRlKDBweCwwcHgpO1xuICAgIC1tcy10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMHB4LDAsMCk7XG4gICAgdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDBweCwwLDApO1xufVxuLnN3aXBlci1jb250YWluZXItbXVsdGlyb3cgPiAuc3dpcGVyLXdyYXBwZXIge1xuICAgIC13ZWJraXQtYm94LWxpbmVzOiBtdWx0aXBsZTtcbiAgICAtbW96LWJveC1saW5lczogbXVsdGlwbGU7XG4gICAgLW1zLWZsZXgtd3JhcDogd3JhcDtcbiAgICAtd2Via2l0LWZsZXgtd3JhcDogd3JhcDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG59XG4uc3dpcGVyLWNvbnRhaW5lci1mcmVlLW1vZGUgPiAuc3dpcGVyLXdyYXBwZXIge1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xuICAgIC1tb3otdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xuICAgIC1tcy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7XG4gICAgLW8tdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xuICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICBtYXJnaW46IDAgYXV0bztcbn1cbi5zd2lwZXItc2xpZGUge1xuICAgIC13ZWJraXQtZmxleC1zaHJpbms6IDA7XG4gICAgLW1zLWZsZXg6IDAgMCBhdXRvO1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4vKiBBdXRvIEhlaWdodCAqL1xuLnN3aXBlci1jb250YWluZXItYXV0b2hlaWdodCwgLnN3aXBlci1jb250YWluZXItYXV0b2hlaWdodCAuc3dpcGVyLXNsaWRlIHtcbiAgICBoZWlnaHQ6IGF1dG87XG59XG4uc3dpcGVyLWNvbnRhaW5lci1hdXRvaGVpZ2h0IC5zd2lwZXItd3JhcHBlciB7XG4gICAgLXdlYmtpdC1ib3gtYWxpZ246IHN0YXJ0O1xuICAgIC1tcy1mbGV4LWFsaWduOiBzdGFydDtcbiAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm0sIGhlaWdodDtcbiAgICAtbW96LXRyYW5zaXRpb24tcHJvcGVydHk6IC1tb3otdHJhbnNmb3JtO1xuICAgIC1vLXRyYW5zaXRpb24tcHJvcGVydHk6IC1vLXRyYW5zZm9ybTtcbiAgICAtbXMtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLW1zLXRyYW5zZm9ybTtcbiAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIGhlaWdodDtcbn1cbi8qIGExMXkgKi9cbi5zd2lwZXItY29udGFpbmVyIC5zd2lwZXItbm90aWZpY2F0aW9uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgb3BhY2l0eTogMDtcbiAgICB6LWluZGV4OiAtMTAwMDtcbn1cblxuLyogSUUxMCBXaW5kb3dzIFBob25lIDggRml4ZXMgKi9cbi5zd2lwZXItd3A4LWhvcml6b250YWwge1xuICAgIC1tcy10b3VjaC1hY3Rpb246IHBhbi15O1xuICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7XG59XG4uc3dpcGVyLXdwOC12ZXJ0aWNhbCB7XG4gICAgLW1zLXRvdWNoLWFjdGlvbjogcGFuLXg7XG4gICAgdG91Y2gtYWN0aW9uOiBwYW4teDtcbn1cbi8qIEFycm93cyAqL1xuLnN3aXBlci1idXR0b24tcHJldiwgLnN3aXBlci1idXR0b24tbmV4dCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNTAlO1xuICAgIHdpZHRoOiAyN3B4O1xuICAgIGhlaWdodDogNDRweDtcbiAgICBtYXJnaW4tdG9wOiAtMjJweDtcbiAgICB6LWluZGV4OiAxMDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgLW1vei1iYWNrZ3JvdW5kLXNpemU6IDI3cHggNDRweDtcbiAgICAtd2Via2l0LWJhY2tncm91bmQtc2l6ZTogMjdweCA0NHB4O1xuICAgIGJhY2tncm91bmQtc2l6ZTogMjdweCA0NHB4O1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICYuc3dpcGVyLWJ1dHRvbi1kaXNhYmxlZCB7XG4gICAgICAgIG9wYWNpdHk6IDAuMzU7XG4gICAgICAgIGN1cnNvcjogYXV0bztcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgfVxufVxuLnN3aXBlci1idXR0b24tcHJldiwgLnN3aXBlci1jb250YWluZXItcnRsIC5zd2lwZXItYnV0dG9uLW5leHQge1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNyA0NCc+PHBhdGggZD0nTTAsMjJMMjIsMGwyLjEsMi4xTDQuMiwyMmwxOS45LDE5LjlMMjIsNDRMMCwyMkwwLDIyTDAsMjJ6JyBmaWxsPScjMDA3YWZmJy8+PC9zdmc+XCIpO1xuICAgIGxlZnQ6IDEwcHg7XG4gICAgcmlnaHQ6IGF1dG87XG59XG4uc3dpcGVyLWJ1dHRvbi1uZXh0LCAuc3dpcGVyLWNvbnRhaW5lci1ydGwgLnN3aXBlci1idXR0b24tcHJldiB7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoXCI8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDI3IDQ0Jz48cGF0aCBkPSdNMjcsMjJMMjcsMjJMNSw0NGwtMi4xLTIuMUwyMi44LDIyTDIuOSwyLjFMNSwwTDI3LDIyTDI3LDIyeicgZmlsbD0nIzAwN2FmZicvPjwvc3ZnPlwiKTtcbiAgICByaWdodDogMTBweDtcbiAgICBsZWZ0OiBhdXRvO1xufVxuXG4vKiBQYWdpbmF0aW9uIFN0eWxlcyAqL1xuLnN3aXBlci1wYWdpbmF0aW9uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogMzAwbXM7XG4gICAgLW1vei10cmFuc2l0aW9uOiAzMDBtcztcbiAgICAtby10cmFuc2l0aW9uOiAzMDBtcztcbiAgICB0cmFuc2l0aW9uOiAzMDBtcztcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAtby10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB6LWluZGV4OiAxMDtcbiAgICAmLnN3aXBlci1wYWdpbmF0aW9uLWhpZGRlbiB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxufVxuLyogQ29tbW9uIFN0eWxlcyAqL1xuLnN3aXBlci1wYWdpbmF0aW9uLWZyYWN0aW9uLCAuc3dpcGVyLXBhZ2luYXRpb24tY3VzdG9tLCAuc3dpcGVyLWNvbnRhaW5lci1ob3Jpem9udGFsID4gLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHN7XG4gICAgYm90dG9tOiAxMHB4O1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG59XG4vKiBCdWxsZXRzICovXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0IHtcbiAgICB3aWR0aDogOHB4O1xuICAgIGhlaWdodDogOHB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xuICAgIGJhY2tncm91bmQ6ICMwMDA7XG4gICAgb3BhY2l0eTogMC4yO1xuICAgIGJ1dHRvbiYge1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgIH1cbiAgICAuc3dpcGVyLXBhZ2luYXRpb24tY2xpY2thYmxlICYge1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxufVxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldC1hY3RpdmUge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgYmFja2dyb3VuZDogIzAwN2FmZjtcbn1cbi5zd2lwZXItY29udGFpbmVyLXZlcnRpY2FsIHtcbiAgICA+IC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRzIHtcbiAgICAgICAgcmlnaHQ6IDEwcHg7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwcHgsLTUwJSwwKTtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMHB4LC01MCUsMCk7XG4gICAgICAgIC1vLXRyYW5zZm9ybTp0cmFuc2xhdGUoMHB4LC01MCUpO1xuICAgICAgICAtbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDBweCwtNTAlLDApO1xuICAgICAgICB0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMHB4LC01MCUsMCk7XG4gICAgICAgIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xuICAgICAgICAgICAgbWFyZ2luOiA1cHggMDtcbiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB9XG4gICAgfVxufVxuLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCB7XG4gICAgPiAuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cyB7XG4gICAgICAgIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xuICAgICAgICAgICAgbWFyZ2luOiAwIDVweDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qIFByb2dyZXNzICovXG4uc3dpcGVyLXBhZ2luYXRpb24tcHJvZ3Jlc3Mge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC4yNSk7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIC5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2JhciB7XG4gICAgICAgIGJhY2tncm91bmQ6ICMwMDdhZmY7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCk7XG4gICAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlKDApO1xuICAgICAgICAtby10cmFuc2Zvcm06IHNjYWxlKDApO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wO1xuICAgICAgICAtbW96LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wO1xuICAgICAgICAtbXMtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7XG4gICAgICAgIC1vLXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wO1xuICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDtcbiAgICB9XG4gICAgLnN3aXBlci1jb250YWluZXItcnRsICYgLnN3aXBlci1wYWdpbmF0aW9uLXByb2dyZXNzYmFyIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7XG4gICAgICAgIC1tb3otdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wO1xuICAgICAgICAtbXMtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wO1xuICAgICAgICAtby10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7XG4gICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IHRvcDtcbiAgICB9XG4gICAgLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCA+ICYge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiA0cHg7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICB9XG4gICAgLnN3aXBlci1jb250YWluZXItdmVydGljYWwgPiAmIHtcbiAgICAgICAgd2lkdGg6IDRweDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgfVxufVxuLyogM0QgQ29udGFpbmVyICovXG4uc3dpcGVyLWNvbnRhaW5lci0zZCB7XG4gICAgLXdlYmtpdC1wZXJzcGVjdGl2ZTogMTIwMHB4O1xuICAgIC1tb3otcGVyc3BlY3RpdmU6IDEyMDBweDtcbiAgICAtby1wZXJzcGVjdGl2ZTogMTIwMHB4O1xuICAgIHBlcnNwZWN0aXZlOiAxMjAwcHg7XG4gICAgLnN3aXBlci13cmFwcGVyLCAuc3dpcGVyLXNsaWRlLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1sZWZ0LCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCwgLnN3aXBlci1zbGlkZS1zaGFkb3ctdG9wLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1ib3R0b20sIC5zd2lwZXItY3ViZS1zaGFkb3cge1xuICAgICAgICAucHJlc2VydmUzZCgpO1xuICAgIH1cbiAgICAuc3dpcGVyLXNsaWRlLXNoYWRvdy1sZWZ0LCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCwgLnN3aXBlci1zbGlkZS1zaGFkb3ctdG9wLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1ib3R0b20ge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgIH1cbiAgICAuc3dpcGVyLXNsaWRlLXNoYWRvdy1sZWZ0IHsgXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgcmlnaHQgdG9wLCBmcm9tKHJnYmEoMCwwLDAsMC41KSksIHRvKHJnYmEoMCwwLDAsMCkpKTsgLyogU2FmYXJpIDQrLCBDaHJvbWUgKi9cbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQocmlnaHQsIHJnYmEoMCwwLDAsMC41KSwgcmdiYSgwLDAsMCwwKSk7IC8qIENocm9tZSAxMCssIFNhZmFyaSA1LjErLCBpT1MgNSsgKi9cbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogICAgLW1vei1saW5lYXItZ3JhZGllbnQocmlnaHQsIHJnYmEoMCwwLDAsMC41KSwgcmdiYSgwLDAsMCwwKSk7IC8qIEZpcmVmb3ggMy42LTE1ICovXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6ICAgICAgLW8tbGluZWFyLWdyYWRpZW50KHJpZ2h0LCByZ2JhKDAsMCwwLDAuNSksIHJnYmEoMCwwLDAsMCkpOyAvKiBPcGVyYSAxMS4xMC0xMi4wMCAqL1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAgICAgICAgIGxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCByZ2JhKDAsMCwwLDAuNSksIHJnYmEoMCwwLDAsMCkpOyAvKiBGaXJlZm94IDE2KywgSUUxMCwgT3BlcmEgMTIuNTArICovXG4gICAgfVxuICAgIC5zd2lwZXItc2xpZGUtc2hhZG93LXJpZ2h0IHsgICAgXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCByaWdodCB0b3AsIGxlZnQgdG9wLCBmcm9tKHJnYmEoMCwwLDAsMC41KSksIHRvKHJnYmEoMCwwLDAsMCkpKTsgLyogU2FmYXJpIDQrLCBDaHJvbWUgKi9cbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSgwLDAsMCwwLjUpLCByZ2JhKDAsMCwwLDApKTsgLyogQ2hyb21lIDEwKywgU2FmYXJpIDUuMSssIGlPUyA1KyAqL1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAgICAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDAsMCwwLDAuNSksIHJnYmEoMCwwLDAsMCkpOyAvKiBGaXJlZm94IDMuNi0xNSAqL1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAgICAgIC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDAsMCwwLDAuNSksIHJnYmEoMCwwLDAsMCkpOyAvKiBPcGVyYSAxMS4xMC0xMi4wMCAqL1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAgICAgICAgIGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLDAsMCwwLjUpLCByZ2JhKDAsMCwwLDApKTsgLyogRmlyZWZveCAxNissIElFMTAsIE9wZXJhIDEyLjUwKyAqLyAgXG4gICAgfVxuICAgIC5zd2lwZXItc2xpZGUtc2hhZG93LXRvcCB7ICBcbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbShyZ2JhKDAsMCwwLDAuNSkpLCB0byhyZ2JhKDAsMCwwLDApKSk7IC8qIFNhZmFyaSA0KywgQ2hyb21lICovXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGJvdHRvbSwgcmdiYSgwLDAsMCwwLjUpLCByZ2JhKDAsMCwwLDApKTsgLyogQ2hyb21lIDEwKywgU2FmYXJpIDUuMSssIGlPUyA1KyAqL1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAgICAtbW96LWxpbmVhci1ncmFkaWVudChib3R0b20sIHJnYmEoMCwwLDAsMC41KSwgcmdiYSgwLDAsMCwwKSk7IC8qIEZpcmVmb3ggMy42LTE1ICovXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6ICAgICAgLW8tbGluZWFyLWdyYWRpZW50KGJvdHRvbSwgcmdiYSgwLDAsMCwwLjUpLCByZ2JhKDAsMCwwLDApKTsgLyogT3BlcmEgMTEuMTAtMTIuMDAgKi9cbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogICAgICAgICBsaW5lYXItZ3JhZGllbnQodG8gdG9wLCByZ2JhKDAsMCwwLDAuNSksIHJnYmEoMCwwLDAsMCkpOyAvKiBGaXJlZm94IDE2KywgSUUxMCwgT3BlcmEgMTIuNTArICovXG4gICAgfVxuICAgIC5zd2lwZXItc2xpZGUtc2hhZG93LWJvdHRvbSB7ICAgXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IGJvdHRvbSwgbGVmdCB0b3AsIGZyb20ocmdiYSgwLDAsMCwwLjUpKSwgdG8ocmdiYSgwLDAsMCwwKSkpOyAvKiBTYWZhcmkgNCssIENocm9tZSAqL1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYmEoMCwwLDAsMC41KSwgcmdiYSgwLDAsMCwwKSk7IC8qIENocm9tZSAxMCssIFNhZmFyaSA1LjErLCBpT1MgNSsgKi9cbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogICAgLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCByZ2JhKDAsMCwwLDAuNSksIHJnYmEoMCwwLDAsMCkpOyAvKiBGaXJlZm94IDMuNi0xNSAqL1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAgICAgIC1vLWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYmEoMCwwLDAsMC41KSwgcmdiYSgwLDAsMCwwKSk7IC8qIE9wZXJhIDExLjEwLTEyLjAwICovXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6ICAgICAgICAgbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjUpLCByZ2JhKDAsMCwwLDApKTsgLyogRmlyZWZveCAxNissIElFMTAsIE9wZXJhIDEyLjUwKyAqL1xuICAgIH1cbn1cbi8qIENvdmVyZmxvdyAqL1xuLnN3aXBlci1jb250YWluZXItY292ZXJmbG93LCAuc3dpcGVyLWNvbnRhaW5lci1mbGlwIHtcbiAgICAuc3dpcGVyLXdyYXBwZXIge1xuICAgICAgICAvKiBXaW5kb3dzIDggSUUgMTAgZml4ICovXG4gICAgICAgIC1tcy1wZXJzcGVjdGl2ZToxMjAwcHg7XG4gICAgfVxufVxuLyogQ3ViZSArIEZsaXAgKi9cbi5zd2lwZXItY29udGFpbmVyLWN1YmUsIC5zd2lwZXItY29udGFpbmVyLWZsaXAge1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIC5zd2lwZXItc2xpZGUge1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgIC1tb3otYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICAtbXMtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgIHotaW5kZXg6IDE7XG4gICAgICAgIC5zd2lwZXItc2xpZGUge1xuICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnN3aXBlci1zbGlkZS1hY3RpdmUge1xuICAgICAgICAmLCAmIC5zd2lwZXItc2xpZGUtYWN0aXZlIHtcbiAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5zd2lwZXItc2xpZGUtc2hhZG93LXRvcCwgLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1sZWZ0LCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCB7XG4gICAgICAgIHotaW5kZXg6IDA7XG4gICAgICAgIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICAtbW96LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgLW1zLWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIH1cbn1cbi8qIEN1YmUgKi9cbi5zd2lwZXItY29udGFpbmVyLWN1YmUge1xuICAgIC5zd2lwZXItc2xpZGUge1xuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogMCAwO1xuICAgICAgICAtbW96LXRyYW5zZm9ybS1vcmlnaW46IDAgMDtcbiAgICAgICAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IDAgMDtcbiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogMCAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgIH1cbiAgICAmLnN3aXBlci1jb250YWluZXItcnRsIC5zd2lwZXItc2xpZGV7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogMTAwJSAwO1xuICAgICAgICAtbW96LXRyYW5zZm9ybS1vcmlnaW46IDEwMCUgMDtcbiAgICAgICAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IDEwMCUgMDtcbiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogMTAwJSAwO1xuICAgIH1cbiAgICAuc3dpcGVyLXNsaWRlLWFjdGl2ZSwgLnN3aXBlci1zbGlkZS1uZXh0LCAuc3dpcGVyLXNsaWRlLXByZXYsIC5zd2lwZXItc2xpZGUtbmV4dCArIC5zd2lwZXItc2xpZGUge1xuICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB9XG4gICAgLnN3aXBlci1jdWJlLXNoYWRvdyB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgYm90dG9tOiAwcHg7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGJhY2tncm91bmQ6ICMwMDA7XG4gICAgICAgIG9wYWNpdHk6IDAuNjtcbiAgICAgICAgLXdlYmtpdC1maWx0ZXI6IGJsdXIoNTBweCk7XG4gICAgICAgIGZpbHRlcjogYmx1cig1MHB4KTtcbiAgICAgICAgei1pbmRleDogMDtcbiAgICB9XG59XG4vKiBGYWRlICovXG4uc3dpcGVyLWNvbnRhaW5lci1mYWRlIHtcbiAgICAmLnN3aXBlci1jb250YWluZXItZnJlZS1tb2RlIHtcbiAgICAgICAgLnN3aXBlci1zbGlkZSB7XG4gICAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICAgICAgICAgIC1tb3otdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xuICAgICAgICAgICAgLW1zLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICAgICAgICAgIC1vLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICAgICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAuc3dpcGVyLXNsaWRlIHtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eTtcbiAgICAgICAgLW1vei10cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5O1xuICAgICAgICAtby10cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5O1xuICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5O1xuICAgICAgICAuc3dpcGVyLXNsaWRlIHtcbiAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5zd2lwZXItc2xpZGUtYWN0aXZlIHtcbiAgICAgICAgJiwgJiAuc3dpcGVyLXNsaWRlLWFjdGl2ZSB7XG4gICAgICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgICAgfVxuICAgIH1cbn1cbi5zd2lwZXItem9vbS1jb250YWluZXIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcblxuICAgIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICAgIGRpc3BsYXk6IC1tb3otYm94O1xuICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuXG4gICAgLXdlYmtpdC1ib3gtcGFjazogY2VudGVyO1xuICAgIC1tb3otYm94LXBhY2s6IGNlbnRlcjtcbiAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7XG4gICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblxuICAgIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7XG4gICAgLW1vei1ib3gtYWxpZ246IGNlbnRlcjtcbiAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xuICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgID4gaW1nLCA+IHN2ZywgPiBjYW52YXMge1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gICAgICAgIG9iamVjdC1maXQ6IGNvbnRhaW47XG4gICAgfVxufVxuLyogU2Nyb2xsYmFyICovXG4uc3dpcGVyLXNjcm9sbGJhciB7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgLW1zLXRvdWNoLWFjdGlvbjogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuMSk7XG4gICAgLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCA+ICYge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDElO1xuICAgICAgICBib3R0b206IDNweDtcbiAgICAgICAgei1pbmRleDogNTA7XG4gICAgICAgIGhlaWdodDogNXB4O1xuICAgICAgICB3aWR0aDogOTglO1xuICAgIH1cbiAgICAuc3dpcGVyLWNvbnRhaW5lci12ZXJ0aWNhbCA+ICYge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OiAzcHg7XG4gICAgICAgIHRvcDogMSU7XG4gICAgICAgIHotaW5kZXg6IDUwO1xuICAgICAgICB3aWR0aDogNXB4O1xuICAgICAgICBoZWlnaHQ6IDk4JTtcbiAgICB9XG59XG4uc3dpcGVyLXNjcm9sbGJhci1kcmFnIHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC41KTtcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xufVxuLnN3aXBlci1zY3JvbGxiYXItY3Vyc29yLWRyYWcge1xuICAgIGN1cnNvcjogbW92ZTtcbn1cbi8qIFByZWxvYWRlciAqL1xuLnN3aXBlci1zbGlkZSAucHJlbG9hZGVyIHtcbiAgICB3aWR0aDogNDJweDtcbiAgICBoZWlnaHQ6IDQycHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDUwJTtcbiAgICB0b3A6IDUwJTtcbiAgICBtYXJnaW4tbGVmdDogLTIxcHg7XG4gICAgbWFyZ2luLXRvcDogLTIxcHg7XG4gICAgei1pbmRleDogMTA7XG59IiwiLyogPT09IENvbHVtbnMgUGlja2VyID09PSAqL1xuLnBpY2tlci1jb2x1bW5zIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDI2MHB4O1xuICAgIHotaW5kZXg6IDExNTAwO1xuICAgICYucGlja2VyLW1vZGFsLWlubGluZSwgLnBvcG92ZXIgJiB7XG4gICAgICAgIGhlaWdodDogMjAwcHg7XG4gICAgfVxuICAgIEBtZWRpYSAob3JpZW50YXRpb246IGxhbmRzY2FwZSkgYW5kIChtYXgtaGVpZ2h0OiA0MTVweCkge1xuICAgICAgICAmOm5vdCgucGlja2VyLW1vZGFsLWlubGluZSkge1xuICAgICAgICAgICAgaGVpZ2h0OiAyMDBweDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi5wb3BvdmVyLnBvcG92ZXItcGlja2VyLWNvbHVtbnMge1xuICAgIHdpZHRoOiAyODBweDtcbn1cbi5waWNrZXItaXRlbXMge1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmp1c3RpZnktY29udGVudChjZW50ZXIpO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgZm9udC1zaXplOiAyNHB4O1xuICAgIC13ZWJraXQtbWFzay1ib3gtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGJvdHRvbSwgdHJhbnNwYXJlbnQsIHRyYW5zcGFyZW50IDUlLCB3aGl0ZSAyMCUsIHdoaXRlIDgwJSwgdHJhbnNwYXJlbnQgOTUlLCB0cmFuc3BhcmVudCk7XG4gICAgLXdlYmtpdC1tYXNrLWJveC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHRvcCwgdHJhbnNwYXJlbnQsIHRyYW5zcGFyZW50IDUlLCB3aGl0ZSAyMCUsIHdoaXRlIDgwJSwgdHJhbnNwYXJlbnQgOTUlLCB0cmFuc3BhcmVudCk7XG59XG4ucGlja2VyLWl0ZW1zLWNvbCB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWF4LWhlaWdodDogMTAwJTtcblxuICAgICYucGlja2VyLWl0ZW1zLWNvbC1sZWZ0IHtcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICB9XG4gICAgJi5waWNrZXItaXRlbXMtY29sLWNlbnRlciB7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICB9XG4gICAgJi5waWNrZXItaXRlbXMtY29sLXJpZ2h0IHtcbiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgfVxuICAgICYucGlja2VyLWl0ZW1zLWNvbC1kaXZpZGVyIHtcbiAgICAgICAgY29sb3I6IzAwMDtcbiAgICAgICAgLmZsZXhib3goKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgfVxufVxuLnBpY2tlci1pdGVtcy1jb2wtd3JhcHBlciB7XG4gICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgIFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xuICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbn1cbi5waWNrZXItaXRlbSB7XG4gICAgaGVpZ2h0OiAzNnB4O1xuICAgIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICAgIHBhZGRpbmc6IDAgMTBweDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIGNvbG9yOiM3MDcyNzQ7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgLnBpY2tlci1pdGVtcy1jb2wtYWJzb2x1dGUgJntcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgICAmLnBpY2tlci1pdGVtLWZhciB7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cbiAgICAmLnBpY2tlci1zZWxlY3RlZCB7XG4gICAgICAgIGNvbG9yOiAjMDAwO1xuICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZTNkKDAsMCwwKSByb3RhdGVYKDBkZWcpKTtcbiAgICB9XG59XG4ucGlja2VyLWNlbnRlci1oaWdobGlnaHQge1xuICAgIGhlaWdodDogMzZweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHRvcDogNTAlO1xuICAgIG1hcmdpbi10b3A6IC0xOHB4O1xuICAgIC5oYWlybGluZSh0b3AsICNhOGFiYjApO1xuICAgIC5oYWlybGluZShib3R0b20sICNhOGFiYjApO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuLy8gM0QgUGlja2VyXG4ucGlja2VyLTNkIHtcbiAgICAucGlja2VyLWl0ZW1zIHtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgLXdlYmtpdC1wZXJzcGVjdGl2ZTogMTIwMHB4O1xuICAgICAgICBwZXJzcGVjdGl2ZTogMTIwMHB4O1xuICAgIH1cbiAgICAucGlja2VyLWl0ZW1zLWNvbCwgLnBpY2tlci1pdGVtcy1jb2wtd3JhcHBlciwgLnBpY2tlci1pdGVtIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgICAgICB0cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgIH1cbiAgICAucGlja2VyLWl0ZW1zLWNvbCB7XG4gICAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIH1cbiAgICAucGlja2VyLWl0ZW0ge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXIgLTExMHB4O1xuICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyIC0xMTBweDtcbiAgICAgICAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7XG4gICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICB9XG59IiwiLyogPT09IE5vdGlmaWNhdGlvbnMgPT09ICovXG5Abm90aWZpY2F0aW9uc0R1cmF0aW9uOiA0NTBtcztcbi5ub3RpZmljYXRpb25zIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgei1pbmRleDogMjAwMDA7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIG1hcmdpbjogMDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gICAgLnRyYW5zaXRpb24oQG5vdGlmaWNhdGlvbnNEdXJhdGlvbik7XG4gICAgLXdlYmtpdC1wZXJzcGVjdGl2ZTogMTIwMHB4O1xuICAgIHBlcnNwZWN0aXZlOiAxMjAwcHg7XG4gICAgcGFkZGluZy10b3A6IDhweDtcbiAgICBwYWRkaW5nLWJvdHRvbTogOHB4O1xuICAgICYubGlzdC1ibG9jayA+IHVsIHtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIG1hcmdpbjogMCBhdXRvO1xuICAgICAgICBtYXgtd2lkdGg6IDU2OHB4ICsgMTZweDtcbiAgICB9XG4gICAgLndpdGgtc3RhdHVzYmFyLW92ZXJsYXkgJiB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAyMHB4O1xuICAgICAgICAudHJhbnNsYXRlM2QoMCwgLTIwcHgsIDApO1xuICAgIH1cbiAgICAuaXRlbS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiA4cHg7XG4gICAgICAgIC5hbGlnbi1pdGVtcyhmbGV4LXN0YXJ0KTtcbiAgICB9XG4gICAgLml0ZW0tdGl0bGUtcm93IHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICAgICAgICAmOmJlZm9yZSB7XG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgICAgdG9wOiAwO1xuICAgICAgICAgICAgaGVpZ2h0OiAzNnB4O1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweCAxMnB4IDAgMDtcbiAgICAgICAgICAgIHotaW5kZXg6IC0xO1xuICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICAgICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tdGl0bGUge1xuICAgICAgICBmb250LXdlaWdodDogNDAwICFpbXBvcnRhbnQ7XG4gICAgICAgIGhlaWdodDogMzZweDtcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDM1cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgaHRtbC5pb3MtZ3QtOCAmIHtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA0MDAgIWltcG9ydGFudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAuaXRlbS1zdWJ0aXRsZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgaHRtbC5pb3MtZ3QtOCAmIHtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tdGV4dCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgfVxuICAgIC5pdGVtLXN1YnRpdGxlLCAuaXRlbS10ZXh0IHtcbiAgICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tY29udGVudCwgLml0ZW0taW5uZXIge1xuICAgICAgICBtaW4taGVpZ2h0OiAwO1xuICAgIH1cbiAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICB9XG4gICAgLml0ZW0tbWVkaWEge1xuICAgICAgICB3aWR0aDogMjBweDtcbiAgICAgICAgaW1nIHtcbiAgICAgICAgICAgIG1heC13aWR0aDogMjBweDtcbiAgICAgICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7XG4gICAgICAgIH1cbiAgICAgICAgaS5pY29uIHtcbiAgICAgICAgICAgIHdpZHRoOiAyMHB4O1xuICAgICAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgICAgICAgLXdlYmtpdC1iYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICAgIH1cbiAgICAgICAgKyAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgICAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGkubm90aWZpY2F0aW9uLWl0ZW0ge1xuICAgICAgICBib3gtc2hhZG93OiAwcHggMHB4IDEwcHggcmdiYSgwLDAsMCwwLjE1KTtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgcGFkZGluZy10b3A6IDA7XG4gICAgICAgIH1cbiAgICAgICAgLml0ZW0tbWVkaWEge1xuICAgICAgICAgICAgcGFkZGluZy10b3A6IDhweDtcbiAgICAgICAgfVxuXG4gICAgfVxuICAgIC5pdGVtLWFmdGVyIHtcbiAgICAgICAgbWFyZ2luLXRvcDogYXV0bztcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogYXV0bztcbiAgICB9XG4gICAgLmNsb3NlLW5vdGlmaWNhdGlvbiB7XG4gICAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgICBoZWlnaHQ6IDIycHg7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB2aWV3Qm94PScwIDAgNDQgNDQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PGcgc3Ryb2tlPSdub25lJyBzdHJva2Utd2lkdGg9JzEnIGZpbGw9J25vbmUnIGZpbGwtcnVsZT0nZXZlbm9kZCc+PHBhdGggZD0nTTIyLjUsMjAuMzc4Njc5NyBMMTQuNzIxODI1NCwxMi42MDA1MDUxIEwxMi42MDA1MDUxLDE0LjcyMTgyNTQgTDIwLjM3ODY3OTcsMjIuNSBMMTIuNjAwNTA1MSwzMC4yNzgxNzQ2IEwxNC43MjE4MjU0LDMyLjM5OTQ5NDkgTDIyLjUsMjQuNjIxMzIwMyBMMzAuMjc4MTc0NiwzMi4zOTk0OTQ5IEwzMi4zOTk0OTQ5LDMwLjI3ODE3NDYgTDI0LjYyMTMyMDMsMjIuNSBMMzIuMzk5NDk0OSwxNC43MjE4MjU0IEwzMC4yNzgxNzQ2LDEyLjYwMDUwNTEgTDIyLjUsMjAuMzc4Njc5NyBaIE0yMiw0NCBDMzQuMTUwMjY0NSw0NCA0NCwzNC4xNTAyNjQ1IDQ0LDIyIEM0NCw5Ljg0OTczNTUgMzQuMTUwMjY0NSwwIDIyLDAgQzkuODQ5NzM1NSwwIDAsOS44NDk3MzU1IDAsMjIgQzAsMzQuMTUwMjY0NSA5Ljg0OTczNTUsNDQgMjIsNDQgWicgZmlsbD0nIzAwMDAwMCc+PC9wYXRoPjwvZz48L3N2Zz5cIik7XG4gICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciB0b3A7XG4gICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICAgIC13ZWJraXQtYmFja2dyb3VuZC1zaXplOiAxMDAlIGF1dG87XG4gICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSBhdXRvO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG9wYWNpdHk6IDAuMjtcbiAgICAgICAgc3BhbiB7XG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICB3aWR0aDogNDRweDtcbiAgICAgICAgICAgIGhlaWdodDogNDRweDtcbiAgICAgICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgICAgIHRvcDogNTAlO1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IC0yMnB4O1xuICAgICAgICAgICAgbWFyZ2luLXRvcDogLTIycHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLm5vdGlmaWNhdGlvbi1pdGVtIHtcbiAgICAgICAgbWF4LXdpZHRoOiA1NjhweDtcbiAgICAgICAgbWFyZ2luOiAwIGF1dG8gOHB4O1xuICAgICAgICAudHJhbnNpdGlvbihAbm90aWZpY2F0aW9uc0R1cmF0aW9uKTtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTAsMjUwLDI1MCwwLjk1KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICAgICAgd2lkdGg6IH5cIi13ZWJraXQtY2FsYygxMDAlIC0gMTZweClcIjtcbiAgICAgICAgd2lkdGg6IH5cIi1tb3otY2FsYygxMDAlIC0gMTZweClcIjtcbiAgICAgICAgd2lkdGg6IH5cImNhbGMoMTAwJSAtIDE2cHgpXCI7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogOHB4O1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5ub3RpZmljYXRpb24taGlkZGVuIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59IiwiLyogPT09IERpc2FibGVkIGVsZW1lbnRzID09PSAqL1xuLmRpc2FibGVkLCBbZGlzYWJsZWRdIHtcbiAgICBvcGFjaXR5OiAwLjU1O1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIC5kaXNhYmxlZCAmLCBbZGlzYWJsZWRdICYge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn0iLCJAaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL19taXhpbnMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9fY29sb3JzLXZhcnMubGVzcycpO1xuXG4vLyBDb2xvcnNcbkB0aGVtZUNvbG9yOiAjREY2NzM3OyAvLyAoMjIzLDEwMyw1NSlcblxuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9pbnRyby5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL2dyaWQubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy92aWV3cy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3BhZ2VzLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvdG9vbGJhcnMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy90b29sYmFycy1wYWdlcy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3NlYXJjaGJhci5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL21lc3NhZ2ViYXIubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9pY29ucy5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvYmFkZ2VzLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9jaGlwcy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL2NvbnRlbnQtYmxvY2subGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9saXN0cy5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvY29udGFjdHMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9mb3Jtcy5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvZmxvYXRpbmctYnV0dG9uLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9hY2NvcmRpb24ubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9jYXJkcy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL21vZGFscy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3BhbmVscy5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvbGF6eS1sb2FkLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvdGFicy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL21lc3NhZ2VzLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3Mvc3RhdHVzYmFyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvcHJlbG9hZGVyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvcHJvZ3Jlc3NiYXIubGVzcycpO1xuLy9AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3B1bGwtdG8tcmVmcmVzaC5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvaW5maW5pdGUtc2Nyb2xsLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9hdXRvY29tcGxldGUubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9zd2lwZXIubGVzcycpO1xuLy9AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3Bob3RvLWJyb3dzZXIubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9waWNrZXIubGVzcycpO1xuLy9AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL2NhbGVuZGFyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3Mvbm90aWZpY2F0aW9ucy5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvbG9naW4tc2NyZWVuLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvZGlzYWJsZWQubGVzcycpO1xuXG4vLyBEaXNhYmxlIHRleHQgc2VsZWN0XG4qIHtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbmlucHV0LCB0ZXh0YXJlYSB7XG4gIC13ZWJraXQtdG91Y2gtY2FsbG91dDpkZWZhdWx0O1xuICAtd2Via2l0LXVzZXItc2VsZWN0OnRleHQ7XG4gIHVzZXItc2VsZWN0OnRleHQ7XG59XG5cbi8vIE1haW4gVG9vbGJhclxuI2VkaXRvci1uYXZiYXIubmF2YmFyIC5yaWdodCBhICsgYSxcbiNlZGl0b3ItbmF2YmFyLm5hdmJhciAubGVmdCBhICsgYSB7XG4gIG1hcmdpbi1sZWZ0OiAwO1xuXG4gIGh0bWw6bm90KC5waG9uZSkgJiB7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gIH1cbn1cblxuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvX21peGlucy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9pb3MvX2NvbnRhaW5lci5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9pb3MvX2RhdGF2aWV3Lmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL2lvcy9fbGlzdHZpZXcubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvaW9zL19idXR0b24ubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvaW9zL19jb250ZXh0bWVudS5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9pb3MvX2NvbG9yLXBhbGV0dGUubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvaW9zL19hYm91dC5sZXNzJyk7XG5cbkBpbXBvcnQgdXJsKCdpb3MvX3NlYXJjaC5sZXNzJyk7XG5AaW1wb3J0IHVybCgnaW9zL19pY29ucy5sZXNzJyk7XG5cbi8vIFRvcCBvZmZzZXRcblxuI2VkaXRvcl9zZGsge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiAwO1xuICB0b3A6IEB0b29sYmFyU2l6ZTtcbiAgYm90dG9tOiAwO1xuICBoZWlnaHQ6IGF1dG87XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIC50cmFuc2l0aW9uKDMwMG1zKTtcbn1cblxuLy8gQWRkIENvbnRhaW5lclxuXG4jYWRkLXRhYmxlLFxuI2FkZC1zaGFwZSB7XG4gIC5wYWdlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICB9XG59XG5cbi8vIFRhYmxlIHN0eWxlc1xuXG4udGFibGUtc3R5bGVzIHtcbiAgLnJvdyB7XG4gICAgJiwgbGkge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbiAgICB9XG4gIH1cblxuICBsaSB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDFweDtcblxuICAgIGltZyB7XG4gICAgICB3aWR0aDogNzBweDtcbiAgICAgIGhlaWdodDogNTBweDtcbiAgICB9XG4gIH1cbn1cblxuLy8gU2hhcGVzXG5cbi5zaGFwZXMge1xuICBsaSB7XG4gICAgd2lkdGg6IDcwcHg7XG4gICAgaGVpZ2h0OiA3MHB4O1xuICAgIG1hcmdpbjogMCAxcHg7XG5cbiAgICAudGh1bWIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgICB9XG4gIH1cbn1cblxuLy8gQnVsbGV0cyBhbmQgbnVtYmVyc1xuXG4uYnVsbGV0cyxcbi5udW1iZXJzIHtcbiAgdWwge1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gIH1cblxuICBsaSB7XG4gICAgd2lkdGg6IDcwcHg7XG4gICAgaGVpZ2h0OiA3MHB4O1xuICAgIG1hcmdpbi1yaWdodDogMXB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjNGM0YzQ7XG4gICAgaHRtbC5waXhlbC1yYXRpby0yICYge1xuICAgICAgYm9yZGVyOiAwLjVweCBzb2xpZCAjYzRjNGM0O1xuICAgIH1cbiAgICBodG1sLnBpeGVsLXJhdGlvLTMgJiB7XG4gICAgICBib3JkZXI6IDAuMzNweCBzb2xpZCAjYzRjNGM0O1xuICAgIH1cblxuICAgICYuYWN0aXZlIHtcbiAgICAgIC8vXG4gICAgfVxuXG4gICAgLnRodW1iIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xuICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcblxuICAgICAgbGFiZWwge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMzQlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBTbGlkZSBsYXlvdXRcblxuLnNsaWRlLWxheW91dCB7XG4gIC5yb3cge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbiAgfVxuXG4gIGxpIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMXB4O1xuXG4gICAgaW1nIHtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDAsMCwwLDAuMTUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBTbGlkZSB0aGVtZVxuXG4uc2xpZGUtdGhlbWUge1xuICAucm93IHtcbiAgICBtYXJnaW4tdG9wOiAxNHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDEycHg7XG5cbiAgICBkaXYge1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgcGFkZGluZzogM3B4O1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwwLDAsMC4xNSk7XG4gICAgICB3aWR0aDogODVweDtcbiAgICAgIGhlaWdodDogMzhweDtcbiAgICB9XG4gIH1cbn1cblxuLy8gQ2hhcnRzXG5cbi5jaGFydC10eXBlcyB7XG4gIGxpIHtcbiAgICB3aWR0aDogNjBweDtcbiAgICBoZWlnaHQ6IDYwcHg7XG4gICAgbWFyZ2luOiA2cHg7XG5cbiAgICAudGh1bWIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG4gICAgfVxuICB9XG59XG5cbi8vIFdvcmthcm91bmQgaW9zIDEwLjNcblxuLnJhbmdlLXNsaWRlciBpbnB1dFt0eXBlPXJhbmdlXTo6LXdlYmtpdC1zbGlkZXItdGh1bWIge1xuICBoZWlnaHQ6IDI4cHg7XG4gIHdpZHRoOiAyOHB4O1xuICBib3JkZXItcmFkaXVzOiAyOHB4O1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjQpO1xuICB6LWluZGV4OiAxMDtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufSIsIi8vIENvbnRhaW5lclxuLnBob25lLmlvcyB7XG4gIC5jb250YWluZXItZWRpdCB7XG4gICAgLm5hdmJhciB7XG4gICAgICAuaGFpcmxpbmUodG9wLCBAdG9vbGJhckJvcmRlckNvbG9yKTtcbiAgICB9XG5cbiAgICAucGFnZS1jb250ZW50IHtcbiAgICAgIC5saXN0LWJsb2NrOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLXRvcDogLTFweDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLmNvbnRhaW5lci1lZGl0LFxuLmNvbnRhaW5lci1hZGQsXG4uY29udGFpbmVyLXNldHRpbmdzIHtcbiAgJi5wb3BvdmVyIHtcbiAgICB3aWR0aDogMzYwcHg7XG4gIH1cbn1cblxuLnNldHRpbmdzIHtcbiAgJi5wb3B1cCxcbiAgJi5wb3BvdmVyIHtcbiAgICAubGlzdC1ibG9jayB7XG5cbiAgICAgIHVsIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAhaW1wb3J0YW50O1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuXG4gICAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgLmhhaXJsaW5lKGJvdHRvbSwgQGxpc3RCbG9ja0JvcmRlckNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgIH1cblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMzBweDtcbiAgICAgIH1cblxuICAgICAgbGk6Zmlyc3QtY2hpbGQgYSxcbiAgICAgIGxpOmxhc3QtY2hpbGQgYSB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAgIWltcG9ydGFudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLFxuICAgIC5wb3BvdmVyLWlubmVyIHtcbiAgICAgID4gLmNvbnRlbnQtYmxvY2sge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIGNvbG9yOiAjMDAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5wb3BvdmVyLXZpZXcge1xuICAgICAgYm9yZGVyLXJhZGl1czogMTNweDtcblxuICAgICAgPiAucGFnZXMge1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxM3B4O1xuICAgICAgfVxuICAgIH1cblxuICAgIC5jb250ZW50LWJsb2NrOmZpcnN0LWNoaWxkIHtcbiAgICAgIG1hcmdpbi10b3A6IDA7XG4gICAgICAuY29udGVudC1ibG9jay1pbm5lciB7XG4gICAgICAgICY6YmVmb3JlIHtcbiAgICAgICAgICBoZWlnaHQ6IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuY2F0ZWdvcmllcyB7XG4gICAgd2lkdGg6IDEwMCU7XG5cbiAgICA+IC5idXR0b25zLXJvdyB7XG4gICAgICB3aWR0aDogMTAwJTtcblxuICAgICAgLmJ1dHRvbiB7XG4gICAgICAgIHBhZGRpbmc6IDAgMXB4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5wb3BvdmVyLWlubmVyIHtcbiAgICBoZWlnaHQ6IDQwMHB4O1xuICB9XG59IiwiLy8gRGF0YSB2aWV3XG5cbi5kYXRhdmlldyB7XG4gICYucGFnZS1jb250ZW50IHtcbiAgICBiYWNrZ3JvdW5kOiBAd2hpdGU7XG4gIH1cblxuICAucm93IHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbiAgfVxuXG4gIHVsIHtcbiAgICBwYWRkaW5nOiAwIDEwcHg7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcblxuICAgIGxpIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gIH1cblxuICAuYWN0aXZlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMTtcblxuICAgICY6OmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgd2lkdGg6IDIycHg7XG4gICAgICBoZWlnaHQ6IDIycHg7XG4gICAgICByaWdodDogLTVweDtcbiAgICAgIGJvdHRvbTogLTVweDtcbiAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PGNpcmNsZSBmaWxsPVwiI2ZmZlwiIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjExXCIvPjxwYXRoIGQ9XCJNMTEsMjFBMTAsMTAsMCwxLDEsMjEsMTEsMTAsMTAsMCwwLDEsMTEsMjFoMFpNMTcuNCw3LjMyTDE3LjA2LDdhMC40OCwwLjQ4LDAsMCwwLS42NywwbC03LDYuODRMNi45NSwxMS4yNGEwLjUxLDAuNTEsMCwwLDAtLjU5LjA4TDYsMTEuNjZhMC41OCwwLjU4LDAsMCwwLDAsLjY1bDMuMTksMy4zNWEwLjM4LDAuMzgsMCwwLDAsLjM5LDBMMTcuNCw4YTAuNDgsMC40OCwwLDAsMCwwLS42N2gwWlwiLz48L2c+PC9zdmc+Jyk7XG4gICAgfVxuICB9XG59IiwiLy8gTGlzdCBleHRlbmRcblxuLml0ZW0tY29udGVudCB7XG4gIC5pdGVtLWFmdGVyIHtcbiAgICAmLnNwbGl0dGVyIHtcbiAgICAgIGNvbG9yOiAjMDAwO1xuXG4gICAgICBsYWJlbCB7XG4gICAgICAgIG1hcmdpbjogMCA1cHg7XG4gICAgICB9XG5cbiAgICAgIC5idXR0b25zLXJvdyB7XG4gICAgICAgIG1pbi13aWR0aDogOTBweDtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi52YWx1ZSB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIG1pbi13aWR0aDogNjBweDtcbiAgICAgIGNvbG9yOiBAYmxhY2s7XG4gICAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIH1cblxuICAgIGlucHV0LmZpZWxkIHtcbiAgICAgIGNvbG9yOiBAdGhlbWVDb2xvcjtcblxuICAgICAgJi5wbGFjZWhvbGRlci1jb2xvcjo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgICAgIGNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgICAgIH1cblxuICAgICAgJi5yaWdodCB7XG4gICAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICYuYnV0dG9ucyB7XG4gICAgLml0ZW0taW5uZXIge1xuICAgICAgcGFkZGluZy10b3A6IDA7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuXG4gICAgICA+IC5yb3cge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG5cbiAgICAgICAgLmJ1dHRvbiB7XG4gICAgICAgICAgZmxleDogMTtcbiAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgaGVpZ2h0OiBpbmhlcml0O1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5pdGVtLWFmdGVyIC5jb2xvci1wcmV2aWV3IHtcbiAgICB3aWR0aDogNzVweDtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgbWFyZ2luLXRvcDogLTNweDtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLDAsMCwwLjE1KSBpbnNldDtcbiAgfVxuXG4gIGkgLmNvbG9yLXByZXZpZXcge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogOHB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tdG9wOiAyMXB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwwLDAsMC4xNSkgaW5zZXQ7XG4gIH1cbn1cblxuLml0ZW0tbGluayB7XG4gICYubm8taW5kaWNhdG9yIHtcbiAgICAuaXRlbS1pbm5lciB7XG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgICAgcGFkZGluZy1yaWdodDogMTVweDtcbiAgICB9XG4gIH1cbn1cblxuLmxpc3QtYmxvY2sge1xuICAuaXRlbS1saW5rLmxpc3QtYnV0dG9uIHtcbiAgICBjb2xvcjogQHRoZW1lQ29sb3I7XG4gIH1cbn0iLCIvLyBBY3RpdmUgYnV0dG9uIGljb24gY29sb3Jcbi5idXR0b24ge1xuICAmLmFjdGl2ZSB7XG4gICAgaS5pY29uIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgfVxuICB9XG59IiwiLy8gQ29udGV4dCBtZW51XG5cbi5kb2N1bWVudC1tZW51IHtcbiAgQGNvbnRleHRNZW51Qmc6IHJnYmEoMCwwLDAsMC45KTtcbiAgQG1vZGFsSGFpcmxpbmVDb2xvcjogcmdiYSgyMzAsMjMwLDIzMCwwLjkpO1xuICBAbW9kYWxCdXR0b25Db2xvciA6IHJnYmEoMjAwLDIwMCwyMDAsMC45KTtcblxuICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29udGV4dE1lbnVCZztcbiAgd2lkdGg6IGF1dG87XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgei1pbmRleDogMTI1MDA7XG5cbiAgLnBvcG92ZXItYW5nbGUge1xuICAgICY6YWZ0ZXIge1xuICAgICAgYmFja2dyb3VuZDogQGNvbnRleHRNZW51Qmc7XG4gICAgfVxuICB9XG5cbiAgLmxpc3QtYmxvY2sge1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xuXG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICB1bCB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUobGVmdCk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDdweCAwIDAgN3B4O1xuICAgICAgfVxuICAgICAgbGk6Zmlyc3QtY2hpbGQgYXtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogN3B4IDAgMCA3cHg7XG4gICAgICB9XG4gICAgfVxuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICB1bCB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUocmlnaHQpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwIDdweCA3cHggMDtcbiAgICAgIH1cbiAgICAgIGxpOmxhc3QtY2hpbGQgYXtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCA3cHggN3B4IDA7XG4gICAgICB9XG4gICAgfVxuICAgICY6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB7XG4gICAgICBsaTpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkIGEsIHVsOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItcmFkaXVzOiA3cHg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLml0ZW0tbGluayB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cbiAgICAgIGh0bWw6bm90KC53YXRjaC1hY3RpdmUtc3RhdGUpICY6YWN0aXZlLCAmLmFjdGl2ZS1zdGF0ZSB7XG4gICAgICAgIC8vLnRyYW5zaXRpb24oMG1zKTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDlkOTtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgIC5oYWlybGluZS1jb2xvcihyaWdodCwgdHJhbnNwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGh0bWwucGhvbmUgJiB7XG4gICAgICAgIHBhZGRpbmc6IDAgMTBweDtcbiAgICAgIH1cblxuICAgICAgJi5saXN0LWJ1dHRvbiB7XG4gICAgICAgIGNvbG9yOiBAd2hpdGU7XG4gICAgICAgIC5oYWlybGluZShyaWdodCwgQG1vZGFsSGFpcmxpbmVDb2xvcik7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExpc3QgaXRlbXNcbiAgICBsaSB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuXG4gICAgLy8gTGFzdC1jaGlsZHNcbiAgICBsaSB7XG4gICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICAubGlzdC1idXR0b24ge1xuICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUocmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAmOmxhc3QtY2hpbGQsICY6bGFzdC1jaGlsZCBsaTpsYXN0LWNoaWxkIHtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUocmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaTpsYXN0LWNoaWxkLCAmOmxhc3QtY2hpbGQgbGkge1xuICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgLmhhaXJsaW5lKHJpZ2h0LCBAbW9kYWxIYWlybGluZUNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAubm8taGFpcmxpbmVzKCk7XG4gICAgLm5vLWhhaXJsaW5lcy1iZXR3ZWVuKClcbiAgfVxufSIsIi8vIENvbG9yIHBhbGV0dGVcblxuLmNvbG9yLXBhbGV0dGUge1xuICBhIHtcbiAgICBmbGV4LWdyb3c6IDE7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1pbi13aWR0aDogMTBweDtcbiAgICBtaW4taGVpZ2h0OiAyNnB4O1xuICAgIG1hcmdpbjogMXB4IDFweCAwIDA7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwwLDAsMC4xNSkgaW5zZXQ7XG5cbiAgICAmLmFjdGl2ZSB7XG4gICAgICAmOmFmdGVyIHtcbiAgICAgICAgY29udGVudDonICc7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHdoaXRlLCAwIDAgMCA0cHggQHRoZW1lQ29sb3I7XG4gICAgICAgIHotaW5kZXg6IDE7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDFweDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLnRyYW5zcGFyZW50IHtcbiAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTtcbiAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHg9JzBweCcgeT0nMHB4JyB2aWV3Qm94PScwIDAgMjIgMjInIHhtbDpzcGFjZT0ncHJlc2VydmUnPjxsaW5lIHN0cm9rZT0nI2ZmMDAwMCcgc3Ryb2tlLWxpbmVjYXA9J3VuZGVmaW5lZCcgc3Ryb2tlLWxpbmVqb2luPSd1bmRlZmluZWQnIGlkPSdzdmdfMScgeTI9JzAnIHgyPScyMicgeTE9JzIyJyB4MT0nMCcgc3Ryb2tlLXdpZHRoPScyJyBmaWxsPSdub25lJy8+PC9zdmc+XCIpO1xuICAgIH1cbiAgfVxuXG4gIC50aGVtZS1jb2xvcnMge1xuICAgIC5pdGVtLWlubmVyIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIH1cbiAgfVxuXG4gIC5zdGFuZGFydC1jb2xvcnMge1xuICAgIC5pdGVtLWlubmVyIHtcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIH1cbiAgfVxufSIsIi8vIEFib3V0XG4uYWJvdXQge1xuICAucGFnZS1jb250ZW50IHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIH1cblxuICAuY29udGVudC1ibG9jazpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luOiAxNXB4IDA7XG4gIH1cblxuICAuY29udGVudC1ibG9jayB7XG4gICAgbWFyZ2luOiAwIGF1dG8gMTVweDtcblxuICAgIGEge1xuICAgICAgY29sb3I6ICMwMDA7XG4gICAgfVxuICB9XG5cbiAgaDMge1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgbWFyZ2luOiAwO1xuXG4gICAgJi52ZW5kb3Ige1xuICAgICAgY29sb3I6ICMwMDA7XG4gICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgIG1hcmdpbi10b3A6IDE1cHg7XG4gICAgfVxuICB9XG5cbiAgcCA+IGxhYmVsIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcbiAgfVxuXG4gIC5sb2dvIHtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2ltZy9hYm91dC9vbmx5b2ZmaWNlLnN2ZycpIG5vLXJlcGVhdCBjZW50ZXI7XG4gICAgbWFyZ2luLXRvcDogMjBweDtcbiAgfVxufSIsIi8vIFNlYXJjaFxuXG4udGFibGV0IHtcbiAgLnNlYXJjaGJhci5kb2N1bWVudCB7XG4gICAgLmNlbnRlciB7XG4gICAgICB3aWR0aDogMTAwJTtcblxuICAgICAgLnNlYXJjaGJhciB7XG4gICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLnJpZ2h0IHtcbiAgICAgIC5wcmV2IHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi5waG9uZSB7XG4gIC5zZWFyY2hiYXIuZG9jdW1lbnQge1xuICAgIC5sZWZ0LFxuICAgIC5jZW50ZXIsXG4gICAgLnJpZ2h0IHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgLmNlbnRlciB7XG4gICAgICB3aWR0aDogMTAwJTtcblxuICAgICAgLnNlYXJjaGJhciB7XG4gICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7XG4gICAgICAgIHBhZGRpbmc6IDA7XG5cbiAgICAgICAgJjphZnRlciB7XG4gICAgICAgICAgY29udGVudDogbm9uZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC5yaWdodCB7XG4gICAgICA+IHAge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi5zZWFyY2hiYXIuZG9jdW1lbnQge1xuICBiYWNrZ3JvdW5kOiBsaWdodGVuKEBzZWFyY2hiYXJCZywgMTAlKTtcbn0iLCIvLyBJY29uc1xuaS5pY29uIHtcbiAgJi5pY29uLXNlYXJjaCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTE1LjgsMTVjMS40LTEuNiwyLjItMy43LDIuMi01LjljMC01LTQtOS05LTlDNCwwLDAsNCwwLDljMCw1LDQsOSw5LDljMi4zLDAsNC40LTAuOSw1LjktMi4ybDUuOCw1LjhsMC4yLTAuNmwwLjctMC4yTDE1LjgsMTV6IE05LDE3Yy00LjQsMC04LTMuNi04LThjMC00LjQsMy42LTgsOC04YzQuNCwwLDgsMy42LDgsOEMxNywxMy41LDEzLjUsMTcsOSwxN3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1idXJnZXIge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHJlY3QgeD1cIjJcIiB5PVwiMTdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMVwiLz48cmVjdCB4PVwiMlwiIHk9XCIxM1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxXCIvPjxyZWN0IHg9XCIyXCIgeT1cIjlcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMVwiLz48cmVjdCB4PVwiMlwiIHk9XCI1XCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjFcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1lZGl0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMCwyMGgyMnYxSDBWMjB6XCIvPjxwb2x5Z29uIHBvaW50cz1cIjE5LjMsNS4zIDYuMSwxOC40IDQuNiwxNi45IDE3LjgsMy44IDE3LjEsMy4xIDMuNSwxNi43IDMsMjAgNi4zLDE5LjUgMTkuOSw1LjkgXHRcIi8+PHBhdGggZD1cIk0yMC41LDUuM0wyMiwzLjhjMCwwLTAuMi0xLjItMC45LTEuOUMyMC40LDEuMSwxOS4yLDEsMTkuMiwxbC0xLjUsMS41TDIwLjUsNS4zelwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXBsYXkge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk00LjA0NjQzNjMsMi45ODg0NTUzYzAuMDA2NTI2LDAuMDAyOTYsMC4wMTQyMzQ1LDAuMDA2ODM1LDAuMDIzMTQzOCwwLjAxMTkwMjEgYzAuNTkwODYwNCwwLjMzNTc2MzcsMTIuNzExODM5Nyw3LjI5MjQ0MzMsMTMuODk3NzQ4OSw4LjAyNjg0MDJjLTAuNTgzMTU4NSwwLjM0MTc3NTktMTMuMDEzNzU4Nyw3LjQ4NzkyNzQtMTMuOTM0NjU5LDcuOTgyNjcyNyBMNC4wNDY0MzYzLDIuOTg4NDU1MyBNMy45ODg5MzU3LDJDMy40NDI3Nzk1LDIuMDAwMDU3NywzLjAwMDUyNSwyLjQ1MzM1NzUsMy4wMDA1MjUsMy4wMTUzNDhcdGMwLDAuNTczNDg3LDAsMTUuMTYzMjk1NywwLDE1Ljk5NDUyMjFDMy4wMDA1MjUsMTkuNjIyOTYzLDMuNDc5NjEwNCwyMCwzLjk5NDA1ODgsMjAgYzAuMTcyOTM3MiwwLDAuMzQ5OTE5MS0wLjA0MjYzMTEsMC41MTM5NzYzLTAuMTMzMjIyNmMwLjg5MDU2MDItMC40OTEwNDUsMTMuMTg4MDg5NC03LjU1ODMzNzIsMTMuOTQwNzM4Ny03Ljk5OTQ0NTkgYzAuNjc1MTIxMy0wLjM5NTUyMDIsMC42ODY3MzEzLTEuMzM3NTEyLDAtMS43MzI2NjAzQzE3LjQwMzE3NTQsOS41MzMzMjcxLDUuMTUyMzg1MiwyLjUwMTg1Miw0LjUzOTM5NTMsMi4xNTM1MTY1IEM0LjM1MjYyMDEsMi4wNDcyNzk0LDQuMTY1NDAxLDEuOTk5OTgxMywzLjk4ODkzNTcsMkwzLjk4ODkzNTcsMnpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi11bmRvIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjIsMTZ2MmgtMXYtMmwwLDBjMC0yLjktMi4xLTUtNS01bDAsMEgxLjlMNSwxNGMwLjEsMC4xLDAuMSwwLjIsMCwwLjNsLTAuNCwwLjRjLTAuMSwwLjEtMC4yLDAuMS0wLjMsMGwtNC4yLTQuMmMtMC4xLTAuMS0wLjEtMC4yLDAtMC4zbDAuNC0wLjRoMC4xTDQuNCw2YzAuMS0wLjEsMC4yLTAuMSwwLjMsMGwwLjUsMC40YzAuMSwwLjEsMC4xLDAuMiwwLDAuM0wxLjksMTBIMTZsMCwwQzE5LjMsMTAsMjIsMTIuNywyMiwxNkwyMiwxNnpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1yZWRvIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMCwxNmMwLTMuMywyLjctNiw2LTZ2MGgxNC4xbC0zLjMtMy4zYy0wLjEtMC4xLTAuMS0wLjIsMC0wLjNMMTcuMyw2YzAuMS0wLjEsMC4yLTAuMSwwLjMsMGwzLjgsMy44YzAsMCwwLjEsMCwwLjEsMGwwLjQsMC40YzAuMSwwLjEsMC4xLDAuMiwwLDAuM2wtNC4yLDQuMmMtMC4xLDAuMS0wLjIsMC4xLTAuMywwbC0wLjQtMC40Yy0wLjEtMC4xLTAuMS0wLjIsMC0wLjNsMy4xLTNINnYwYy0yLjksMC01LDIuMS01LDVoMHYySDBMMCwxNkwwLDE2elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXJlYWRlciB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTE3LDIxSDFWOWg2VjJsMCwwaDEwdjVoMVYxSDYuMkwwLDcuNlYyMmgxOHYtM2gtMVYyMXogTTYsMi44VjhIMS4xTDYsMi44eiBNMTMsOGMtNS4xLDAtOSw1LTksNXM0LjEsNSw5LDVjNSwwLDktNSw5LTVTMTgsOCwxMyw4eiBNOC43LDE1LjVDNi44LDE0LjQsNi40LDEzLDYuNCwxM3MwLjQtMS41LDIuNC0yLjZDOC4zLDExLjIsOCwxMiw4LDEzQzgsMTMuOSw4LjMsMTQuOCw4LjcsMTUuNXogTTEzLDE2LjdjLTIuMSwwLTMuNy0xLjctMy43LTMuN2MwLTIuMSwxLjctMy43LDMuNy0zLjdjMi4xLDAsMy43LDEuNywzLjcsMy43QzE2LjcsMTUuMSwxNS4xLDE2LjcsMTMsMTYuN3ogTTE3LjMsMTUuNWMwLjQtMC43LDAuNy0xLjYsMC43LTIuNWMwLTEtMC4zLTEuOC0wLjctMi42YzIsMS4xLDMuNCwyLjYsMy40LDIuNlMxOS4yLDE0LjQsMTcuMywxNS41eiBNMTMsMTEuN2MtMC43LDAtMS4zLDAuNi0xLjMsMS4zczAuNiwxLjMsMS4zLDEuM3MxLjMtMC42LDEuMy0xLjNTMTMuNywxMS43LDEzLDExLjd6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tZG93bmxvYWQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIi0xIDMgMjIgMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwb2x5Z29uIHBvaW50cz1cIjEwLDUuNiAxMCwyMS4yIDExLDIxLjIgMTEsNS42IDE0LjYsOS4zIDE1LjMsOC41IDEwLjUsMy42IDUuNyw4LjUgNi40LDkuMyBcdFwiLz48cG9seWdvbiBwb2ludHM9XCIxMywxMiAxMywxMyAxOSwxMyAxOSwzMCAyLDMwIDIsMTMgOCwxMyA4LDEyIDEsMTIgMSwxMyAxLDMwIDEsMzEgMjAsMzEgMjAsMzAgMjAsMTMgMjAsMTIgXHRcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1pbmZvIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMTAsMTdoMlY4aC0yVjE3eiBNMTEsMUM1LjUsMSwxLDUuNSwxLDExczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTYuNSwxLDExLDF6IE0xMSwyMGMtNSwwLTktNC05LTlzNC05LDktOXM5LDQsOSw5UzE2LDIwLDExLDIweiBNMTAsN2gyVjVoLTJWN3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1wbHVzIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjIsMTJIMTJ2MTBoLTFWMTJIMXYtMWgxMFYxaDF2MTBoMTBWMTJ6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tc2V0dGluZ3Mge1xuICAgIHdpZHRoOiAyNHB4O1xuICAgIGhlaWdodDogMjRweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xMS44LDNsMC40LDJjMC4xLDAuNywwLjYsMS4xLDEuMywxLjFjMC4zLDAsMC41LTAuMSwwLjctMC4ybDEuOS0xLjJsMS4xLDEuMWwtMS4xLDEuOEMxNS44LDgsMTUuOCw4LjUsMTYsOC45YzAuMiwwLjQsMC41LDAuNywxLDAuOGwyLjEsMC41djEuNkwxNywxMi4yYy0wLjUsMC4xLTAuOCwwLjQtMSwwLjhjLTAuMiwwLjQtMC4xLDAuOSwwLjEsMS4ybDEuMiwxLjlsLTEuMSwxLjFsLTEuOC0xLjFjLTAuMi0wLjItMC41LTAuMi0wLjgtMC4yYy0wLjYsMC0xLjIsMC41LTEuMywxLjFsLTAuNSwyLjFoLTEuNmwtMC40LTJDOS43LDE2LjQsOS4yLDE2LDguNSwxNmMtMC4zLDAtMC41LDAuMS0wLjcsMC4ybC0xLjksMS4ybC0xLjEtMS4xbDEuMS0xLjhjMC4zLTAuNCwwLjMtMC45LDAuMS0xLjNjLTAuMi0wLjQtMC41LTAuNy0xLTAuOGwtMi4xLTAuNXYtMS42bDItMC40YzAuNS0wLjEsMC44LTAuNCwxLTAuOEM2LjEsOC43LDYsOC4yLDUuOCw3LjlsLTEtMmwxLjEtMS4xbDEuOCwxLjFDOCw2LjEsOC4yLDYuMiw4LjUsNi4yYzAuNiwwLDEuMi0wLjUsMS4zLTEuMUwxMC4zLDNIMTEuOCBNMTEsMTUuNWMyLjUsMCw0LjUtMiw0LjUtNC41cy0yLTQuNS00LjUtNC41cy00LjUsMi00LjUsNC41UzguNSwxNS41LDExLDE1LjUgTTEyLjEsMkg5LjlDOS42LDIsOS40LDIuMiw5LjMsMi41TDguOCw0LjljMCwwLjItMC4yLDAuMy0wLjMsMC4zcy0wLjEsMC0wLjItMC4xTDYuMiwzLjhDNi4xLDMuNyw2LDMuNyw1LjgsMy43Yy0wLjEsMC0wLjMsMC0wLjQsMC4xTDMuOCw1LjRjLTAuMSwwLjItMC4yLDAuNSwwLDAuOGwxLjMsMi4xYzAuMSwwLjIsMC4xLDAuNC0wLjIsMC41TDIuNSw5LjNDMi4yLDkuNCwyLDkuNiwyLDkuOXYyLjJjMCwwLjMsMC4yLDAuNSwwLjUsMC42bDIuNCwwLjVjMC4zLDAuMSwwLjQsMC4zLDAuMiwwLjVsLTEuMywyLjFjLTAuMiwwLjItMC4xLDAuNiwwLjEsMC44bDEuNiwxLjZjMC4xLDAuMSwwLjMsMC4yLDAuNCwwLjJzMC4yLDAsMC4zLTAuMUw4LjMsMTdjMC4xLTAuMSwwLjEtMC4xLDAuMi0wLjFzMC4zLDAuMSwwLjMsMC4zbDAuNSwyLjNDOS40LDE5LjgsOS42LDIwLDkuOSwyMGgyLjJjMC4zLDAsMC41LTAuMiwwLjYtMC41bDAuNS0yLjRjMC0wLjIsMC4xLTAuMywwLjMtMC4zYzAuMSwwLDAuMSwwLDAuMiwwLjFsMi4xLDEuM2MwLjEsMC4xLDAuMiwwLjEsMC4zLDAuMWMwLjIsMCwwLjMtMC4xLDAuNC0wLjJsMS42LTEuNmMwLjItMC4yLDAuMi0wLjUsMC4xLTAuOGwtMS4zLTIuMWMtMC4yLTAuMi0wLjEtMC41LDAuMi0wLjVsMi40LTAuNWMwLjMtMC4xLDAuNS0wLjMsMC41LTAuNlY5LjhjMC0wLjMtMC4yLTAuNS0wLjUtMC42bC0yLjQtMC41Yy0wLjMtMC4xLTAuNC0wLjMtMC4yLTAuNWwxLjMtMi4xYzAuMi0wLjIsMC4xLTAuNi0wLjEtMC44bC0xLjYtMS42Yy0wLjEtMC4xLTAuMy0wLjItMC40LTAuMmMtMC4xLDAtMC4yLDAtMC4zLDAuMWwtMi4xLDEuM0MxMy42LDUsMTMuNiw1LDEzLjUsNWMtMC4xLDAtMC4zLTAuMS0wLjMtMC4zbC0wLjUtMi4yQzEyLjYsMi4yLDEyLjQsMiwxMi4xLDJMMTIuMSwyeiBNMTEsMTQuNWMtMS45LDAtMy41LTEuNi0zLjUtMy41UzkuMSw3LjUsMTEsNy41czMuNSwxLjYsMy41LDMuNVMxMi45LDE0LjUsMTEsMTQuNUwxMSwxNC41elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWFib3V0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCItMSA3IDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTIxLDE4LjVjMC0wLjMtMC4xLTAuNi0wLjctMC45bC0yLjYtMS4ybDIuNi0xLjJjMC42LTAuMywwLjctMC42LDAuNy0wLjljMC0wLjMtMC4xLTAuNi0wLjctMC45bC04LjktNC4xYy0wLjctMC40LTEuOS0wLjQtMi44LDBsLTguOSw0LjFDLTAuOSwxMy44LTEsMTQuMS0xLDE0LjNzMC4xLDAuNiwwLjcsMC45bDIuNiwxLjJsLTIuNiwxLjJDLTAuOSwxOC0xLDE4LjQtMSwxOC41YzAsMC4yLDAuMSwwLjYsMC43LDAuOWwyLjUsMS4ybC0yLjUsMS4yQy0wLjksMjIuMS0xLDIyLjUtMSwyMi43YzAsMC4zLDAuMSwwLjYsMC43LDAuOWw4LjksNC4xYzAuNSwwLjIsMC44LDAuMywxLjQsMC4zczEtMC4xLDEuNC0wLjNsOC45LTQuMWMwLjYtMC40LDAuNy0wLjYsMC43LTAuOWMwLTAuMy0wLjEtMC42LTAuNy0wLjlsLTIuNS0xLjJsMi41LTEuMkMyMC45LDE5LjIsMjEsMTguOCwyMSwxOC41eiBNLTAuMiwxNC4zTC0wLjIsMTQuM2MwLDAsMC4xLTAuMSwwLjMtMC4yTDksMTBjMC42LTAuMywxLjUtMC4zLDIsMGw4LjksNC4xYzAuMiwwLjEsMC4zLDAuMiwwLjMsMC4ybDAsMGMwLDAtMC4xLDAuMS0wLjMsMC4yTDExLDE4LjZjLTAuNiwwLjMtMS41LDAuMy0yLDBsLTguOS00LjFDLTAuMSwxNC40LTAuMiwxNC4zLTAuMiwxNC4zeiBNMjAuMiwyMi43TDIwLjIsMjIuN2MwLDAtMC4xLDAuMS0wLjMsMC4yTDExLDI3LjFjLTAuNiwwLjMtMS41LDAuMy0yLDBsLTguOS00LjFjLTAuMi0wLjEtMC4zLTAuMi0wLjMtMC4ybDAsMGMwLDAsMC4xLTAuMSwwLjMtMC4ybDMtMS41bDUuNSwyLjZjMC43LDAuNCwxLjksMC40LDIuOCwwbDUuNS0yLjZsMywxLjVDMjAuMSwyMi43LDIwLjIsMjIuNywyMC4yLDIyLjd6IE0xOS45LDE4LjdMMTEsMjIuOGMtMC42LDAuMy0xLjUsMC4zLTIsMGwtOC45LTQuMWMtMC4yLTAuMS0wLjMtMC4yLTAuMy0wLjJsMCwwYzAsMCwwLjEtMC4xLDAuMy0wLjJsMy0xLjVsNS41LDIuNmMwLjcsMC40LDEuOSwwLjQsMi44LDBsNS41LTIuNmwzLDEuNWMwLjIsMC4xLDAuMywwLjIsMC4zLDAuMmwwLDBDMjAuMiwxOC41LDIwLjEsMTguNiwxOS45LDE4Ljd6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24taGVscCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTExLjYsMS4zYy0zLjMsMC02LDIuOC02LDYuMmMwLjMsMCwwLjcsMCwwLjksMGMwLTIuOSwyLjMtNS4yLDUuMS01LjJzNS4xLDIuMyw1LjEsNS4yYzAsMS43LTEuOSwzLjItMyw0LjNDMTIuOSwxMi42LDExLDE0LjIsMTEsMTZjMCwxLjIsMCwyLjIsMCwyLjdjMC4zLDAsMC42LDAsMC45LDBjMC0wLjYsMC0xLjYsMC0yLjVjMC0xLjQsMS4xLTIuNCwyLjItMy41YzEuNy0xLjUsMy41LTMuMSwzLjUtNS4yQzE3LjYsNC4xLDE0LjksMS4zLDExLjYsMS4zeiBNMTEuNSwyMC4yYy0wLjMsMC0wLjUsMC4yLTAuNSwwLjV2MC44YzAsMC4zLDAuMiwwLjUsMC41LDAuNXMwLjUtMC4yLDAuNS0wLjV2LTAuOEMxMS45LDIwLjQsMTEuNywyMC4yLDExLjUsMjAuMnpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1zZXR1cCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTAsM3YxNmgyMlYzSDB6IE0yMSwxN0gxVjVoMjBWMTd6IE0xNi41LDUuOWwtNy4yLDcuMkw4LjgsMTVINHYxYzAsMCwzLjIsMCw1LDBjMC40LDAsMC4yLDAsMC4yLTAuMmwyLjItMC42TDE4LjcsOEwxNi41LDUuOXogTTkuOSwxMy4xbDYuNS02LjRMMTgsOGwtNi41LDYuNEw5LjksMTMuMXpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi12ZXJzaW9ucyB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiLTEgNyAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xOSwxMmMwLTEuMS0wLjktMi0yLTJjMC0xLjEtMC45LTItMi0ySDVjLTEuMSwwLTIsMC45LTIsMmMtMS4xLDAtMiwwLjktMiwyYy0xLjEsMC0yLDAuOS0yLDJ2MTJjMCwxLjEsMC45LDIsMiwyaDE4YzEuMSwwLDItMC45LDItMlYxNEMyMSwxMi45LDIwLjEsMTIsMTksMTJ6IE01LDloMTBjMC42LDAsMSwwLjQsMSwxSDRDNCw5LjQsNC40LDksNSw5eiBNMywxMWgxNGMwLjYsMCwxLDAuNCwxLDFIMkMyLDExLjQsMi40LDExLDMsMTF6IE0yMCwyNmMwLDAuNi0wLjQsMS0xLDFIMWMtMC42LDAtMS0wLjQtMS0xVjE0YzAtMC42LDAuNC0xLDEtMWgxOGMwLjYsMCwxLDAuNCwxLDFWMjZ6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGV4dC1hZGRpdGlvbmFsIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMTguNSwxNS41Yy0xLjEsMC0yLDAuOS0yLDJzMC45LDIsMiwyczItMC45LDItMlMxOS42LDE1LjUsMTguNSwxNS41eiBNMTguNSwxOC41Yy0wLjYsMC0xLTAuNC0xLTFjMC0wLjYsMC40LTEsMS0xczEsMC40LDEsMUMxOS41LDE4LjEsMTkuMSwxOC41LDE4LjUsMTguNXogTTE4LjUsNy41YzEuMSwwLDItMC45LDItMmMwLTEuMS0wLjktMi0yLTJzLTIsMC45LTIsMkMxNi41LDYuNiwxNy40LDcuNSwxOC41LDcuNXogTTE4LjUsNC41YzAuNiwwLDEsMC40LDEsMXMtMC40LDEtMSwxcy0xLTAuNC0xLTFTMTcuOSw0LjUsMTguNSw0LjV6IE0xOC41LDkuNWMtMS4xLDAtMiwwLjktMiwyczAuOSwyLDIsMnMyLTAuOSwyLTJTMTkuNiw5LjUsMTguNSw5LjV6IE0xOC41LDEyLjVjLTAuNiwwLTEtMC40LTEtMWMwLTAuNiwwLjQtMSwxLTFzMSwwLjQsMSwxQzE5LjUsMTIuMSwxOS4xLDEyLjUsMTguNSwxMi41eiBNNi45LDMuOEwxLDE4LjloMS41bDEuOC00LjdoNi45bDEuNyw0LjdoMS41TDguNiwzLjhINi45eiBNNC43LDEyLjlsMy03LjlsMyw3LjlINC43elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRleHQtY29sb3Ige1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk04LjksMTJsMi4zLTYuM2wyLjIsNi4zSDguOXogTTQuNywxNy44aDJsMS42LTQuM2g1LjZsMS41LDQuM2gyLjFMMTIuMywzLjVoLTIuMkw0LjcsMTcuOHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10ZXh0LXNlbGVjdGlvbiB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTcuNiwxMC4zYzAuMiwwLjMsMC40LDAuNCwwLjUsMC41YzAuMywwLjIsMC42LDAuMywxLDAuM2MwLjcsMCwxLjMtMC4zLDEuNy0wLjhjMC40LTAuNSwwLjYtMS4yLDAuNi0yLjFjMC0wLjktMC4yLTEuNS0wLjYtMmMtMC40LTAuNC0wLjktMC43LTEuNi0wLjdjLTAuMywwLTAuNiwwLjEtMC45LDAuMkM4LDYsNy44LDYuMiw3LjYsNi40VjMuOEg2LjhWMTFoMC44VjEwLjN6IE04LDYuOWMwLjMtMC4zLDAuNy0wLjQsMS4xLTAuNGMwLjUsMCwwLjgsMC4yLDEsMC41YzAuMiwwLjQsMC40LDAuOCwwLjQsMS40YzAsMC42LTAuMSwxLjEtMC40LDEuNWMtMC4yLDAuNC0wLjYsMC42LTEuMSwwLjZjLTAuNiwwLTEuMS0wLjMtMS4zLTAuOUM3LjYsOS4yLDcuNiw4LjgsNy42LDguM0M3LjYsNy43LDcuNyw3LjIsOCw2Ljl6IE01LjcsMTAuNGMtMC4xLDAtMC4yLDAtMC4yLTAuMWMwLTAuMS0wLjEtMC4xLTAuMS0wLjJ2LTNjMC0wLjUtMC4yLTAuOS0wLjYtMS4xQzQuNCw1LjgsNCw1LjYsMy4zLDUuNmMtMC41LDAtMSwwLjEtMS40LDAuNEMxLjUsNi4zLDEuMyw2LjcsMS4zLDcuNGgwLjhjMC0wLjMsMC4xLTAuNSwwLjItMC42YzAuMi0wLjIsMC41LTAuNCwxLTAuNGMwLjQsMCwwLjcsMC4xLDAuOSwwLjJjMC4yLDAuMSwwLjMsMC40LDAuMywwLjdjMCwwLjEsMCwwLjMtMC4xLDAuM0M0LjQsNy43LDQuMyw3LjgsNC4xLDcuOEwyLjcsOEMyLjIsOC4xLDEuOCw4LjIsMS41LDguNUMxLjIsOC44LDEsOS4xLDEsOS42YzAsMC40LDAuMiwwLjgsMC41LDEuMWMwLjMsMC4zLDAuNywwLjQsMS4yLDAuNGMwLjQsMCwwLjgtMC4xLDEuMS0wLjNjMC4zLTAuMiwwLjYtMC40LDAuOC0wLjZjMCwwLjIsMC4xLDAuNCwwLjIsMC41YzAuMSwwLjIsMC40LDAuMywwLjcsMC4zYzAuMSwwLDAuMiwwLDAuMywwYzAuMSwwLDAuMiwwLDAuMy0wLjF2LTAuNmMtMC4xLDAtMC4xLDAtMC4yLDBDNS44LDEwLjQsNS43LDEwLjQsNS43LDEwLjR6IE00LjUsOS4xYzAsMC41LTAuMiwwLjktMC43LDEuMmMtMC4zLDAuMS0wLjYsMC4yLTAuOSwwLjJjLTAuMywwLTAuNS0wLjEtMC43LTAuMkMyLDEwLjEsMiw5LjksMiw5LjZDMiw5LjMsMi4xLDksMi40LDguOWMwLjItMC4xLDAuNC0wLjIsMC43LTAuMmwwLjUtMC4xYzAuMiwwLDAuMy0wLjEsMC41LTAuMWMwLjIsMCwwLjMtMC4xLDAuNC0wLjJWOS4xeiBNMTguNSw1TDguMywxNS4zbC0wLjUsMmMtMC42LDAuNC0xLjMsMC4zLTEuNSwwLjZjLTAuMywwLjQsMC45LDAuNCwxLjUsMC4zYzAuNCwwLDAuNSwwLDAuNS0wLjJsMi4yLTAuNkwyMC43LDcuMUwxOC41LDV6IE05LDE1LjNsOS41LTkuNUwyMCw3LjFsLTkuNSw5LjVMOSwxNS4zelwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWJ1bGxldHMge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk03LDR2MWgxNVY0SDd6IE0xLDZoM1YzSDFWNnogTTcsMTJoMTV2LTFIN1YxMnogTTEsMTNoM3YtM0gxVjEzeiBNNywxOWgxNXYtMUg3VjE5eiBNMSwyMGgzdi0zSDFWMjB6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tbnVtYmVycyB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTcsMy44djFoMTV2LTFIN3ogTTcsMTEuOGgxNXYtMUg3VjExLjh6IE03LDE4LjhoMTV2LTFIN1YxOC44eiBNMy4xLDYuOWgwLjdWMkgzLjNDMy4yLDIuNCwzLjEsMi42LDIuOSwyLjdDMi43LDIuOCwyLjQsMi45LDIsMi45djAuNWgxLjJWNi45eiBNMy4zLDlDMi42LDksMi4xLDkuMiwxLjksOS43Yy0wLjIsMC4zLTAuMiwwLjYtMC4yLDFoMC42YzAtMC4zLDAuMS0wLjUsMC4xLTAuN2MwLjItMC4zLDAuNS0wLjUsMC45LTAuNWMwLjMsMCwwLjUsMC4xLDAuNywwLjNzMC4zLDAuNCwwLjMsMC43YzAsMC4yLTAuMSwwLjUtMC4zLDAuN2MtMC4xLDAuMS0wLjMsMC4zLTAuNiwwLjRsLTAuNywwLjRjLTAuNCwwLjMtMC43LDAuNS0wLjksMC45Yy0wLjIsMC4zLTAuMiwwLjctMC4zLDEuMWgzLjR2LTAuNkgyLjJjMC4xLTAuMiwwLjItMC41LDAuNC0wLjdjMC4xLTAuMSwwLjMtMC4yLDAuNS0wLjRMMy42LDEyYzAuNC0wLjIsMC43LTAuNCwwLjktMC42YzAuMy0wLjMsMC40LTAuNiwwLjQtMWMwLTAuNC0wLjEtMC43LTAuNC0xQzQuMyw5LjEsMy45LDksMy4zLDl6IE00LjEsMTguM2MwLjItMC4xLDAuMy0wLjIsMC40LTAuM2MwLjItMC4yLDAuMi0wLjQsMC4yLTAuN2MwLTAuNC0wLjEtMC43LTAuNC0xQzQsMTYuMSwzLjYsMTYsMy4xLDE2Yy0wLjYsMC0xLjEsMC4yLTEuMywwLjdjLTAuMSwwLjMtMC4yLDAuNi0wLjIsMC45aDAuNmMwLTAuMywwLjEtMC41LDAuMS0wLjZjMC4yLTAuMywwLjQtMC40LDAuOS0wLjRjMC4yLDAsMC40LDAuMSwwLjYsMC4yQzQsMTYuOSw0LjEsMTcsNC4xLDE3LjNjMCwwLjMtMC4xLDAuNi0wLjQsMC43Yy0wLjEsMC4xLTAuMywwLjEtMC42LDAuMWMtMC4xLDAtMC4xLDAtMC4xLDBjMCwwLTAuMSwwLTAuMiwwdjAuNWMwLDAsMC4xLDAsMC4xLDBjMCwwLDAuMSwwLDAuMSwwYzAuNCwwLDAuNywwLjEsMC45LDAuMmMwLjIsMC4xLDAuMywwLjQsMC4zLDAuN2MwLDAuMy0wLjEsMC41LTAuMywwLjdjLTAuMiwwLjItMC41LDAuMy0wLjgsMC4zYy0wLjQsMC0wLjctMC4xLTAuOS0wLjRjLTAuMS0wLjEtMC4yLTAuNC0wLjItMC43SDEuNWMwLDAuNSwwLjEsMC44LDAuNCwxLjJDMi4xLDIwLjgsMi41LDIxLDMuMSwyMWMwLjYsMCwxLTAuMSwxLjMtMC40YzAuMy0wLjMsMC41LTAuNywwLjUtMS4xYzAtMC4zLTAuMS0wLjUtMC4yLTAuN0M0LjUsMTguNSw0LjMsMTguMyw0LjEsMTguM3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1saW5lc3BhY2luZyB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cG9seWdvbiBpZD1cIlhNTElEXzdfXCIgcG9pbnRzPVwiMjIsNCAyMiwzIDEyLDMgMTEsMyAxLDMgMSw0IDExLDQgMTEsNC4zIDgsNy40IDguNyw4LjEgMTEsNS43IDExLDE3LjMgOC43LDE0LjkgOCwxNS42IDExLDE4LjcgMTEsMTkgMSwxOSAxLDIwIDExLDIwIDEyLDIwIDIyLDIwIDIyLDE5IDEyLDE5IDEyLDE4LjYgMTUsMTUuNiAxNC4zLDE0LjkgMTIsMTcuMiAxMiw1LjggMTQuMyw4LjEgMTUsNy40IDEyLDQuNCAxMiw0IFx0XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGV4dC1hbGlnbi1jZW50ZXIge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctbWFzaygnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xLDN2MWgyMVYzSDF6IE00LDd2MWgxNFY3SDR6IE0xLDEyaDIxdi0xSDFWMTJ6IE00LDE1djFoMTR2LTFINHogTTEsMjBoMjF2LTFIMVYyMHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10ZXh0LWFsaWduLWphc3Qge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctbWFzaygnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xLDN2MWgyMVYzSDF6IE0xLDhoMjFWN0gxVjh6IE0xLDEyaDIxdi0xSDFWMTJ6IE0xLDE2aDIxdi0xSDFWMTZ6IE0xLDIwaDIxdi0xSDFWMjB6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGV4dC1hbGlnbi1sZWZ0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLW1hc2soJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMSwzdjFoMjFWM0gxeiBNMTUsN0gxdjFoMTRWN3ogTTEsMTJoMjF2LTFIMVYxMnogTTE1LDE1SDF2MWgxNFYxNXogTTEsMjBoMjF2LTFIMVYyMHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10ZXh0LWFsaWduLXJpZ2h0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLW1hc2soJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMSwzdjFoMjFWM0gxeiBNOCw4aDE0VjdIOFY4eiBNMjIsMTFIMXYxaDIxVjExeiBNOCwxNmgxNHYtMUg4VjE2eiBNMjIsMTlIMXYxaDIxVjE5elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWRlLWluZGVudCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1tYXNrKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTEsMjB2LTFoMjF2MUgxeiBNMTEsMTVoMTF2MUgxMVYxNXogTTExLDExaDExdjFIMTFWMTF6IE0xMSw3aDExdjFIMTFWN3ogTTYuMyw3TDcsNy43bC0zLjgsMy44TDcsMTUuM0w2LjMsMTZMMiwxMS44bC0wLjItMC4zTDIsMTEuMkw2LjMsN3ogTTEsM2gyMXYxSDFWM3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1pbi1pbmRlbnQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctbWFzaygnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xLDIwdi0xaDIxdjFIMXogTTEyLDE2SDF2LTFoMTFWMTZ6IE0xMiwxMkgxdi0xaDExVjEyeiBNMTIsOEgxVjdoMTFWOHogTTIxLDExLjJsMC4yLDAuM0wyMSwxMS44TDE2LjcsMTZMMTYsMTUuM2wzLjgtMy44TDE2LDcuN0wxNi43LDdMMjEsMTEuMnogTTIyLDRIMVYzaDIxVjR6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tcHJldiB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTE2LDIwLjVMMTUsMjEuNUw0LjUsMTFsMCwwbDAsMEwxNSwwLjVMMTYsMS41TDYuNiwxMUwxNiwyMC41elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLW5leHQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xNS41LDExTDYsMS41bDEuMS0xLjFMMTcuNSwxMWwwLDBsMCwwTDcuMSwyMS41TDYsMjAuNUwxNS41LDExelwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWFkZC1jb2x1bW4tbGVmdCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTE1LDE5aC0xSDhIN3YtMXYtM0gwVjJoN2gxaDE0djR2MXYzdjF2M3YxdjN2MUgxNXogTTE1LDE4aDZ2LTNoLTZWMTh6IE0xNSwxNGg2di0zaC02VjE0eiBNOCwxOGg2di0zSDhWMTh6IE04LDE0aDZ2LTNIOFYxNHogTTE0LDEwVjdIOHYzSDE0eiBNOCwzdjNoNlYzSDh6IE0yMSwzaC02djNoNlYzeiBNMTUsN3YzaDZWN0gxNXogTTMsMTZoMXYyaDJ2MUg0djJIM3YtMkgxdi0xaDJWMTZ6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtYWRkLWNvbHVtbi1yaWdodCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTAsMTlsMC0xbDAtM2wwLTFsMC0zbDAtMWwwLTNsMC0xbDAtNGgxNGgxaDd2MTNoLTd2M3YxaC0xSDhIN0gweiBNNywxNUgxdjNoNlYxNXogTTcsMTFIMXYzaDZWMTF6IE0xNCwxNUg4djNoNlYxNXogTTE0LDExSDh2M2g2VjExeiBNMTQsMTBWN0g4djNIMTR6IE04LDN2M2g2VjNIOHogTTEsNmg2VjNIMVY2eiBNMSw3djNoNlY3SDF6IE0xOSwxOGgydjFoLTJ2MmgtMXYtMmgtMnYtMWgydi0yaDFWMTh6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtYWRkLXJvdy1hYm92ZSB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTIxLDIwaC02aC0xSDhIN0gwdi0xdi0zdi0xdi0zdi0xVjhWN1YxaDE1djZoNmgxdjF2M3YxdjN2MXYzdjFIMjF6IE03LDhIMXYzaDZWOHogTTcsMTJIMXYzaDZWMTJ6IE03LDE2SDF2M2g2VjE2eiBNOCwxOWg2di0zSDhWMTl6IE04LDE1aDZ2LTNIOFYxNXogTTgsMTFoNlY4SDhWMTF6IE0yMSw4aC02djNoNlY4eiBNMjEsMTJoLTZ2M2g2VjEyeiBNMjEsMTZoLTZ2M2g2VjE2eiBNMTksNmgtMVY0aC0yVjNoMlYxaDF2MmgydjFoLTJWNnpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1hZGQtcm93LWJlbG93IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjIsMXYxdjN2MXYzdjF2M3YxaC0xaC02djZIMHYtNnYtMXYtM1Y5VjZWNVYyVjFoN2gxaDZoMWg2SDIyeiBNNywxMEgxdjNoNlYxMHogTTcsNkgxdjNoNlY2eiBNNywySDF2M2g2VjJ6IE04LDVoNlYySDhWNXogTTgsOWg2VjZIOFY5eiBNOCwxM2g2di0zSDhWMTN6IE0yMSwxMGgtNnYzaDZWMTB6IE0yMSw2aC02djNoNlY2eiBNMjEsMmgtNnYzaDZWMnogTTE5LDE3aDJ2MWgtMnYyaC0xdi0yaC0ydi0xaDJ2LTJoMVYxN3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1yZW1vdmUtY29sdW1uIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjEsMTloLTZoLTFoLTEuNmMtMC45LDEuOC0yLjcsMy00LjksM3MtNC0xLjItNC45LTNIMUgwdi0xdi0zdi0xdi0zdi0xVjdWNlYzVjJoN2gxaDZoMWg2aDF2MXYzdjF2M3YxdjN2MXYzdjFIMjF6IE03LjUsMTJDNSwxMiwzLDE0LDMsMTYuNVM1LDIxLDcuNSwyMXM0LjUtMiw0LjUtNC41UzEwLDEyLDcuNSwxMnogTTE0LDNIOHYzaDZWM3ogTTE0LDdIOHYzaDZWN3ogTTE0LDExSDh2MC4xYzEuOSwwLjIsMy41LDEuMyw0LjQsMi45SDE0VjExeiBNMTQsMTVoLTEuMmMwLjEsMC41LDAuMiwxLDAuMiwxLjVjMCwwLjUtMC4xLDEtMC4yLDEuNUgxNFYxNXogTTIxLDNoLTZ2M2g2VjN6IE0yMSw3aC02djNoNlY3eiBNMjEsMTFoLTZ2M2g2VjExeiBNMjEsMTVoLTZ2M2g2VjE1eiBNOS42LDE5LjNsLTIuMS0yLjFsLTIuMSwyLjFsLTAuNy0wLjdsMi4xLTIuMWwtMi4xLTIuMWwwLjctMC43bDIuMSwyLjFsMi4xLTIuMWwwLjcsMC43bC0yLjEsMi4xbDIuMSwyLjFMOS42LDE5LjN6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtcmVtb3ZlLXJvdyB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTIxLDE5aC02aC0xaC0xLjZjLTAuOSwxLjgtMi43LDMtNC45LDNzLTQtMS4yLTQuOS0zSDFIMHYtMXYtM3YtMXYtM3YtMVY3VjZWM1YyaDdoMWg2aDFoNmgxdjF2M3YxdjN2MXYzdjF2M3YxSDIxeiBNMSwxOGgxLjJDMi4xLDE3LjUsMiwxNywyLDE2LjVjMC0wLjUsMC4xLTEsMC4yLTEuNUgxVjE4eiBNNywzSDF2M2g2VjN6IE03LDdIMXYzaDZWN3ogTTcuNSwxMkM1LDEyLDMsMTQsMywxNi41UzUsMjEsNy41LDIxczQuNS0yLDQuNS00LjVTMTAsMTIsNy41LDEyeiBNMTQsM0g4djNoNlYzeiBNMTQsN0g4djNoNlY3eiBNMTQsMTVoLTEuMmMwLjEsMC41LDAuMiwxLDAuMiwxLjVjMCwwLjUtMC4xLDEtMC4yLDEuNUgxNFYxNXogTTIxLDNoLTZ2M2g2VjN6IE0yMSw3aC02djNoNlY3eiBNMjEsMTVoLTZ2M2g2VjE1eiBNOS42LDE5LjNsLTIuMS0yLjFsLTIuMSwyLjFsLTAuNy0wLjdsMi4xLTIuMWwtMi4xLTIuMWwwLjctMC43bDIuMSwyLjFsMi4xLTIuMWwwLjcsMC43bC0yLjEsMi4xbDIuMSwyLjFMOS42LDE5LjN6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tZXhwYW5kLWRvd24ge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0yMC41LDYuNWwxLjEsMS4xTDExLDE4bDAsMGwwLDBMMC41LDcuNWwxLjEtMS4xbDkuNSw5LjVMMjAuNSw2LjV6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tcGFnZWJyZWFrIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNOCwxNHYxaDF2LTFIOHogTTYsMTR2MWgxdi0xSDZ6IE0xOCwyMUgzdi02SDJ2N2gxN3YtN2gtMVYyMXogTTQsMTR2MWgxdi0xSDR6IE0xNCwxNHYxaDF2LTFIMTR6IE0xMCwxNHYxaDF2LTFIMTB6IE04LjIsMUwyLDcuNlYxNGgxVjloNlYybDAsMGg5djEyaDFWMUg4LjJ6IE04LDhIMy4xTDgsMi44Vjh6IE0xMiwxNHYxaDF2LTFIMTJ6IE0xNiwxNHYxaDF2LTFIMTZ6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tc2VjdGlvbmJyZWFrIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjAsMTRWMkgzdjEySDJWMWgxOXYxM0gyMHogTTUsMTR2MUg0di0xSDV6IE03LDE0djFINnYtMUg3eiBNOSwxNHYxSDh2LTFIOXogTTExLDE0djFoLTF2LTFIMTF6IE0xMywxNHYxaC0xdi0xSDEzeiBNMTUsMTR2MWgtMXYtMUgxNXogTTE3LDE0djFoLTF2LTFIMTd6IE0xOCwxNGgxdjFoLTFWMTR6IE0zLDIxaDE3di02aDF2N0gydi03aDFWMjF6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tc3RyaW5nYnJlYWsge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xOCwxMkg1LjFMOSwxNS45bC0wLjcsMC43bC00LjUtNC41bC0wLjYtMC42bDAuNi0wLjZsNC41LTQuNUw5LDcuMUw1LjEsMTFIMThWNWgxdjZ2MUgxOHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1wYWdlbnVtYmVyIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNOC4yLDFMMiw3LjZWMjJoMTdWMUg4LjJ6IE04LDIuOFY4SDMuMUw4LDIuOHogTTE4LDIxSDNWOWg2VjJsMCwwaDlWMjF6IE0xMiwxOWgxdi00aC0wLjdjMCwwLjItMC4xLTAuMS0wLjEsMGMtMC4xLDAuMS0wLjIsMC0wLjMsMGMtMC4xLDAuMS0wLjIsMC4xLTAuNCwwLjFjLTAuMSwwLTAuMywwLTAuNCwwVjE2SDEyVjE5eiBNMTUuMywxNy4zQzE1LDE3LjksMTUuMSwxOC40LDE1LDE5aDAuOWMwLTAuMywwLTAuNiwwLjEtMC45YzAuMS0wLjMsMC4xLTAuNiwwLjMtMC45YzAuMS0wLjMsMC4zLTAuNiwwLjQtMC45YzAuMi0wLjMsMC4xLTAuMywwLjMtMC41VjE1aC0zdjFoMS45QzE1LjYsMTYuNCwxNS41LDE2LjcsMTUuMywxNy4zelwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWxpbmsge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xMi40LDkuOGMwLDAtMi4xLTAuMS0zLjgsMS4yYy0yLjgsMi0zLjMsNC4zLTMuMyw0LjNzMS42LTEuNywzLjUtMi41YzEuNy0wLjcsMy43LTAuNCwzLjctMC40djEuOWw0LjgtMy4zVjExbC00LjgtMy4zVjkuOHogTTExLDFDNS41LDEsMSw1LjUsMSwxMWMwLDUuNSw0LjUsMTAsMTAsMTBzMTAtNC41LDEwLTEwQzIxLDUuNSwxNi41LDEsMTEsMXogTTExLDIwYy01LDAtOS00LjEtOS05QzIsNiw2LDIsMTEsMnM5LDQuMSw5LDlDMjAsMTYsMTYsMjAsMTEsMjB6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24taW1hZ2UtbGlicmFyeSB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCI+PGRlZnM+PHN0eWxlPi5jbHMtMXtpc29sYXRpb246aXNvbGF0ZTt9LmNscy0ye29wYWNpdHk6MC4yO30uY2xzLTN7ZmlsbDojZmZmO30uY2xzLTEwLC5jbHMtMTEsLmNscy00LC5jbHMtNiwuY2xzLTcsLmNscy04LC5jbHMtOXttaXgtYmxlbmQtbW9kZTptdWx0aXBseTt9LmNscy00e2ZpbGw6dXJsKCNncmFkXzgpO30uY2xzLTV7ZmlsbDp1cmwoI2dyYWRfMTApO30uY2xzLTZ7ZmlsbDp1cmwoI2dyYWRfMTIpO30uY2xzLTd7ZmlsbDp1cmwoI2dyYWRfMTQpO30uY2xzLTh7ZmlsbDp1cmwoI2dyYWRfNzkpO30uY2xzLTl7ZmlsbDp1cmwoI2dyYWRfNzcpO30uY2xzLTEwe2ZpbGw6dXJsKCNncmFkXzc1KTt9LmNscy0xMXtmaWxsOnVybCgjZ3JhZF84MSk7fTwvc3R5bGU+PGxpbmVhckdyYWRpZW50IGlkPVwiZ3JhZF84XCIgeDE9XCIxMS4wOFwiIHkxPVwiMTAuMjZcIiB4Mj1cIjExLjA4XCIgeTI9XCIxLjI2XCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+PHN0b3Agb2Zmc2V0PVwiMFwiIHN0b3AtY29sb3I9XCIjZjNlOTE2XCIvPjxzdG9wIG9mZnNldD1cIjFcIiBzdG9wLWNvbG9yPVwiI2Y4OWQzNFwiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD1cImdyYWRfMTBcIiB4MT1cIjExLjA4XCIgeTE9XCIyMC40NFwiIHgyPVwiMTEuMDhcIiB5Mj1cIjExLjg4XCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+PHN0b3Agb2Zmc2V0PVwiMFwiIHN0b3AtY29sb3I9XCIjNWViNmU4XCIvPjxzdG9wIG9mZnNldD1cIjFcIiBzdG9wLWNvbG9yPVwiIzk1OGNjM1wiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD1cImdyYWRfMTJcIiB4MT1cIjEuNDZcIiB5MT1cIjExLjA1XCIgeDI9XCIxMC40NlwiIHkyPVwiMTEuMDVcIiBncmFkaWVudFRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxNyA1LjA5KSByb3RhdGUoOTApXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+PHN0b3Agb2Zmc2V0PVwiMFwiIHN0b3AtY29sb3I9XCIjY2M4ZGJhXCIvPjxzdG9wIG9mZnNldD1cIjFcIiBzdG9wLWNvbG9yPVwiI2Y4Njg2N1wiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD1cImdyYWRfMTRcIiB4MT1cIjExLjczXCIgeTE9XCIxMS4wNVwiIHgyPVwiMjAuNzNcIiB5Mj1cIjExLjA1XCIgZ3JhZGllbnRUcmFuc2Zvcm09XCJ0cmFuc2xhdGUoMjcuMjggLTUuMTgpIHJvdGF0ZSg5MClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj48c3RvcCBvZmZzZXQ9XCIwXCIgc3RvcC1jb2xvcj1cIiM2YWMwN2ZcIi8+PHN0b3Agb2Zmc2V0PVwiMVwiIHN0b3AtY29sb3I9XCIjYzVkYTNkXCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPVwiZ3JhZF83OVwiIHgxPVwiMTEuNzRcIiB5MT1cIjEwLjQyXCIgeDI9XCIxNy41MlwiIHkyPVwiNC42M1wiIGdyYWRpZW50VHJhbnNmb3JtPVwidHJhbnNsYXRlKDMwLjI5IDIuNTEpIHJvdGF0ZSgxMzUpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+PHN0b3Agb2Zmc2V0PVwiMFwiIHN0b3AtY29sb3I9XCIjYzVkYTNkXCIvPjxzdG9wIG9mZnNldD1cIjFcIiBzdG9wLWNvbG9yPVwiI2YzZTkxNlwiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD1cImdyYWRfNzdcIiB4MT1cIjQuN1wiIHkxPVwiMTcuNDlcIiB4Mj1cIjEwLjQ4XCIgeTI9XCIxMS43MVwiIGdyYWRpZW50VHJhbnNmb3JtPVwidHJhbnNsYXRlKDIzLjI0IDE5LjY1KSByb3RhdGUoMTM1KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPjxzdG9wIG9mZnNldD1cIjBcIiBzdG9wLWNvbG9yPVwiIzk1OTVjM1wiLz48c3RvcCBvZmZzZXQ9XCIxXCIgc3RvcC1jb2xvcj1cIiNjYzhkYmFcIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9XCJncmFkXzc1XCIgeDE9XCI0LjY5XCIgeTE9XCI0LjY0XCIgeDI9XCIxMC40N1wiIHkyPVwiMTAuNDJcIiBncmFkaWVudFRyYW5zZm9ybT1cInRyYW5zbGF0ZSg3LjU0IC0zLjE1KSByb3RhdGUoNDUpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+PHN0b3Agb2Zmc2V0PVwiMFwiIHN0b3AtY29sb3I9XCIjZjg2ODY3XCIvPjxzdG9wIG9mZnNldD1cIjFcIiBzdG9wLWNvbG9yPVwiI2Y4OWQzNFwiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD1cImdyYWRfODFcIiB4MT1cIjExLjc3XCIgeTE9XCIxMS43OFwiIHgyPVwiMTcuNTVcIiB5Mj1cIjE3LjU2XCIgZ3JhZGllbnRUcmFuc2Zvcm09XCJ0cmFuc2xhdGUoMTQuNjMgLTYuMDUpIHJvdGF0ZSg0NSlcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj48c3RvcCBvZmZzZXQ9XCIwXCIgc3RvcC1jb2xvcj1cIiM1ZWMwZThcIi8+PHN0b3Agb2Zmc2V0PVwiMVwiIHN0b3AtY29sb3I9XCIjNmFjMDdmXCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjx0aXRsZT5pY29uc19mb3Jfc3ZnPC90aXRsZT48ZyBjbGFzcz1cImNscy0xXCI+PGcgaWQ9XCLQodC70L7QuV8xXCIgZGF0YS1uYW1lPVwi0KHQu9C+0LkgMVwiPjxyZWN0IGNsYXNzPVwiY2xzLTJcIiB4PVwiMC4wOVwiIHk9XCIwLjAxXCIgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCIgcng9XCI0XCIgcnk9XCI0XCIvPjxyZWN0IGNsYXNzPVwiY2xzLTNcIiB4PVwiMC41N1wiIHk9XCIwLjQ5XCIgd2lkdGg9XCIyMS4wNFwiIGhlaWdodD1cIjIxLjA0XCIgcng9XCIzLjZcIiByeT1cIjMuNlwiLz48cmVjdCBjbGFzcz1cImNscy00XCIgeD1cIjguMzNcIiB5PVwiMS4yNlwiIHdpZHRoPVwiNS41XCIgaGVpZ2h0PVwiOVwiIHJ4PVwiMi41XCIgcnk9XCIyLjVcIi8+PHJlY3QgY2xhc3M9XCJjbHMtNVwiIHg9XCI4LjMzXCIgeT1cIjExLjc2XCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiLz48cmVjdCBjbGFzcz1cImNscy02XCIgeD1cIjMuMjFcIiB5PVwiNi41NVwiIHdpZHRoPVwiNS41XCIgaGVpZ2h0PVwiOVwiIHJ4PVwiMi41XCIgcnk9XCIyLjVcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTUuMDkgMTcpIHJvdGF0ZSgtOTApXCIvPjxyZWN0IGNsYXNzPVwiY2xzLTdcIiB4PVwiMTMuNDhcIiB5PVwiNi41NVwiIHdpZHRoPVwiNS41XCIgaGVpZ2h0PVwiOVwiIHJ4PVwiMi41XCIgcnk9XCIyLjVcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNS4xOCAyNy4yOCkgcm90YXRlKC05MClcIi8+PHJlY3QgY2xhc3M9XCJjbHMtOFwiIHg9XCIxMS44N1wiIHk9XCIzLjAzXCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxOS42NCAyMy4xOSkgcm90YXRlKC0xMzUpXCIvPjxyZWN0IGNsYXNzPVwiY2xzLTlcIiB4PVwiNC44XCIgeT1cIjEwLjE0XCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgyLjU0IDMwLjMzKSByb3RhdGUoLTEzNSlcIi8+PHJlY3QgY2xhc3M9XCJjbHMtMTBcIiB4PVwiNC44M1wiIHk9XCIzLjAzXCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMy4xIDcuNTYpIHJvdGF0ZSgtNDUpXCIvPjxyZWN0IGNsYXNzPVwiY2xzLTExXCIgeD1cIjExLjg3XCIgeT1cIjEwLjE0XCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNi4wNyAxNC42Mykgcm90YXRlKC00NSlcIi8+PC9nPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gICYuaWNvbi10ZXh0LXZhbGlnbi10b3Age1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctbWFzaygnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHJlY3QgY2xhc3M9XCJjbHMtMVwiIHg9XCIyXCIgeT1cIjJcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMVwiLz48cmVjdCBjbGFzcz1cImNscy0xXCIgeD1cIjJcIiB5PVwiNFwiIHdpZHRoPVwiMTlcIiBoZWlnaHQ9XCIxXCIvPjxwb2x5Z29uIGNsYXNzPVwiY2xzLTFcIiBwb2ludHM9XCIxMiAxOCAxMSAxOCAxMSA3LjgzIDguNjUgOS44IDggOC45NCAxMS41IDYgMTUgOSAxNC4zNSA5LjggMTIgNy44MyAxMiAxOFwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRleHQtdmFsaWduLW1pZGRsZSB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1tYXNrKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cmVjdCBjbGFzcz1cImNscy0xXCIgeD1cIjJcIiB5PVwiMTBcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMVwiLz48cmVjdCBjbGFzcz1cImNscy0xXCIgeD1cIjJcIiB5PVwiMTJcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMVwiLz48cG9seWdvbiBjbGFzcz1cImNscy0xXCIgcG9pbnRzPVwiMTEgMiAxMiAyIDEyIDcuMTcgMTQuMzUgNS4yIDE1IDYuMDYgMTEuNSA5IDggNiA4LjY1IDUuMiAxMSA3LjE3IDExIDJcIi8+PHBvbHlnb24gY2xhc3M9XCJjbHMtMVwiIHBvaW50cz1cIjEyIDIxIDExIDIxIDExIDE1LjgzIDguNjUgMTcuOCA4IDE2Ljk0IDExLjUgMTQgMTUgMTcgMTQuMzUgMTcuOCAxMiAxNS44MyAxMiAyMVwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRleHQtdmFsaWduLWJvdHRvbSB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1tYXNrKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cmVjdCBjbGFzcz1cImNscy0xXCIgeD1cIjJcIiB5PVwiMThcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMVwiLz48cmVjdCBjbGFzcz1cImNscy0xXCIgeD1cIjJcIiB5PVwiMjBcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMVwiLz48cG9seWdvbiBjbGFzcz1cImNscy0xXCIgcG9pbnRzPVwiMTEgNCAxMiA0IDEyIDE1LjE3IDE0LjM1IDEzLjIgMTUgMTQuMDYgMTEuNSAxNyA4IDE0IDguNjUgMTMuMiAxMSAxNS4xNyAxMSA0XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gIC8vIFByZXNldHMgb2YgdGFibGUgYm9yZGVyc1xuXG4gICYuaWNvbi10YWJsZS1ib3JkZXJzLWFsbCB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0yNi45LDBIMFYyN0gyN1YwSDI2LjlaTTEzLDI2SDFWMTRIMTNWMjZabTAtMTNIMVYxSDEzVjEzWk0yNiwyNkgxNFYxNEgyNlYyNlptMC0xM0gxNFYxSDI2VjEzWlwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtbm9uZSB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMjYuOSwwSDBWMjdIMjdWMEgyNi45Wk0xMywyNkgxVjE0SDEzVjI2Wm0wLTEzSDFWMUgxM1YxM1pNMjYsMjZIMTRWMTRIMjZWMjZabTAtMTNIMTRWMUgyNlYxM1pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1ib3JkZXJzLWlubmVyIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cG9seWdvbiBwb2ludHM9XCIyNiAxMyAxNCAxMyAxNCAxIDEzIDEgMTMgMTMgMSAxMyAxIDE0IDEzIDE0IDEzIDI2IDE0IDI2IDE0IDE0IDI2IDE0IDI2IDEzXCIvPjxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTI3LDBIMFYyN0gyN1YwWk0xLDI2VjFIMjZWMjZIMVpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1ib3JkZXJzLW91dGVyIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTI3LDBIMFYyN0gyN1YwWk0xLDI2VjFIMjZWMjZIMVpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1ib3JkZXJzLWxlZnQge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTI3LDBIMFYyN0gyN1YwWk0xLDI2VjFIMjZWMjZIMVpcIi8+PHJlY3Qgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMjdcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1ib3JkZXJzLWNlbnRlciB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMjcsMEgwVjI3SDI3VjBaTTEsMjZWMUgyNlYyNkgxWlwiLz48cmVjdCB4PVwiMTNcIiB3aWR0aD1cIjFcIiBoZWlnaHQ9XCIyN1wiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtcmlnaHQge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTI3LDBIMFYyN0gyN1YwWk0xLDI2VjFIMjZWMjZIMVpcIi8+PHJlY3QgeD1cIjI2XCIgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMjdcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1ib3JkZXJzLXRvcCB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMjcsMEgwVjI3SDI3VjBaTTEsMjZWMUgyNlYyNkgxWlwiLz48cmVjdCB3aWR0aD1cIjI3XCIgaGVpZ2h0PVwiMVwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtbWlkZGxlIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBvcGFjaXR5PVwiMC4zXCIgZD1cIk0yNywwSDBWMjdIMjdWMFpNMSwyNlYxSDI2VjI2SDFaXCIvPjxyZWN0IHk9XCIxM1wiIHdpZHRoPVwiMjdcIiBoZWlnaHQ9XCIxXCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtYm9yZGVycy1ib3R0b20ge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTI3LDBIMFYyN0gyN1YwWk0xLDI2VjFIMjZWMjZIMVpcIi8+PHJlY3QgeT1cIjI2XCIgd2lkdGg9XCIyN1wiIGhlaWdodD1cIjFcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgLy8gUmVvcmRlclxuXG4gICYuaWNvbi1tb3ZlLWJhY2t3YXJkIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cmVjdCBvcGFjaXR5PVwiMC4zXCIgeD1cIjFcIiB5PVwiMVwiIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxN1wiLz48cGF0aCBkPVwiTTEwLDEwVjI3SDI3VjEwSDEwWk0yNiwyNkgxMVYxMUgyNlYyNlpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1tb3ZlLWZvcndhcmQge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTEwLDEwVjI3SDI3VjEwSDEwWk0yNiwyNkgxMVYxMUgyNlYyNlpcIi8+PHJlY3QgeD1cIjFcIiB5PVwiMVwiIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxN1wiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLW1vdmUtYmFja2dyb3VuZCB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHJlY3Qgb3BhY2l0eT1cIjAuM1wiIHg9XCI4XCIgeT1cIjhcIiB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIi8+PHBhdGggZD1cIk0xLDFWMTNIMTNWMUgxWk0xMiwxMkgyVjJIMTJWMTJaXCIvPjxwYXRoIGQ9XCJNMTUsMTVWMjdIMjdWMTVIMTVaTTI2LDI2SDE2VjE2SDI2VjI2WlwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLW1vdmUtZm9yZWdyb3VuZCB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMSwxVjEzSDEzVjFIMVpNMTIsMTJIMlYySDEyVjEyWlwiLz48cGF0aCBvcGFjaXR5PVwiMC4zXCIgZD1cIk0xNSwxNVYyN0gyN1YxNUgxNVpNMjYsMjZIMTZWMTZIMjZWMjZaXCIvPjxyZWN0IHg9XCI4XCIgeT1cIjhcIiB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLWFsaWduLWxlZnQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPi5zdDB7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7fTwvc3R5bGU+PGc+PGcgaWQ9XCJYTUxJRF8zNV9cIj48cGF0aCBpZD1cIlhNTElEXzM2X1wiIGNsYXNzPVwic3QwXCIgZD1cIk0xLDIxaDFWMUgxVjIxeiBNNCwxM3Y0aDE2di00SDR6IE0xMiw1SDR2NGg4VjV6XCIvPjwvZz48L2c+PC9zdmc+Jyk7XG4gIH1cblxuICAmLmljb24tYWxpZ24tY2VudGVyIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjIgMjI7XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4uc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO308L3N0eWxlPjxnIGlkPVwiWE1MSURfNV9cIj48ZyBpZD1cIlhNTElEXzI0X1wiPjxwb2x5Z29uIGlkPVwiWE1MSURfMjVfXCIgY2xhc3M9XCJzdDBcIiBwb2ludHM9XCIxOSwxMyAxMSwxMyAxMSw5IDE1LDkgMTUsNSAxMSw1IDExLDEgMTAsMSAxMCw1IDYsNSA2LDkgMTAsOSAxMCwxMyAyLDEzIDIsMTcgMTAsMTcgMTAsMjEgMTEsMjEgMTEsMTcgMTksMTcgXHRcdFwiLz48L2c+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLWFsaWduLXJpZ2h0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjIgMjI7XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4uc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO308L3N0eWxlPjxnIGlkPVwiWE1MSURfNV9cIj48ZyBpZD1cIlhNTElEXzQyX1wiPjxwYXRoIGlkPVwiWE1MSURfNDRfXCIgY2xhc3M9XCJzdDBcIiBkPVwiTTIwLDF2MjBoMVYxSDIweiBNMiwxN2gxNnYtNEgyVjE3eiBNMTAsOWg4VjVoLThWOXpcIi8+PC9nPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gICYuaWNvbi1hbGlnbi10b3Age1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PGcgaWQ9XCJYTUxJRF8zNV9cIj48cGF0aCBpZD1cIlhNTElEXzM2X1wiIGQ9XCJNMSwxdjFoMjBWMUgxeiBNOSw0SDV2MTZoNFY0eiBNMTcsMTJWNGgtNHY4SDE3elwiLz48L2c+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLWFsaWduLW1pZGRsZSB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDIyIDIyO1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+LnN0MHtmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDt9PC9zdHlsZT48ZyBpZD1cIlhNTElEXzVfXCI+PGcgaWQ9XCJYTUxJRF8yNF9cIj48cG9seWdvbiBpZD1cIlhNTElEXzI1X1wiIGNsYXNzPVwic3QwXCIgcG9pbnRzPVwiMTMsMiAxMywxMCA5LDEwIDksNiA1LDYgNSwxMCAxLDEwIDEsMTEgNSwxMSA1LDE1IDksMTUgOSwxMSAxMywxMSAxMywxOSAxNywxOSAxNywxMSAyMSwxMSAyMSwxMCAxNywxMCAxNywyIFx0XHRcIi8+PC9nPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gICYuaWNvbi1hbGlnbi1ib3R0b20ge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PGcgaWQ9XCJYTUxJRF8zNV9cIj48cGF0aCBpZD1cIlhNTElEXzM2X1wiIGQ9XCJNMjEsMjB2LTFIMXYxSDIxeiBNOSwxSDV2MTZoNFYxeiBNMTMsOXY4aDRWOUgxM3pcIi8+PC9nPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gICYuaWNvbi1hbGlnbi1ob3Jpem9udGFsIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjIgMjI7XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxnIGlkPVwiWE1MSURfMzVfXCI+PHBhdGggaWQ9XCJYTUxJRF8zNl9cIiBkPVwiTTEsMXYxaDIwVjFIMXogTTAuOTk5OTk5LDE5LjAwMDAwNzZWMjBoMjB2LTAuOTk5OTkyNEgwLjk5OTk5OXogTTkuMDAwMDAxLDIuOTk5OTk5NWgtNHYxNWg0VjIuOTk5OTk5NXogTTE3LDEzLjk5OTk5OVY2Ljk5OTk5ODZoLTMuOTk5OTk5djcuMDAwMDAwNUgxN3pcIi8+PC9nPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gICYuaWNvbi1hbGlnbi12ZXJ0aWNhbCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDIyIDIyO1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48ZyBpZD1cIlhNTElEXzM1X1wiPjxwYXRoIGlkPVwiWE1MSURfMzZfXCIgZD1cIk0wLjk5OTk5OTgsMjFoMXYtMjBoLTFWMjF6IE0xOS4wMDAwMDc2LDIxSDIwdi0yMGgtMC45OTk5OTI0VjIxeiBNMi45OTk5OTk1LDEyLjk5OTk5OXYzLjk5OTk5OWgxNSB2LTMuOTk5OTk5SDIuOTk5OTk5NXogTTEzLjk5OTk5OSw0Ljk5OTk5OUg2Ljk5OTk5ODZ2NGg3LjAwMDAwMDVWNC45OTk5OTl6XCIvPjwvZz48L2c+PC9zdmc+Jyk7XG4gIH1cblxuICAvLyBGb3JtYXRzXG5cbiAgJi5pY29uLWZvcm1hdC1wZGYge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggaWQ9XCJYTUxJRF8yX1wiIGQ9XCJNMiwyMWgxOFY0bC0zLjk3OTE2Ni00TDIsMFYyMXogTTE5LDh2MTJIM1YxaDEybDQsNFY4elwiLz48L2c+PGc+PHBhdGggZD1cIk05Ljk5OTYzMjgsNy4yOTk0MTIzTDkuOTk5NjMyOCw3LjI5OTQxMjNDMTAuMDk4ODI0NSw3LjI5OTQxMjMsMTAuMDk4ODI0NSw3LjI5OTQxMjMsOS45OTk2MzI4LDcuMjk5NDEyM1x0YzAuMDk5MTkxNy0wLjQwMDQ0MDcsMC4yMDAyMjAxLTAuNjAwNjYxOCwwLjIwMDIyMDEtMC45MDAwNzM1VjYuMTk5MTE4MWMwLjA5OTE5MTctMC40OTk2MzI0LDAuMDk5MTkxNy0wLjkwMDA3MzUsMC0wLjk5OTI2NTIgYzAsMCwwLDAsMC0wLjA5OTE5MTdsLTAuMDk5MTkxNy0wLjA5OTE5MTdsMCwwbDAsMGMwLDAsMCwwLjA5OTE5MTctMC4wOTkxOTE3LDAuMDk5MTkxNyBDOS43OTk0MTE4LDUuNjk5NDg1OCw5Ljc5OTQxMTgsNi4zOTkzMzg3LDkuOTk5NjMyOCw3LjI5OTQxMjNMOS45OTk2MzI4LDcuMjk5NDEyM3ogTTcsMTQuMjAwNTg3M1x0Yy0wLjIwMDIyMDEsMC4wOTkxOTI2LTAuNDAwNDQwNywwLjIwMDIyMTEtMC40OTk2MzI4LDAuMjk5NDExOGMtMC42OTk4NTI5LDAuNjAwNjYxMy0xLjE5OTQ4NTgsMS4zMDA1MTQyLTEuMzAwNTE0MiwxLjU5OTkyNjlsMCwwIGwwLDBsMCwwQzUuNzk4Njc3NCwxNi4wMDA3MzQzLDYuMzk5MzM4NywxNS40MDAwNzQsNywxNC4yMDA1ODczQzcuMDk5MTkxNywxNC4yMDA1ODczLDcuMDk5MTkxNywxNC4yMDA1ODczLDcsMTQuMjAwNTg3MyBDNy4wOTkxOTE3LDE0LjIwMDU4NzMsNywxNC4yMDA1ODczLDcsMTQuMjAwNTg3M3ogTTE2LjE5OTExOTYsMTIuNjk5ODUzOVx0Yy0wLjA5OTE5MzYtMC4wOTkxOTI2LTAuNDk5NjMzOC0wLjQwMDQ0MTItMS44OTkzMzk3LTAuNDAwNDQxMmMtMC4wOTkxOTI2LDAtMC4wOTkxOTI2LDAtMC4yMDAyMjExLDBsMCwwYzAsMCwwLDAsMCwwLjA5OTE5MjYgYzAuNjk5ODUyOSwwLjI5OTQxMTgsMS4zOTk3MDU5LDAuNDk5NjMyOCwxLjg5OTMzODcsMC40OTk2MzI4YzAuMDk5MTkxNywwLDAuMDk5MTkxNywwLDAuMjAwMjIyLDBsMCwwaDAuMDk5MTkxNyBjMCwwLDAsMCwwLTAuMDk5MTkyNmwwLDBDMTYuMzAwMTQ4LDEyLjc5OTA0NDYsMTYuMTk5MTE5NiwxMi43OTkwNDQ2LDE2LjE5OTExOTYsMTIuNjk5ODUzOXogTTE2LjU5OTU1OTgsMTMuNDk4ODk4NSBjLTAuMjAwMjIyLDAuMDk5MTkxNy0wLjQ5OTYzMzgsMC4yMDAyMjExLTAuOTAwMDc0LDAuMjAwMjIxMWMtMC44MDA4ODE0LDAtMi4wMDAzNjgxLTAuMjAwMjIxMS0yLjk5OTYzMTktMC42OTk4NTI5IGMtMS43MDA5NTU0LDAuMjAwMjIxMS0yLjk5OTYzMjgsMC40MDA0NDAyLTQuMDAwNzM1MywwLjgwMDg4MTRjLTAuMDk5MTkxNywwLTAuMDk5MTkxNywwLTAuMjAwMjIwMSwwLjA5OTE5MTcgQzcuMjk5NDEyMywxNi4wMDA3MzQzLDYuMjk4MzA5OCwxNyw1LjQ5OTI2NTIsMTdjLTAuMjAwMjIwNiwwLTAuMjk5NDEyMywwLTAuNDAwNDQxMi0wLjA5OTE5MTdsLTAuNDk5NjMyNC0wLjI5OTQxMThWMTYuNTAyMjAzXHRDNC41LDE2LjMwMTk4MjksNC41LDE2LjIwMjc5MTIsNC41LDE2LjAwMjU3MTFjMC4wOTkxOTE3LTAuNDk5NjMyOCwwLjY5OTg1MjktMS4zOTk3MDY4LDEuODk5MzM4Ny0yLjA5OTU1OTggYzAuMjAwMjIwMS0wLjA5OTE5MTcsMC40OTk2MzI4LTAuMjk5NDExOCwwLjkwMDA3MzUtMC40OTk2MzI4YzAuMjk5NDExOC0wLjQ5OTYzMjgsMC42MDA2NjEzLTEuMTAwMjk0MSwwLjk5OTI2NTItMS44MDAxNDYxIGMwLjQ5OTYzMjgtMC45OTkyNjU3LDAuODAwODgxNC0yLjAwMDM2ODEsMS4xMDAyOTMyLTIuOTAwNDQxMmwwLDBDOC45OTg1MzA0LDcuNTAzMzA1NCw4Ljc5ODMwOTMsNi44MDM0NTI1LDkuMTk4NzUwNSw1LjQwMTkwOTRDOS4yOTc5NDIyLDUuMDAxNDY4Nyw5LjU5OTE5MTcsNC42MDEwMjgsOS45OTk2MzI4LDQuNjAxMDI4aDAuMjAwMjIwMWMwLjIwMDIyMDEsMCwwLjQwMDQ0MDIsMC4wOTkxOTE3LDAuNjAwNjYxMywwLjIwMDIyMDYgYzAuNjk5ODUyOSwwLjY5OTg1MjksMC40MDA0NDEyLDIuMjk5Nzc5NCwwLDMuNjAwMjk0MWMwLDAuMDk5MTkxNywwLDAuMDk5MTkxNywwLDAuMDk5MTkxNyBjMC40MDA0NDEyLDEuMTAwMjkzMiwwLjk5OTI2NTcsMi4wMDAzNjcyLDEuNTk5OTI2LDIuNjAxMDI4NGMwLjI5OTQxMTgsMC4yMDAyMjExLDAuNDk5NjMyOCwwLjQwMDQ0MDIsMC45MDAwNzQsMC42MDA2NjEzIGMwLjQ5OTYzMjgsMCwwLjkwMDA3MzEtMC4wOTkxOTE3LDEuMzAwNTE0Mi0wLjA5OTE5MTdjMS4xOTk0ODQ4LDAsMi4wMDAzNjgxLDAuMjAwMjIwMSwyLjI5OTc3OTksMC42OTk4NTJcdEMxNywxMi41MDMzMDU0LDE3LDEyLjcwMzUyNTUsMTcsMTIuOTAzNzQ1N0MxNi45MDA4MDgzLDEyLjk5OTI2NTcsMTYuNzk5Nzc5OSwxMy4zMDA1MTQyLDE2LjU5OTU1OTgsMTMuNDk4ODk4NXogTTEwLjA5ODgyNDUsOS41OTkxOTE3QzkuODk4NjAzNCwxMC4yOTkwNDQ2LDkuNDk4MTYyMywxMS4wOTk5MjYsOS4wOTk1NTg4LDEyIGMtMC4yMDAyMjAxLDAuNDAwNDQwMi0wLjQwMDQ0MDIsMC42OTk4NTItMC42MDA2NjEzLDEuMTAwMjk0MWgwLjA5OTE5MTdoMC4wOTkxOTE3bDAsMCBjMS4zMDA1MTQyLTAuNDk5NjMyOCwyLjUtMC44MDA4ODE0LDMuMzAwODgxNC0wLjkwMDA3MzFDMTEuNzk3OTQxMiwxMi4xMDEwMjg0LDExLjY5ODc1MDUsMTIsMTEuNTk3NzIyMSwxMS45MDA4MDgzIEMxMS4wOTk5MjYsMTEuMzAwMTQ3MSwxMC40OTkyNjU3LDEwLjQ5OTI2NTcsMTAuMDk4ODI0NSw5LjU5OTE5MTd6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tZm9ybWF0LXBwdHgge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIi0yMzggMjQwIDIyIDIyXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgLTIzOCAyNDAgMjIgMjI7XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGlkPVwiWE1MSURfMl9cIiBkPVwiTS0yMzYsMjYxaDE4di0xN2wtMy45NzkxNzE4LTRILTIzNlYyNjF6IE0tMjE5LDI0OHYxMmgtMTZ2LTE5aDEybDQsNFYyNDh6XCIvPjwvZz48Zz48cGF0aCBkPVwiTS0yMjguODIyNjkyOSwyNTAuODY0Njg1MWMwLjEzNzA4NS0wLjA2MDc5MSwwLjIzNDE5MTktMC4yMzAyMjQ2LDAuMzEzMTEwNC0wLjM2NDc0NjFcdGMwLjA3OTI4NDctMC4xMzUxOTI5LDAuMDg2MTgxNi0wLjI5MzUxODEsMC4wODYxODE2LTAuNDczOTM4YzAtMC4yMjIxMDY5LTAuMDYxMzQwMy0wLjQxODY0MDEtMC4xNzIzNjMzLTAuNTYwMTgwN1x0Yy0wLjExMDI5MDUtMC4xNDA1MDI5LTAuMjk2ODc1LTAuMjYyODc4NC0wLjQ2Mjg5MDYtMC4yOTMxNTE5Yy0wLjEyMTA5MzgtMC4wMjMzMTU0LTAuMjM5Njg1MS0wLjAwMTI4MTctMC40NTM1NTIyLDAuMDA5MDk0MiBsLTAuMzExNTIzNCwwLjAxMDM3NnYxLjc5MjU0MTVoMC40NTIzOTI2Qy0yMjguOTgxNTA2MywyNTAuOTkyNzM2OC0yMjguOTU4NjE4MiwyNTAuOTI0OTg3OC0yMjguODIyNjkyOSwyNTAuODY0Njg1MXpcIi8+PHBhdGggZD1cIk0tMjMzLDI1Ni4xMTQxMzU3bDcuMzMzMzEzLDEuMzU1MzQ2N1YyNDVMLTIzMywyNDYuMzI2ODQzM1YyNTYuMTE0MTM1N3ogTS0yMzAuODY2MDg4OSwyNDguMjgxODYwNGwxLjQ5Njg4NzItMC4wOTc3NzgzIGMwLjYwNzc4ODEtMC4wMzk3MzM5LDAuOTA3NTMxNy0wLjA1NTcyNTEsMS4xMDE4MDY2LTAuMDA3MTQxMWMwLjMwMzIyMjcsMC4wNzM2MDg0LDAuNjM3MjA3LDAuMjM0OTg1NCwwLjg0ODMyNzYsMC41MzgxNDdcdGMwLjIxMzg2NzIsMC4zMDcwNjc5LDAuMzU1NTkwOCwwLjc1OTIxNjMsMC4zNTU1OTA4LDEuMjYyMDg1YzAsMC4zODc4Nzg0LTAuMDYyMzE2OSwwLjcxMzA3MzctMC4xODYyNzkzLDAuOTc0MTIxMVx0Yy0wLjEyMzA0NjksMC4yNTkwOTQyLTAuMjc4MDE1MSwwLjQ1OTEwNjQtMC40NjQwNTAzLDAuNjAwMTU4N2MtMC4xODM5NiwwLjEzOTQ2NTMtMC4zOTkxMDg5LDAuMjcwMDE5NS0wLjU1ODc3NjksMC4zMjcyNzA1IGMtMC4zMTQ1NzUyLDAuMDc3NDUzNi0wLjUyODY4NjUsMC4xNzQ3NDM3LTAuOTgwMjg1NiwwLjE1MDgxNzloLTAuNTcwODYxOHYxLjk1NjIzNzhsLTEuMDQyMzU4NC0wLjEwODE1NDNWMjQ4LjI4MTg2MDR6XCIvPjxwYXRoIGQ9XCJNLTIyMS43MjY2ODQ2LDI0N0gtMjI1djloMy4yNzMzMTU0Qy0yMjEuMzI1MzQ3OSwyNTYtMjIxLDI1NS42NzQ2NTIxLTIyMSwyNTUuMjczMzE1NHYtNy41NDY2MzA5XHRDLTIyMSwyNDcuMzI1MzQ3OS0yMjEuMzI1MzQ3OSwyNDctMjIxLjcyNjY4NDYsMjQ3elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbn0iLCIvLyBFbmNvZGVkIFNWRyBCYWNrZ3JvdW5kXG4uZW5jb2RlZC1zdmctbWFzayhAc3ZnKSB7XG4gIEB1cmw6IGBlbmNvZGVVUklDb21wb25lbnQoQHtzdmd9KWA7XG4gIGJhY2tncm91bmQtY29sb3I6IEB0aGVtZUNvbG9yO1xuICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LEB7dXJsfVwiKTtcbn0iXX0= */ \ No newline at end of file diff --git a/apps/presentationeditor/mobile/resources/css/app-material.css b/apps/presentationeditor/mobile/resources/css/app-material.css index 12b592435..cb5208d7d 100644 --- a/apps/presentationeditor/mobile/resources/css/app-material.css +++ b/apps/presentationeditor/mobile/resources/css/app-material.css @@ -6169,6 +6169,11 @@ i.icon.icon-format-pptx { height: 22px; background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%22-238%20240%2022%2022%22%20style%3D%22enable-background%3Anew%20-238%20240%2022%2022%3B%22%20xml%3Aspace%3D%22preserve%22%20fill%3D%22%23DF6737%22%3E%3Cg%3E%3Cpath%20id%3D%22XMLID_2_%22%20d%3D%22M-236%2C261h18v-17l-3.9791718-4H-236V261z%20M-219%2C248v12h-16v-19h12l4%2C4V248z%22%2F%3E%3C%2Fg%3E%3Cg%3E%3Cpath%20d%3D%22M-228.8226929%2C250.8646851c0.137085-0.060791%2C0.2341919-0.2302246%2C0.3131104-0.3647461%09c0.0792847-0.1351929%2C0.0861816-0.2935181%2C0.0861816-0.473938c0-0.2221069-0.0613403-0.4186401-0.1723633-0.5601807%09c-0.1102905-0.1405029-0.296875-0.2628784-0.4628906-0.2931519c-0.1210938-0.0233154-0.2396851-0.0012817-0.4535522%2C0.0090942%20l-0.3115234%2C0.010376v1.7925415h0.4523926C-228.9815063%2C250.9927368-228.9586182%2C250.9249878-228.8226929%2C250.8646851z%22%2F%3E%3Cpath%20d%3D%22M-233%2C256.1141357l7.333313%2C1.3553467V245L-233%2C246.3268433V256.1141357z%20M-230.8660889%2C248.2818604l1.4968872-0.0977783%20c0.6077881-0.0397339%2C0.9075317-0.0557251%2C1.1018066-0.0071411c0.3032227%2C0.0736084%2C0.637207%2C0.2349854%2C0.8483276%2C0.538147%09c0.2138672%2C0.3070679%2C0.3555908%2C0.7592163%2C0.3555908%2C1.262085c0%2C0.3878784-0.0623169%2C0.7130737-0.1862793%2C0.9741211%09c-0.1230469%2C0.2590942-0.2780151%2C0.4591064-0.4640503%2C0.6001587c-0.18396%2C0.1394653-0.3991089%2C0.2700195-0.5587769%2C0.3272705%20c-0.3145752%2C0.0774536-0.5286865%2C0.1747437-0.9802856%2C0.1508179h-0.5708618v1.9562378l-1.0423584-0.1081543V248.2818604z%22%2F%3E%3Cpath%20d%3D%22M-221.7266846%2C247H-225v9h3.2733154C-221.3253479%2C256-221%2C255.6746521-221%2C255.2733154v-7.5466309%09C-221%2C247.3253479-221.3253479%2C247-221.7266846%2C247z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); } +i.icon.icon-format-odp { + width: 22px; + height: 22px; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%22-286%20409.89%2022%2022%22%20style%3D%22enable-background%3Anew%20-286%20409.89%2022%2022%3B%22%20xml%3Aspace%3D%22preserve%22%20fill%3D%22%23DF6737%22%3E%3Cg%3E%3Cpath%20id%3D%22XMLID_2_%22%20d%3D%22M-284%2C430.89h18v-17l-3.979-4H-284V430.89z%20M-267%2C417.89v12h-16v-19h12l4%2C4V417.89z%22%2F%3E%3C%2Fg%3E%3Cpath%20d%3D%22M-281.655%2C419.661c0%2C0%2C1.036-1.266%2C3.529-1.381c2.493-0.115%2C3.107%2C0.499%2C3.107%2C0.499s1.072-0.873%2C2.634-0.984%20c1.473-0.106%2C2.244%2C0.134%2C3.657%2C0.639c-3.107-0.038-5.408%2C1.189-6.022%2C1.956C-276.17%2C419.163-278.817%2C418.817-281.655%2C419.661z%22%2F%3E%3Cpath%20d%3D%22M-278.663%2C415.979c1.458-0.767%2C2.864-0.857%2C5.063%2C0c1.189-0.652%2C3.414-0.307%2C4.68%2C0.269c-3.145-0.23-4.104%2C0.422-4.68%2C0.69%09C-274.367%2C416.056-276.86%2C415.595-278.663%2C415.979z%22%2F%3E%3Cg%3E%3Cpath%20d%3D%22M-281.721%2C425.011c0-0.465%2C0.07-0.855%2C0.209-1.172c0.104-0.232%2C0.246-0.441%2C0.425-0.626s0.376-0.322%2C0.59-0.411%20c0.285-0.121%2C0.613-0.181%2C0.985-0.181c0.673%2C0%2C1.212%2C0.208%2C1.616%2C0.626c0.404%2C0.418%2C0.606%2C0.998%2C0.606%2C1.742%20c0%2C0.737-0.2%2C1.314-0.601%2C1.731c-0.401%2C0.417-0.938%2C0.625-1.608%2C0.625c-0.679%2C0-1.22-0.207-1.621-0.622%09C-281.521%2C426.31-281.721%2C425.739-281.721%2C425.011z%20M-280.771%2C424.981c0%2C0.517%2C0.119%2C0.909%2C0.358%2C1.176%09c0.239%2C0.268%2C0.542%2C0.4%2C0.91%2C0.4c0.368%2C0%2C0.669-0.132%2C0.905-0.397c0.236-0.265%2C0.354-0.662%2C0.354-1.191%09c0-0.523-0.115-0.914-0.344-1.172s-0.535-0.387-0.915-0.387c-0.38%2C0-0.687%2C0.131-0.919%2C0.392%20C-280.654%2C424.062-280.771%2C424.455-280.771%2C424.981z%22%2F%3E%3Cpath%20d%3D%22M-276.573%2C422.699h1.686c0.38%2C0%2C0.67%2C0.029%2C0.87%2C0.088c0.267%2C0.079%2C0.498%2C0.219%2C0.689%2C0.421%20c0.191%2C0.201%2C0.336%2C0.448%2C0.436%2C0.74s0.15%2C0.651%2C0.15%2C1.079c0%2C0.377-0.047%2C0.7-0.141%2C0.973c-0.114%2C0.333-0.277%2C0.602-0.489%2C0.808%20c-0.16%2C0.155-0.376%2C0.277-0.648%2C0.364c-0.204%2C0.064-0.476%2C0.097-0.816%2C0.097h-1.736V422.699z%20M-275.65%2C423.472v3.026h0.689%20c0.257%2C0%2C0.443-0.015%2C0.558-0.044c0.149-0.037%2C0.274-0.101%2C0.373-0.19c0.099-0.089%2C0.18-0.236%2C0.241-0.44%20c0.062-0.205%2C0.094-0.483%2C0.094-0.837s-0.031-0.624-0.094-0.813c-0.062-0.189-0.149-0.337-0.262-0.442%20c-0.112-0.106-0.254-0.178-0.427-0.215c-0.129-0.029-0.381-0.044-0.757-0.044H-275.65z%22%2F%3E%3Cpath%20d%3D%22M-271.96%2C427.268v-4.569h1.479c0.562%2C0%2C0.927%2C0.023%2C1.098%2C0.069c0.262%2C0.068%2C0.48%2C0.218%2C0.657%2C0.447%20s0.265%2C0.525%2C0.265%2C0.89c0%2C0.28-0.051%2C0.516-0.152%2C0.707s-0.231%2C0.342-0.388%2C0.45c-0.157%2C0.109-0.316%2C0.182-0.479%2C0.217%09c-0.221%2C0.044-0.539%2C0.065-0.957%2C0.065h-0.602v1.724H-271.96z%20M-271.038%2C423.472v1.297h0.505c0.363%2C0%2C0.606-0.024%2C0.729-0.072%20c0.122-0.048%2C0.219-0.122%2C0.288-0.225c0.069-0.102%2C0.104-0.22%2C0.104-0.354c0-0.167-0.049-0.304-0.146-0.412%09c-0.098-0.107-0.222-0.176-0.371-0.202c-0.109-0.021-0.331-0.031-0.663-0.031H-271.038z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); +} .navbar i.icon.icon-undo { width: 22px; height: 22px; @@ -6335,4 +6340,3 @@ html.pixel-ratio-3 .numbers li { height: 100%; background-size: contain; } -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvaW50cm8ubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvZ3JpZC5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9fbWl4aW5zLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3ZpZXdzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3BhZ2VzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3Rvb2xiYXJzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3Rvb2xiYXJzLXBhZ2VzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3NlYXJjaGJhci5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9tZXNzYWdlYmFyLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2ljb25zLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2JhZGdlcy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9jb250ZW50LWJsb2NrLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2xpc3RzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2Zvcm1zLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2Zsb2F0aW5nLWJ1dHRvbi5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9tb2RhbHMubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcmlwcGxlLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL2FwcHMvY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9tYXRlcmlhbC9fYnV0dG9uLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3BhbmVscy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC90YWJzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL21lc3NhZ2VzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3N0YXR1c2Jhci5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9wcmVsb2FkZXIubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcHJvZ3Jlc3NiYXIubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcGlja2VyLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL25vdGlmaWNhdGlvbnMubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvZGlzYWJsZWQubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvYXBwcy9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL21hdGVyaWFsL19jb250YWluZXIubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvYXBwcy9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL21hdGVyaWFsL19kYXRhdmlldy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy9hcHBzL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvbWF0ZXJpYWwvX2xpc3R2aWV3Lmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL2FwcHMvY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9tYXRlcmlhbC9fY29udGV4dG1lbnUubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvYXBwcy9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL21hdGVyaWFsL19jb2xvci1wYWxldHRlLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL2FwcHMvY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9tYXRlcmlhbC9fYWJvdXQubGVzcyIsIm1hdGVyaWFsL19zZWFyY2gubGVzcyIsIm1hdGVyaWFsL19pY29ucy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy9hcHBzL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvX21peGlucy5sZXNzIiwiYXBwLW1hdGVyaWFsLmxlc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBTTtBQUFNO0VBQ1Isa0JBQUE7RUFDQSxZQUFBO0VBQ0EsV0FBQTtFQUNBLGtCQUFBOztBQUVKO0VBQ0ksdURBQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLGNBQUE7RUFDQSxlQUFBO0VBQ0EsZ0JBQUE7RUFDQSxXQUFBO0VBQ0EsOEJBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBOztBQUVKO0VBQ0ksZ0JBQUE7O0FBRUo7RUFDSSw2Q0FBQTtFQUNBLDJCQUFBOztBQUVKO0FBQUc7QUFBTztBQUFVO0VBQ2hCLFVBQUE7O0FBR0o7RUFDSSxxQkFBQTtFQUNBLGNBQUE7O0FBRUo7RUFDSSxhQUFBOzs7QUNsQ0o7RUM0Qkksb0JBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0VBQ0EsYUFBQTtFQStDQSx5QkFBQTtFQUNBLHNCQUFBO0VBQ0Esc0NBQUE7RUFDQSw4QkFBQTtFQWpDQSwyQkFBQTtFQUNBLHdCQUFBO0VBQ0EsdUJBQUE7RUFDQSxtQkFBQTtFQUNBLGVBQUE7RUFzQ0Esd0JBQUE7RUFDQSxxQkFBQTtFQUNBLCtCQUFBO0VBQ0EsdUJBQUE7O0FEN0ZKLElBS0k7RUFDSSxzQkFBQTs7QUFJUixJQUNJO0VBQ0ksV0FBQTs7QUFGUixJQVNRLE1BQUs7RUFDRCxXQUFBO0VBQ0Esd0NBQUE7RUFDQSxnQ0FBQTs7QUFFSixJQUFDLFVBQ0csTUFBSztFQUNELFdBQUE7O0FBaEJoQixJQVNRLE1BQUs7RUFDRCxVQUFBO0VBQ0EsMkVBQUE7RUFDQSxtRUFBQTs7QUFFSixJQUFDLFVBQ0csTUFBSztFQUNELFVBQUE7O0FBaEJoQixJQVNRLE1BQUs7RUFDRCxVQUFBO0VBQ0EsMkVBQUE7RUFDQSxtRUFBQTs7QUFFSixJQUFDLFVBQ0csTUFBSztFQUNELFVBQUE7O0FBaEJoQixJQVNRLE1BQUs7RUFDRCxVQUFBO0VBQ0EsMkVBQUE7RUFDQSxtRUFBQTs7QUFFSixJQUFDLFVBQ0csTUFBSztFQUNELFVBQUE7O0FBaEJoQixJQVNRLE1BQUs7RUFDRCxVQUFBO0VBQ0EsOENBQUE7RUFDQSxzQ0FBQTs7QUFFSixJQUFDLFVBQ0csTUFBSztFQUNELFVBQUE7O0FBaEJoQixJQVNRLE1BQUs7RUFDRCxVQUFBO0VBQ0EsMkVBQUE7RUFDQSxtRUFBQTs7QUFFSixJQUFDLFVBQ0csTUFBSztFQUNELFVBQUE7O0FBaEJoQixJQVNRLE1BQUs7RUFDRCxVQUFBO0VBQ0EsMEVBQUE7RUFDQSxrRUFBQTs7QUFFSixJQUFDLFVBQ0csTUFBSztFQUNELFVBQUE7O0FBaEJoQixJQVNRLE1BQUs7RUFDRCx5QkFBQTtFQUNBLDBFQUFBO0VBQ0Esa0VBQUE7O0FBRUosSUFBQyxVQUNHLE1BQUs7RUFDRCx5QkFBQTs7QUFoQmhCLElBU1EsTUFBSztFQUNELFVBQUE7RUFDQSwwRUFBQTtFQUNBLGtFQUFBOztBQUVKLElBQUMsVUFDRyxNQUFLO0VBQ0QsVUFBQTs7QUFoQmhCLElBU1EsTUFBSztFQUNELFVBQUE7RUFDQSwwRUFBQTtFQUNBLGtFQUFBOztBQUVKLElBQUMsVUFDRyxNQUFLO0VBQ0QsVUFBQTs7QUFoQmhCLElBU1EsTUFBSztFQUNELFVBQUE7RUFDQSwwRUFBQTtFQUNBLGtFQUFBOztBQUVKLElBQUMsVUFDRyxNQUFLO0VBQ0QsVUFBQTs7QUFoQmhCLElBU1EsTUFBSztFQUNELFVBQUE7RUFDQSx3Q0FBQTtFQUNBLGdDQUFBOztBQUVKLElBQUMsVUFDRyxNQUFLO0VBQ0QsVUFBQTs7QUFoQmhCLElBU1EsTUFBSztFQUNELFVBQUE7RUFDQSwwRUFBQTtFQUNBLGtFQUFBOztBQUVKLElBQUMsVUFDRyxNQUFLO0VBQ0QsVUFBQTs7QUFoQmhCLElBU1EsTUFBSztFQUNELFVBQUE7RUFDQSw0Q0FBQTtFQUNBLG9DQUFBOztBQUVKLElBQUMsVUFDRyxNQUFLO0VBQ0QsVUFBQTs7QUFoQmhCLElBU1EsTUFBSztFQUNELFVBQUE7RUFDQSx5RUFBQTtFQUNBLGlFQUFBOztBQUVKLElBQUMsVUFDRyxNQUFLO0VBQ0QsVUFBQTs7QUFoQmhCLElBU1EsTUFBSztFQUNELDBCQUFBO0VBQ0Esd0NBQUE7RUFDQSxnQ0FBQTs7QUFFSixJQUFDLFVBQ0csTUFBSztFQUNELDBCQUFBOztBQWhCaEIsSUFTUSxNQUFLO0VBQ0QsVUFBQTtFQUNBLDBFQUFBO0VBQ0Esa0VBQUE7O0FBRUosSUFBQyxVQUNHLE1BQUs7RUFDRCxVQUFBOztBQWhCaEIsSUFTUSxNQUFLO0VBQ0QsVUFBQTtFQUNBLHdDQUFBO0VBQ0EsZ0NBQUE7O0FBRUosSUFBQyxVQUNHLE1BQUs7RUFDRCxVQUFBOztBQWhCaEIsSUFTUSxNQUFLO0VBQ0QsVUFBQTtFQUNBLHdDQUFBO0VBQ0EsZ0NBQUE7O0FBRUosSUFBQyxVQUNHLE1BQUs7RUFDRCxVQUFBOztBQWhCaEIsSUFTUSxNQUFLO0VBQ0QsVUFBQTtFQUNBLHdFQUFBO0VBQ0EsZ0VBQUE7O0FBRUosSUFBQyxVQUNHLE1BQUs7RUFDRCxVQUFBOztBQWhCaEIsSUFTUSxNQUFLO0VBQ0QsVUFBQTtFQUNBLHlDQUFBO0VBQ0EsaUNBQUE7O0FBRUosSUFBQyxVQUNHLE1BQUs7RUFDRCxVQUFBOztBQWhCaEIsSUFTUSxNQUFLO0VBQ0QsU0FBQTtFQUNBLDBDQUFBO0VBQ0Esa0NBQUE7O0FBRUosSUFBQyxVQUNHLE1BQUs7RUFDRCxTQUFBOztBQWhCaEIsSUF3QlEsVUFBUyxlQUFlO0FBeEJoQyxJQXdCd0MsVUFBUyxlQUFlLEdBQU87RUFFM0QsV0FBQTtFQUNBLHdDQUFBO0VBQ0EsZ0NBQUE7O0FBRUosSUFBQyxVQUNHLFVBQVMsZUFBZTtBQUQ1QixJQUFDLFVBQ21DLFVBQVMsZUFBZSxHQUFPO0VBQzNELFdBQUE7O0FBaENoQixJQXdCUSxVQUFTLGVBQWU7QUF4QmhDLElBd0J3QyxVQUFTLGVBQWUsR0FBTztFQUUzRCxVQUFBO0VBQ0Esd0NBQUE7RUFDQSxnQ0FBQTs7QUFFSixJQUFDLFVBQ0csVUFBUyxlQUFlO0FBRDVCLElBQUMsVUFDbUMsVUFBUyxlQUFlLEdBQU87RUFDM0QsVUFBQTs7QUFoQ2hCLElBd0JRLFVBQVMsZUFBZTtBQXhCaEMsSUF3QndDLFVBQVMsZUFBZSxHQUFPO0VBRTNELG1CQUFBO0VBQ0Esd0NBQUE7RUFDQSxnQ0FBQTs7QUFFSixJQUFDLFVBQ0csVUFBUyxlQUFlO0FBRDVCLElBQUMsVUFDbUMsVUFBUyxlQUFlLEdBQU87RUFDM0QsbUJBQUE7O0FBaENoQixJQXdCUSxVQUFTLGVBQWU7QUF4QmhDLElBd0J3QyxVQUFTLGVBQWUsR0FBTztFQUUzRCxVQUFBO0VBQ0Esd0NBQUE7RUFDQSxnQ0FBQTs7QUFFSixJQUFDLFVBQ0csVUFBUyxlQUFlO0FBRDVCLElBQUMsVUFDbUMsVUFBUyxlQUFlLEdBQU87RUFDM0QsVUFBQTs7QUFoQ2hCLElBd0JRLFVBQVMsZUFBZTtBQXhCaEMsSUF3QndDLFVBQVMsZUFBZSxHQUFPO0VBRTNELFVBQUE7RUFDQSx3Q0FBQTtFQUNBLGdDQUFBOztBQUVKLElBQUMsVUFDRyxVQUFTLGVBQWU7QUFENUIsSUFBQyxVQUNtQyxVQUFTLGVBQWUsR0FBTztFQUMzRCxVQUFBOztBQWhDaEIsSUF3QlEsVUFBUyxlQUFlO0FBeEJoQyxJQXdCd0MsVUFBUyxlQUFlLEdBQU87RUFFM0QsbUJBQUE7RUFDQSx3Q0FBQTtFQUNBLGdDQUFBOztBQUVKLElBQUMsVUFDRyxVQUFTLGVBQWU7QUFENUIsSUFBQyxVQUNtQyxVQUFTLGVBQWUsR0FBTztFQUMzRCxtQkFBQTs7QUFoQ2hCLElBd0JRLFVBQVMsZUFBZTtBQXhCaEMsSUF3QndDLFVBQVMsZUFBZSxHQUFPO0VBRTNELG1CQUFBO0VBQ0Esd0NBQUE7RUFDQSxnQ0FBQTs7QUFFSixJQUFDLFVBQ0csVUFBUyxlQUFlO0FBRDVCLElBQUMsVUFDbUMsVUFBUyxlQUFlLEdBQU87RUFDM0QsbUJBQUE7O0FBaENoQixJQXdCUSxVQUFTLGVBQWU7QUF4QmhDLElBd0J3QyxVQUFTLGVBQWUsR0FBTztFQUUzRCxZQUFBO0VBQ0Esd0NBQUE7RUFDQSxnQ0FBQTs7QUFFSixJQUFDLFVBQ0csVUFBUyxlQUFlO0FBRDVCLElBQUMsVUFDbUMsVUFBUyxlQUFlLEdBQU87RUFDM0QsWUFBQTs7QUFoQ2hCLElBd0JRLFVBQVMsZUFBZTtBQXhCaEMsSUF3QndDLFVBQVMsZUFBZSxHQUFPO0VBRTNELG1CQUFBO0VBQ0Esd0NBQUE7RUFDQSxnQ0FBQTs7QUFFSixJQUFDLFVBQ0csVUFBUyxlQUFlO0FBRDVCLElBQUMsVUFDbUMsVUFBUyxlQUFlLEdBQU87RUFDM0QsbUJBQUE7O0FBaENoQixJQXdCUSxVQUFTLGVBQWU7QUF4QmhDLElBd0J3QyxVQUFTLGVBQWUsSUFBTztFQUUzRCxVQUFBO0VBQ0EseUNBQUE7RUFDQSxpQ0FBQTs7QUFFSixJQUFDLFVBQ0csVUFBUyxlQUFlO0FBRDVCLElBQUMsVUFDbUMsVUFBUyxlQUFlLElBQU87RUFDM0QsVUFBQTs7QUFoQ2hCLElBd0JRLFVBQVMsZUFBZTtBQXhCaEMsSUF3QndDLFVBQVMsZUFBZSxJQUFPO0VBRTNELGtCQUFBO0VBQ0EsMENBQUE7RUFDQSxrQ0FBQTs7QUFFSixJQUFDLFVBQ0csVUFBUyxlQUFlO0FBRDVCLElBQUMsVUFDbUMsVUFBUyxlQUFlLElBQU87RUFDM0Qsa0JBQUE7O0FBaENoQixJQXdCUSxVQUFTLGVBQWU7QUF4QmhDLElBd0J3QyxVQUFTLGVBQWUsSUFBTztFQUUzRCxrQkFBQTtFQUNBLDBDQUFBO0VBQ0Esa0NBQUE7O0FBRUosSUFBQyxVQUNHLFVBQVMsZUFBZTtBQUQ1QixJQUFDLFVBQ21DLFVBQVMsZUFBZSxJQUFPO0VBQzNELGtCQUFBOztBQWhDaEIsSUF3QlEsVUFBUyxlQUFlO0FBeEJoQyxJQXdCd0MsVUFBUyxlQUFlLElBQU87RUFFM0Qsa0JBQUE7RUFDQSwwQ0FBQTtFQUNBLGtDQUFBOztBQUVKLElBQUMsVUFDRyxVQUFTLGVBQWU7QUFENUIsSUFBQyxVQUNtQyxVQUFTLGVBQWUsSUFBTztFQUMzRCxrQkFBQTs7QUFoQ2hCLElBd0JRLFVBQVMsZUFBZTtBQXhCaEMsSUF3QndDLFVBQVMsZUFBZSxJQUFPO0VBRTNELGtCQUFBO0VBQ0EsMENBQUE7RUFDQSxrQ0FBQTs7QUFFSixJQUFDLFVBQ0csVUFBUyxlQUFlO0FBRDVCLElBQUMsVUFDbUMsVUFBUyxlQUFlLElBQU87RUFDM0Qsa0JBQUE7O0FBaENoQixJQXdCUSxVQUFTLGVBQWU7QUF4QmhDLElBd0J3QyxVQUFTLGVBQWUsSUFBTztFQUUzRCxrQkFBQTtFQUNBLDBDQUFBO0VBQ0Esa0NBQUE7O0FBRUosSUFBQyxVQUNHLFVBQVMsZUFBZTtBQUQ1QixJQUFDLFVBQ21DLFVBQVMsZUFBZSxJQUFPO0VBQzNELGtCQUFBOztBQWhDaEIsSUF3QlEsVUFBUyxlQUFlO0FBeEJoQyxJQXdCd0MsVUFBUyxlQUFlLElBQU87RUFFM0QsWUFBQTtFQUNBLDBDQUFBO0VBQ0Esa0NBQUE7O0FBRUosSUFBQyxVQUNHLFVBQVMsZUFBZTtBQUQ1QixJQUFDLFVBQ21DLFVBQVMsZUFBZSxJQUFPO0VBQzNELFlBQUE7O0FBaENoQixJQXdCUSxVQUFTLGVBQWU7QUF4QmhDLElBd0J3QyxVQUFTLGVBQWUsSUFBTztFQUUzRCxrQkFBQTtFQUNBLDBDQUFBO0VBQ0Esa0NBQUE7O0FBRUosSUFBQyxVQUNHLFVBQVMsZUFBZTtBQUQ1QixJQUFDLFVBQ21DLFVBQVMsZUFBZSxJQUFPO0VBQzNELGtCQUFBOztBQWhDaEIsSUF3QlEsVUFBUyxlQUFlO0FBeEJoQyxJQXdCd0MsVUFBUyxlQUFlLElBQU87RUFFM0Qsa0JBQUE7RUFDQSwwQ0FBQTtFQUNBLGtDQUFBOztBQUVKLElBQUMsVUFDRyxVQUFTLGVBQWU7QUFENUIsSUFBQyxVQUNtQyxVQUFTLGVBQWUsSUFBTztFQUMzRCxrQkFBQTs7QUFoQ2hCLElBd0JRLFVBQVMsZUFBZTtBQXhCaEMsSUF3QndDLFVBQVMsZUFBZSxJQUFPO0VBRTNELGtCQUFBO0VBQ0EsMENBQUE7RUFDQSxrQ0FBQTs7QUFFSixJQUFDLFVBQ0csVUFBUyxlQUFlO0FBRDVCLElBQUMsVUFDbUMsVUFBUyxlQUFlLElBQU87RUFDM0Qsa0JBQUE7O0FBaENoQixJQXdCUSxVQUFTLGVBQWU7QUF4QmhDLElBd0J3QyxVQUFTLGVBQWUsSUFBTztFQUUzRCxTQUFBO0VBQ0EsMENBQUE7RUFDQSxrQ0FBQTs7QUFFSixJQUFDLFVBQ0csVUFBUyxlQUFlO0FBRDVCLElBQUMsVUFDbUMsVUFBUyxlQUFlLElBQU87RUFDM0QsU0FBQTs7QUFoQ2hCLElBd0JRLFVBQVMsZUFBZTtBQXhCaEMsSUF3QndDLFVBQVMsZUFBZSxJQUFPO0VBRTNELGtCQUFBO0VBQ0EsMENBQUE7RUFDQSxrQ0FBQTs7QUFFSixJQUFDLFVBQ0csVUFBUyxlQUFlO0FBRDVCLElBQUMsVUFDbUMsVUFBUyxlQUFlLElBQU87RUFDM0Qsa0JBQUE7O0FBUWhCLGdCQUFpQztFQUM3QixJQU1RLFNBQVE7SUFDSixXQUFBO0lBQ0Esd0NBQUE7SUFDQSxnQ0FBQTs7RUFFSixJQUFDLFVBQ0csU0FBUTtJQUNKLFdBQUE7O0VBYmhCLElBTVEsU0FBUTtJQUNKLFVBQUE7SUFDQSwyRUFBQTtJQUNBLG1FQUFBOztFQUVKLElBQUMsVUFDRyxTQUFRO0lBQ0osVUFBQTs7RUFiaEIsSUFNUSxTQUFRO0lBQ0osVUFBQTtJQUNBLDJFQUFBO0lBQ0EsbUVBQUE7O0VBRUosSUFBQyxVQUNHLFNBQVE7SUFDSixVQUFBOztFQWJoQixJQU1RLFNBQVE7SUFDSixVQUFBO0lBQ0EsMkVBQUE7SUFDQSxtRUFBQTs7RUFFSixJQUFDLFVBQ0csU0FBUTtJQUNKLFVBQUE7O0VBYmhCLElBTVEsU0FBUTtJQUNKLFVBQUE7SUFDQSw4Q0FBQTtJQUNBLHNDQUFBOztFQUVKLElBQUMsVUFDRyxTQUFRO0lBQ0osVUFBQTs7RUFiaEIsSUFNUSxTQUFRO0lBQ0osVUFBQTtJQUNBLDJFQUFBO0lBQ0EsbUVBQUE7O0VBRUosSUFBQyxVQUNHLFNBQVE7SUFDSixVQUFBOztFQWJoQixJQU1RLFNBQVE7SUFDSixVQUFBO0lBQ0EsMEVBQUE7SUFDQSxrRUFBQTs7RUFFSixJQUFDLFVBQ0csU0FBUTtJQUNKLFVBQUE7O0VBYmhCLElBTVEsU0FBUTtJQUNKLHlCQUFBO0lBQ0EsMEVBQUE7SUFDQSxrRUFBQTs7RUFFSixJQUFDLFVBQ0csU0FBUTtJQUNKLHlCQUFBOztFQWJoQixJQU1RLFNBQVE7SUFDSixVQUFBO0lBQ0EsMEVBQUE7SUFDQSxrRUFBQTs7RUFFSixJQUFDLFVBQ0csU0FBUTtJQUNKLFVBQUE7O0VBYmhCLElBTVEsU0FBUTtJQUNKLFVBQUE7SUFDQSwwRUFBQTtJQUNBLGtFQUFBOztFQUVKLElBQUMsVUFDRyxTQUFRO0lBQ0osVUFBQTs7RUFiaEIsSUFNUSxTQUFRO0lBQ0osVUFBQTtJQUNBLDBFQUFBO0lBQ0Esa0VBQUE7O0VBRUosSUFBQyxVQUNHLFNBQVE7SUFDSixVQUFBOztFQWJoQixJQU1RLFNBQVE7SUFDSixVQUFBO0lBQ0Esd0NBQUE7SUFDQSxnQ0FBQTs7RUFFSixJQUFDLFVBQ0csU0FBUTtJQUNKLFVBQUE7O0VBYmhCLElBTVEsU0FBUTtJQUNKLFVBQUE7SUFDQSwwRUFBQTtJQUNBLGtFQUFBOztFQUVKLElBQUMsVUFDRyxTQUFRO0lBQ0osVUFBQTs7RUFiaEIsSUFNUSxTQUFRO0lBQ0osVUFBQTtJQUNBLDRDQUFBO0lBQ0Esb0NBQUE7O0VBRUosSUFBQyxVQUNHLFNBQVE7SUFDSixVQUFBOztFQWJoQixJQU1RLFNBQVE7SUFDSixVQUFBO0lBQ0EseUVBQUE7SUFDQSxpRUFBQTs7RUFFSixJQUFDLFVBQ0csU0FBUTtJQUNKLFVBQUE7O0VBYmhCLElBTVEsU0FBUTtJQUNKLDBCQUFBO0lBQ0Esd0NBQUE7SUFDQSxnQ0FBQTs7RUFFSixJQUFDLFVBQ0csU0FBUTtJQUNKLDBCQUFBOztFQWJoQixJQU1RLFNBQVE7SUFDSixVQUFBO0lBQ0EsMEVBQUE7SUFDQSxrRUFBQTs7RUFFSixJQUFDLFVBQ0csU0FBUTtJQUNKLFVBQUE7O0VBYmhCLElBTVEsU0FBUTtJQUNKLFVBQUE7SUFDQSx3Q0FBQTtJQUNBLGdDQUFBOztFQUVKLElBQUMsVUFDRyxTQUFRO0lBQ0osVUFBQTs7RUFiaEIsSUFNUSxTQUFRO0lBQ0osVUFBQTtJQUNBLHdDQUFBO0lBQ0EsZ0NBQUE7O0VBRUosSUFBQyxVQUNHLFNBQVE7SUFDSixVQUFBOztFQWJoQixJQU1RLFNBQVE7SUFDSixVQUFBO0lBQ0Esd0VBQUE7SUFDQSxnRUFBQTs7RUFFSixJQUFDLFVBQ0csU0FBUTtJQUNKLFVBQUE7O0VBYmhCLElBTVEsU0FBUTtJQUNKLFVBQUE7SUFDQSx5Q0FBQTtJQUNBLGlDQUFBOztFQUVKLElBQUMsVUFDRyxTQUFRO0lBQ0osVUFBQTs7RUFiaEIsSUFNUSxTQUFRO0lBQ0osU0FBQTtJQUNBLDBDQUFBO0lBQ0Esa0NBQUE7O0VBRUosSUFBQyxVQUNHLFNBQVE7SUFDSixTQUFBOztFQWJoQixJQW1CUSxhQUFZLGVBQWU7RUFuQm5DLElBbUIyQyxhQUFZLGVBQWUsR0FBTztJQUVqRSxXQUFBO0lBQ0Esd0NBQUE7SUFDQSxnQ0FBQTs7RUFFSixJQUFDLFVBQ0csYUFBWSxlQUFlO0VBRC9CLElBQUMsVUFDc0MsYUFBWSxlQUFlLEdBQU87SUFDakUsV0FBQTs7RUEzQmhCLElBbUJRLGFBQVksZUFBZTtFQW5CbkMsSUFtQjJDLGFBQVksZUFBZSxHQUFPO0lBRWpFLFVBQUE7SUFDQSx3Q0FBQTtJQUNBLGdDQUFBOztFQUVKLElBQUMsVUFDRyxhQUFZLGVBQWU7RUFEL0IsSUFBQyxVQUNzQyxhQUFZLGVBQWUsR0FBTztJQUNqRSxVQUFBOztFQTNCaEIsSUFtQlEsYUFBWSxlQUFlO0VBbkJuQyxJQW1CMkMsYUFBWSxlQUFlLEdBQU87SUFFakUsbUJBQUE7SUFDQSx3Q0FBQTtJQUNBLGdDQUFBOztFQUVKLElBQUMsVUFDRyxhQUFZLGVBQWU7RUFEL0IsSUFBQyxVQUNzQyxhQUFZLGVBQWUsR0FBTztJQUNqRSxtQkFBQTs7RUEzQmhCLElBbUJRLGFBQVksZUFBZTtFQW5CbkMsSUFtQjJDLGFBQVksZUFBZSxHQUFPO0lBRWpFLFVBQUE7SUFDQSx3Q0FBQTtJQUNBLGdDQUFBOztFQUVKLElBQUMsVUFDRyxhQUFZLGVBQWU7RUFEL0IsSUFBQyxVQUNzQyxhQUFZLGVBQWUsR0FBTztJQUNqRSxVQUFBOztFQTNCaEIsSUFtQlEsYUFBWSxlQUFlO0VBbkJuQyxJQW1CMkMsYUFBWSxlQUFlLEdBQU87SUFFakUsVUFBQTtJQUNBLHdDQUFBO0lBQ0EsZ0NBQUE7O0VBRUosSUFBQyxVQUNHLGFBQVksZUFBZTtFQUQvQixJQUFDLFVBQ3NDLGFBQVksZUFBZSxHQUFPO0lBQ2pFLFVBQUE7O0VBM0JoQixJQW1CUSxhQUFZLGVBQWU7RUFuQm5DLElBbUIyQyxhQUFZLGVBQWUsR0FBTztJQUVqRSxtQkFBQTtJQUNBLHdDQUFBO0lBQ0EsZ0NBQUE7O0VBRUosSUFBQyxVQUNHLGFBQVksZUFBZTtFQUQvQixJQUFDLFVBQ3NDLGFBQVksZUFBZSxHQUFPO0lBQ2pFLG1CQUFBOztFQTNCaEIsSUFtQlEsYUFBWSxlQUFlO0VBbkJuQyxJQW1CMkMsYUFBWSxlQUFlLEdBQU87SUFFakUsbUJBQUE7SUFDQSx3Q0FBQTtJQUNBLGdDQUFBOztFQUVKLElBQUMsVUFDRyxhQUFZLGVBQWU7RUFEL0IsSUFBQyxVQUNzQyxhQUFZLGVBQWUsR0FBTztJQUNqRSxtQkFBQTs7RUEzQmhCLElBbUJRLGFBQVksZUFBZTtFQW5CbkMsSUFtQjJDLGFBQVksZUFBZSxHQUFPO0lBRWpFLFlBQUE7SUFDQSx3Q0FBQTtJQUNBLGdDQUFBOztFQUVKLElBQUMsVUFDRyxhQUFZLGVBQWU7RUFEL0IsSUFBQyxVQUNzQyxhQUFZLGVBQWUsR0FBTztJQUNqRSxZQUFBOztFQTNCaEIsSUFtQlEsYUFBWSxlQUFlO0VBbkJuQyxJQW1CMkMsYUFBWSxlQUFlLEdBQU87SUFFakUsbUJBQUE7SUFDQSx3Q0FBQTtJQUNBLGdDQUFBOztFQUVKLElBQUMsVUFDRyxhQUFZLGVBQWU7RUFEL0IsSUFBQyxVQUNzQyxhQUFZLGVBQWUsR0FBTztJQUNqRSxtQkFBQTs7RUEzQmhCLElBbUJRLGFBQVksZUFBZTtFQW5CbkMsSUFtQjJDLGFBQVksZUFBZSxJQUFPO0lBRWpFLFVBQUE7SUFDQSx5Q0FBQTtJQUNBLGlDQUFBOztFQUVKLElBQUMsVUFDRyxhQUFZLGVBQWU7RUFEL0IsSUFBQyxVQUNzQyxhQUFZLGVBQWUsSUFBTztJQUNqRSxVQUFBOztFQTNCaEIsSUFtQlEsYUFBWSxlQUFlO0VBbkJuQyxJQW1CMkMsYUFBWSxlQUFlLElBQU87SUFFakUsa0JBQUE7SUFDQSwwQ0FBQTtJQUNBLGtDQUFBOztFQUVKLElBQUMsVUFDRyxhQUFZLGVBQWU7RUFEL0IsSUFBQyxVQUNzQyxhQUFZLGVBQWUsSUFBTztJQUNqRSxrQkFBQTs7RUEzQmhCLElBbUJRLGFBQVksZUFBZTtFQW5CbkMsSUFtQjJDLGFBQVksZUFBZSxJQUFPO0lBRWpFLGtCQUFBO0lBQ0EsMENBQUE7SUFDQSxrQ0FBQTs7RUFFSixJQUFDLFVBQ0csYUFBWSxlQUFlO0VBRC9CLElBQUMsVUFDc0MsYUFBWSxlQUFlLElBQU87SUFDakUsa0JBQUE7O0VBM0JoQixJQW1CUSxhQUFZLGVBQWU7RUFuQm5DLElBbUIyQyxhQUFZLGVBQWUsSUFBTztJQUVqRSxrQkFBQTtJQUNBLDBDQUFBO0lBQ0Esa0NBQUE7O0VBRUosSUFBQyxVQUNHLGFBQVksZUFBZTtFQUQvQixJQUFDLFVBQ3NDLGFBQVksZUFBZSxJQUFPO0lBQ2pFLGtCQUFBOztFQTNCaEIsSUFtQlEsYUFBWSxlQUFlO0VBbkJuQyxJQW1CMkMsYUFBWSxlQUFlLElBQU87SUFFakUsa0JBQUE7SUFDQSwwQ0FBQTtJQUNBLGtDQUFBOztFQUVKLElBQUMsVUFDRyxhQUFZLGVBQWU7RUFEL0IsSUFBQyxVQUNzQyxhQUFZLGVBQWUsSUFBTztJQUNqRSxrQkFBQTs7RUEzQmhCLElBbUJRLGFBQVksZUFBZTtFQW5CbkMsSUFtQjJDLGFBQVksZUFBZSxJQUFPO0lBRWpFLGtCQUFBO0lBQ0EsMENBQUE7SUFDQSxrQ0FBQTs7RUFFSixJQUFDLFVBQ0csYUFBWSxlQUFlO0VBRC9CLElBQUMsVUFDc0MsYUFBWSxlQUFlLElBQU87SUFDakUsa0JBQUE7O0VBM0JoQixJQW1CUSxhQUFZLGVBQWU7RUFuQm5DLElBbUIyQyxhQUFZLGVBQWUsSUFBTztJQUVqRSxZQUFBO0lBQ0EsMENBQUE7SUFDQSxrQ0FBQTs7RUFFSixJQUFDLFVBQ0csYUFBWSxlQUFlO0VBRC9CLElBQUMsVUFDc0MsYUFBWSxlQUFlLElBQU87SUFDakUsWUFBQTs7RUEzQmhCLElBbUJRLGFBQVksZUFBZTtFQW5CbkMsSUFtQjJDLGFBQVksZUFBZSxJQUFPO0lBRWpFLGtCQUFBO0lBQ0EsMENBQUE7SUFDQSxrQ0FBQTs7RUFFSixJQUFDLFVBQ0csYUFBWSxlQUFlO0VBRC9CLElBQUMsVUFDc0MsYUFBWSxlQUFlLElBQU87SUFDakUsa0JBQUE7O0VBM0JoQixJQW1CUSxhQUFZLGVBQWU7RUFuQm5DLElBbUIyQyxhQUFZLGVBQWUsSUFBTztJQUVqRSxrQkFBQTtJQUNBLDBDQUFBO0lBQ0Esa0NBQUE7O0VBRUosSUFBQyxVQUNHLGFBQVksZUFBZTtFQUQvQixJQUFDLFVBQ3NDLGFBQVksZUFBZSxJQUFPO0lBQ2pFLGtCQUFBOztFQTNCaEIsSUFtQlEsYUFBWSxlQUFlO0VBbkJuQyxJQW1CMkMsYUFBWSxlQUFlLElBQU87SUFFakUsa0JBQUE7SUFDQSwwQ0FBQTtJQUNBLGtDQUFBOztFQUVKLElBQUMsVUFDRyxhQUFZLGVBQWU7RUFEL0IsSUFBQyxVQUNzQyxhQUFZLGVBQWUsSUFBTztJQUNqRSxrQkFBQTs7RUEzQmhCLElBbUJRLGFBQVksZUFBZTtFQW5CbkMsSUFtQjJDLGFBQVksZUFBZSxJQUFPO0lBRWpFLFNBQUE7SUFDQSwwQ0FBQTtJQUNBLGtDQUFBOztFQUVKLElBQUMsVUFDRyxhQUFZLGVBQWU7RUFEL0IsSUFBQyxVQUNzQyxhQUFZLGVBQWUsSUFBTztJQUNqRSxTQUFBOztFQTNCaEIsSUFtQlEsYUFBWSxlQUFlO0VBbkJuQyxJQW1CMkMsYUFBWSxlQUFlLElBQU87SUFFakUsa0JBQUE7SUFDQSwwQ0FBQTtJQUNBLGtDQUFBOztFQUVKLElBQUMsVUFDRyxhQUFZLGVBQWU7RUFEL0IsSUFBQyxVQUNzQyxhQUFZLGVBQWUsSUFBTztJQUNqRSxrQkFBQTs7OztBRTlFcEI7QUFBUTtFQUNKLGtCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxhQUFBOztBQUVKO0VEa0JJLGNBQUE7RUFDQSxpQ0FBQTs7QUNoQko7RUFDSSxnQkFBQTtFQUNBLHNCQUFBOzs7QUNOSjtFQUNJLGtCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxnQkFBQTs7QUFFSjtFQUNJLHNCQUFBO0VBQ0Esa0JBQUE7RUFDQSxPQUFBO0VBQ0EsTUFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0EsZ0JBQUE7RUZGQSxtQkFBbUIsb0JBQW5CO0VBQ0EsV0FBVyxvQkFBWDs7QUVHQSxLQUFDO0VBQ0csYUFBQTs7QUFHUjtFQUNJLFVBQUE7RUZUQSxtQkFBbUIsb0JBQW5CO0VBQ0EsV0FBVyxvQkFBWDs7QUVXSjtFQUNJLFVBQUE7RUFDQSxvQkFBQTtFRmRBLG1CQUFtQix1QkFBbkI7RUFDQSxXQUFXLHVCQUFYOztBRWdCSjtFRlRJLGNBQUE7RUFDQSxpQ0FBQTtFRVVBLHNCQUFBO0VBQ0EsWUFBQTtFQUNBLGtCQUFBO0VBQ0EsVUFBQTs7QUFJSjtFRjFDSSxrQ0FBQTtFQUNBLDBCQUFBOztBRTZDSjtFQUNJLG9CQUFBO0VGM0JBLHVEQUFBO0VBQ0EsK0NBQUE7O0FFNkJKO0VBQ0ksb0JBQUE7RUYvQkEsdURBQUE7RUFDQSwrQ0FBQTs7QUVpQ0o7RUFDSTtJQUNJLFVBQUE7SUFDQSxtQkFBbUIsdUJBQW5COztFQUVKO0lBQ0ksVUFBQTtJQUNBLG1CQUFtQixvQkFBbkI7OztBQUdSO0VBQ0k7SUFDSSxVQUFBO0lBQ0EsV0FBVyx1QkFBWDs7RUFFSjtJQUNJLFVBQUE7SUFDQSxXQUFXLG9CQUFYOzs7QUFHUjtFQUNJO0lBQ0ksVUFBQTtJQUNBLG1CQUFtQixvQkFBbkI7O0VBRUo7SUFDSSxVQUFBO0lBQ0EsbUJBQW1CLHVCQUFuQjs7O0FBR1I7RUFDSTtJQUNJLFVBQUE7SUFDQSxXQUFXLG9CQUFYOztFQUVKO0lBQ0ksVUFBQTtJQUNBLFdBQVcsdUJBQVg7OztBQU1SO0VGN0VJLHNEQUFBO0VBQ0EsOENBQUE7O0FFK0VKO0VGaEZJLHNEQUFBO0VBQ0EsOENBQUE7O0FFbUZKO0VBQ0k7SUFDSSxVQUFBOztFQUVKO0lBQ0ksVUFBQTs7O0FBR1I7RUFDSTtJQUNJLFVBQUE7O0VBRUo7SUFDSSxVQUFBOzs7QUFHUjtFQUNJO0lBQ0ksVUFBQTs7RUFFSjtJQUNJLFVBQUE7OztBQUdSO0VBQ0k7SUFDSSxVQUFBOztFQUVKO0lBQ0ksVUFBQTs7OztBQ3BIUjtBQUFlO0VBQ1gsa0JBQUE7RUFDQSxPQUFBO0VBQ0EsTUFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0Esc0JBQUE7RUFDQSxnQkFBQTtFSElBLG9CQUFBO0VBQ0Esb0JBQUE7RUFDQSxxQkFBQTtFQUNBLGFBQUE7RUF1RUEseUJBQUE7RUFDQSxzQkFBQTtFQUNBLDJCQUFBO0VBQ0EsbUJBQUE7O0FHN0VKO0VIc0NJLHVCQUFBO0VBQ0Esb0JBQUE7RUFDQSxtQ0FBQTtFQUNBLDJCQUFBOztBR3RDSjtFSCtDSSx5QkFBQTtFQUNBLHNCQUFBO0VBQ0Esc0NBQUE7RUFDQSw4QkFBQTs7QUcvQ0osYUFBYTtFQUNULGFBQUE7O0FBRUo7QUFBUztFQUNMLFdBQUE7RUFDQSxzQkFBQTtFQUNBLGtCQUFBO0VBQ0EsU0FBQTtFQUNBLFlBQUE7RUFDQSxtQ0FBQTtFQUNBLDJCQUFBO0VBQ0EsV0FBQTs7QUFSSixPQVNJO0FBVEssUUFTTDtFQUNJLGdCQUFBOztBQUdSLE9BQVE7RUFDSixZQUFBOztBQUVKO0FBQVM7QUFBVTtFQUNmLG1CQUFBOztBQURKLE9BRUksRUFBQztBQUZJLFFBRUwsRUFBQztBQUZjLFVBRWYsRUFBQztFQUNHLHFCQUFBO0VBQ0Esa0JBQUE7RUFDQSxXQUFBO0VBQ0Esc0JBQUE7RUgvQkosb0JBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0VBQ0EsYUFBQTtFQXFEQSx3QkFBQTtFQUNBLHFCQUFBO0VBQ0EsK0JBQUE7RUFDQSx1QkFBQTtFQWVBLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSwyQkFBQTtFQUNBLG1CQUFBO0VHMUNJLGVBQUE7RUFDQSxlQUFBOztBSG1OSixPRzVOQSxFQUFDLEtINE5BO0FBQUQsUUc1TkEsRUFBQyxLSDROQTtBQUFELFVHNU5BLEVBQUMsS0g0TkE7RUFDRyxTQUFTLEVBQVQ7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLGtCQUFBO0VBQ0EsVUFBQTtFQUNBLFNBQUE7RUFDQSxrQkFBa0Isd0dBQWxCO0VBQ0Esa0JBQWtCLDRGQUFsQjtFQUNBLDRCQUFBO0VBQ0EsMkJBQUE7RUFDQSwwQkFBQTtFQUNBLFVBQUE7RUFDQSxvQkFBQTtFQWhTSixrQ0FBQTtFQUNBLDBCQUFBOztBQWtTQSxJQUFJLElBQUkscUJBQXNCLFFHNU85QixFQUFDLEtINE84QixPQUFPO0FBQXRDLElBQUksSUFBSSxxQkFBc0IsU0c1TzlCLEVBQUMsS0g0TzhCLE9BQU87QUFBdEMsSUFBSSxJQUFJLHFCQUFzQixXRzVPOUIsRUFBQyxLSDRPOEIsT0FBTztBQUFTLE9HNU8vQyxFQUFDLEtINE8rQyxhQUFhO0FBQWQsUUc1Ty9DLEVBQUMsS0g0TytDLGFBQWE7QUFBZCxVRzVPL0MsRUFBQyxLSDRPK0MsYUFBYTtFQUN6RCxVQUFBO0VBcFNKLGtDQUFBO0VBQ0EsMEJBQUE7O0FHb0RKLE9BRUksRUFBQyxLQVdHLEVBQUM7QUFiQSxRQUVMLEVBQUMsS0FXRyxFQUFDO0FBYlUsVUFFZixFQUFDLEtBV0csRUFBQztBQWJULE9BRUksRUFBQyxLQVdXLEVBQUM7QUFiUixRQUVMLEVBQUMsS0FXVyxFQUFDO0FBYkUsVUFFZixFQUFDLEtBV1csRUFBQztBQWJqQixPQUVJLEVBQUMsS0FXZ0IsS0FBSTtBQWJoQixRQUVMLEVBQUMsS0FXZ0IsS0FBSTtBQWJOLFVBRWYsRUFBQyxLQVdnQixLQUFJO0FBYnpCLE9BRUksRUFBQyxLQVd3QixLQUFJO0FBYnhCLFFBRUwsRUFBQyxLQVd3QixLQUFJO0FBYmQsVUFFZixFQUFDLEtBV3dCLEtBQUk7RUFDckIsZ0JBQUE7O0FBZFosT0FpQkksRUFBQztBQWpCSSxRQWlCTCxFQUFDO0FBakJjLFVBaUJmLEVBQUM7RUFDRyxZQUFBO0VIWEosbUJBQUE7RUFDQSxzQkFBQTtFQUNBLGtCQUFBO0VBQ0EsY0FBQTs7QUdWSixPQXFCSSxFQUFDO0FBckJJLFFBcUJMLEVBQUM7QUFyQmMsVUFxQmYsRUFBQztFQUNHLGNBQUE7O0FBR1IsT0FDSTtBQURLLFVBQ0w7RUFDSSxlQUFBO0VBQ0EsZ0JBQUE7RUFDQSxrQkFBQTtFQUNBLGNBQUE7RUFDQSxrQkFBQTtFQUNBLGdCQUFBO0VBQ0EsdUJBQUE7RUFDQSxtQkFBQTtFQUNBLGlCQUFBO0VBQ0EscUJBQUE7RUFDQSxnQkFBQTs7QUFaUixPQWNJO0FBZEssVUFjTDtBQWRKLE9BY1c7QUFkRixVQWNFO0VIaENQLG1CQUFBO0VBQ0Esc0JBQUE7RUFDQSxrQkFBQTtFQUNBLGNBQUE7RUFuQ0Esb0JBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0VBQ0EsYUFBQTtFQW1DQSx1QkFBQTtFQUNBLG9CQUFBO0VBQ0EsbUNBQUE7RUFDQSwyQkFBQTtFQWlDQSx5QkFBQTtFQUNBLHNCQUFBO0VBQ0EsMkJBQUE7RUFDQSxtQkFBQTtFQXpGQSxtQkFBbUIsb0JBQW5CO0VBQ0EsV0FBVyxvQkFBWDs7QUc2REosT0FxQkk7QUFyQkssVUFxQkw7RUFDSSxpQkFBQTs7QUF0QlIsT0F3QkksT0FBTTtBQXhCRCxVQXdCTCxPQUFNO0VBQ0Ysa0JBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTs7QUFHUjtFQUNJLE9BQUE7RUFDQSxNQUFBO0VBQ0EsWUFBQTtFQUNBLGVBQUE7O0FBSkosT0FLSSxFQUFDO0VBQ0csaUJBQUE7RUFDQSxZQUFBOztBQUVKLE1BQU87RUhyR1AsbUJBQW1CLG9CQUFuQjtFQUNBLFdBQVcsb0JBQVg7O0FHd0dKO0VBQ0ksWUFBQTtFQUNBLFdBQUE7RUFDQSxrQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLHNCQUFBO0VBQ0EsZUFBQTtFSHJHQSxvQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7RUFDQSxhQUFBO0VBK0NBLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSxzQ0FBQTtFQUNBLDhCQUFBO0VBcUJBLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSwyQkFBQTtFQUNBLG1CQUFBO0VHNEJBLGdCQUFBOztBQVpKLFVBYUksRUFBQztFQUNHLGlCQUFBO0VBQ0EsWUFBQTs7QUFmUixVQWlCSTtFQUNJLGlCQUFBOztBQUNBLFVBRkosUUFFSztFQUNHLGlCQUFBOztBQUdSLE9BQU8sVUFBVztFQUNkLGFBQUE7O0FBRUosZUFBZ0I7QUFBRyxnQkFBaUI7RUFDaEMsb0JBQUE7O0FBRUosT0FBUTtBQUFHLEtBQU07RUFDYixrQkFBQTs7QUFFSixLQUFNO0VBQ0YsTUFBQTtFQUNBLGFBQUE7O0FBbENSLFVBb0NJO0VBQ0ksV0FBQTs7QUFyQ1IsVUF1Q0k7QUFBWSxVQUFDO0VBQ1Qsa0JBQUE7O0FBRUosVUFBQztBQTFDTCxVQTBDaUI7RUFDVCxrQkFBQTs7QUEzQ1IsVUE2Q0k7RUFDSSxPQUFBO0VBQ0EsTUFBQTs7QUFNUjtFQUNJLE9BQUE7RUFDQSxTQUFBO0VBQ0EsWUFBQTtFQUNBLGVBQUE7O0FBSkosUUFLSSxFQUFDO0VBQ0csaUJBQUE7RUFDQSxZQUFBOztBQVBSLFFBU0k7RUgzSEEsbUJBQUE7RUFDQSxzQkFBQTtFQUNBLGtCQUFBO0VBQ0EsY0FBQTtFRzBISSxrQkFBQTtFQUNBLG1CQUFBO0VBQ0EsdUJBQUE7O0FBS1I7RUFDSSxhQUFBO0VBQ0EsZ0JBQUE7RUFDQSxZQUFBO0VBQ0EsTUFBQTs7QUFKSixPQUtJO0VBQ0ksZUFBQTtFQUNBLGdCQUFBOztBQVBSLE9BU0ksRUFBQztFQUNHLGdCQUFBOztBQVZSLE9BWUksRUFBQztBQVpMLE9BWWdCLEVBQUM7RUFDVCxZQUFBO0VBQ0EsV0FBQTtFQUNBLHNCQUFBO0VBQ0EsZUFBQTtFQUNBLGdCQUFBO0VIckxKLG9CQUFBO0VBQ0Esb0JBQUE7RUFDQSxxQkFBQTtFQUNBLGFBQUE7RUFxREEsd0JBQUE7RUFDQSxxQkFBQTtFQUNBLCtCQUFBO0VBQ0EsdUJBQUE7RUFlQSx5QkFBQTtFQUNBLHNCQUFBO0VBQ0EsMkJBQUE7RUFDQSxtQkFBQTtFRzRHSSxXQUFBO0VBQ0EsNEJBQUE7RUFDQSx5QkFBQTtFQUNBLDBCQUFBO0VBQ0EsOEJBQUE7RUFDQSxzQkFBQTtFQUNBLGVBQUE7RUFDQSx5QkFBQTs7QUE1QlIsT0E4QkksRUFBQztFQUNHLFlBQUE7O0FBL0JSLE9BaUNJLEVBQUM7RUhqT0Qsa0NBQUE7RUFDQSwwQkFBQTtFR2tPSSxnQkFBQTtFQUNBLCtCQUFBO0VBQ0Esa0JBQUE7O0FBQ0EsT0FMSixFQUFDLFNBS0k7QUFBUyxJQUFJLElBQUkscUJBQXNCLFFBTDVDLEVBQUMsU0FLNEM7QUFBUyxPQUx0RCxFQUFDLFNBS3NEO0VBQy9DLGNBQUE7O0FBdkNaLE9BMENJO0VBQ0ksa0JBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxtQkFBQTtFQUNBLG9DQUFBO0VIaFBKLGtDQUFBO0VBQ0EsMEJBQUE7O0FHbVBKO0VBQ0ksWUFBQTs7QUFESixjQUVJLEVBQUM7QUFGTCxjQUVnQixFQUFDO0VBQ1QsaUJBQUE7RUFDQSxvQkFBQTtFQUNBLFlBQUE7RUgzS0oseUJBQUE7RUFDQSxzQkFBQTtFQUNBLHNDQUFBO0VBQ0EsOEJBQUE7O0FHbUtKLGNBUUksS0FBSTtFQUNBLGNBQUE7RUFDQSxjQUFBO0VBQ0EsU0FBQTtFQUNBLGdCQUFBO0VBQ0Esa0JBQUE7RUFDQSx1QkFBQTtFQUNBLG1CQUFBO0VBQ0EsZ0JBQUE7RUFDQSxlQUFBOztBQUdSLGtCQUNJO0VIdk1BLHVCQUFBO0VBQ0Esb0JBQUE7RUFDQSxtQ0FBQTtFQUNBLDJCQUFBO0VHdU1JLGNBQUE7O0FIcUNKLGtCR3hDQSxlSHdDQztFQUNHLHdCQUFBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFQUNBLHdCQUFBO0VBQ0EscUJBQUE7O0FHOUNSLGtCQU1JLEVBQUM7QUFOTCxrQkFNZ0IsRUFBQztFQUNULFdBQUE7RUhuTkosbUJBQUE7RUFDQSxzQkFBQTtFQUNBLGtCQUFBO0VBQ0EsY0FBQTtFR2tOSSxXQUFBO0VBQ0EsZUFBQTs7QUFHUjtFQUNJLFNBQUE7RUFDQSxTQUFBOztBQUZKLGVBR0k7RUFDSSxZQUFBO0VBQ0EsTUFBQTs7QUFHUixVQUNJLE1BQUs7QUFERyxPQUNSLE1BQUs7QUFEVCxVQUN3QixNQUFLO0FBRGpCLE9BQ1ksTUFBSztBQUQ3QixVQUNnRCxNQUFLO0FBRHpDLE9BQ29DLE1BQUs7QUFEckQsVUFDc0UsTUFBSztBQUQvRCxPQUMwRCxNQUFLO0FBRDNFLFVBQzJGLE1BQUs7QUFEcEYsT0FDK0UsTUFBSztBQURoRyxVQUM4RyxNQUFLO0FBRHZHLE9BQ2tHLE1BQUs7RUg4Qi9HLHNCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxjQUFBO0VBQ0EsWUFBQTtFQUNBLHdCQUFBO0VBQ0EscUJBQUE7RUFDQSxvQkFBQTtFQUNBLGdCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxvQkFBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsZ0JBQUE7RUFDQSw2QkFBQTtFQUNBLFVBQUE7RUFDQSw2QkFBQTs7QUFDQSxVRy9DQSxNQUFLLGFIK0NKO0FBQUQsT0cvQ0EsTUFBSyxhSCtDSjtBQUFELFVHL0NvQixNQUFLLGlCSCtDeEI7QUFBRCxPRy9Db0IsTUFBSyxpQkgrQ3hCO0FBQUQsVUcvQzRDLE1BQUssZUgrQ2hEO0FBQUQsT0cvQzRDLE1BQUssZUgrQ2hEO0FBQUQsVUcvQ2tFLE1BQUssY0grQ3RFO0FBQUQsT0cvQ2tFLE1BQUssY0grQ3RFO0FBQUQsVUcvQ3VGLE1BQUssWUgrQzNGO0FBQUQsT0cvQ3VGLE1BQUssWUgrQzNGO0FBQUQsVUcvQzBHLE1BQUssWUgrQzlHO0FBQUQsT0cvQzBHLE1BQUssWUgrQzlHO0VBQ0csY0FBQTtFQUNBLFVBQUE7OztBSS9VUixLQUNJO0FBREcsS0FDSDtBQURVLE1BQ1Y7QUFESixLQUNjO0FBRFAsS0FDTztBQURBLE1BQ0E7RUFDTixrQkFBQTs7QUFHUixVQUFXO0VBQ1AsaUJBQUE7O0FBRUosY0FDSTtBQURZLGFBQ1o7RUFDSSxpQkFBQTs7QUFHUixvQkFDSTtFQUNJLGlCQUFBOztBQUlSLFFBQVM7RUFDTCxpQkFBQTs7QUFFSixjQUFlO0VBQ1gsaUJBQUE7O0FBRUosZUFDSTtBQURhLFdBQ2I7RUFDSSxjQUFBO0VBQ0Esb0JBQUE7O0FBR1IsY0FBYyxlQUFnQjtFQUMxQixvQkFBQTs7QUFFSixhQUNJO0VBQ0ksaUJBQUE7O0FBR0osYUFBQyxjQUNHO0FBRGEsYUFBQyxhQUNkO0FBTlIsYUFLcUMsZUFDN0I7QUFOUixhQUtxRCxjQUM3QztBQUQ0RCxjQUFlLGNBQzNFO0FBRDhFLGFBQWMsY0FDNUY7RUFDSSxrQkFBQTs7QUFHUixhQUFDLG9CQUNHO0FBWFIsYUFVMkIscUJBQ25CO0FBRHlDLG9CQUFxQixjQUM5RDtFQUNJLGtCQUFBOztBQVpaLGFBZUksU0FBUztFQUNMLGtCQUFBOztBQWhCUixhQWtCSSxZQUFZO0FBbEJoQixhQWtCaUMsZ0JBQWdCO0VBQ3pDLGlCQUFBOztBQW5CUixhQXNCSSxlQUFlO0VBQ1gsa0JBQUE7O0FBdkJSLGFBeUJJLGVBQWMsZUFBZ0I7RUFDMUIsaUJBQUE7O0FBMUJSLGFBNkJJLGdCQUFnQjtBQTdCcEIsYUE2Qm1DLGNBQWE7QUE3QmhELGFBNkJpRSxXQUFXO0VBQ3BFLGtCQUFBOztBQTlCUixhQWlDSSxNQUFNO0FBQVksYUFBQyxLQUFNO0VBQ3JCLFNBQUE7O0FBbENSLGFBcUNJO0VBQ0ksU0FBQTs7QUF0Q1IsYUF3Q0k7QUF4Q0osYUF3Q2lCO0VBQ1QsU0FBQTs7QUFLSixPQUFDO0VKaEZELGtDQUFBO0VBQ0EsMEJBQUE7RUFlQSxtQkFBbUIsb0JBQW5CO0VBQ0EsV0FBVyxvQkFBWDs7QUlrRUksT0FISCxjQUdLLGdCQUNFO0FBRGUsT0FIdEIsY0FHd0IsU0FDakI7QUFEMkIsT0FIbEMsY0FHb0MsUUFDN0I7RUpwRlIsa0NBQUE7RUFDQSwwQkFBQTs7QUlrRkksT0FISCxjQUdLLGdCQUlFO0FBSmUsT0FIdEIsY0FHd0IsU0FJakI7QUFKMkIsT0FIbEMsY0FHb0MsUUFJN0I7RUp2RlIsa0NBQUE7RUFDQSwwQkFBQTs7QUkwRkksT0FYSCxjQVdLO0FBQWMsT0FYbkIsY0FXcUI7RUozRnRCLGtDQUFBO0VBQ0EsMEJBQUE7O0FJOEZBLE9BQUM7RUovRkQsa0NBQUE7RUFDQSwwQkFBQTtFQWVBLG1CQUFtQix3QkFBbkI7RUFDQSxXQUFXLHdCQUFYOztBSWlGSSxPQUhILGNBR0ssZ0JBQ0U7QUFEZSxPQUh0QixjQUd3QixTQUNqQjtBQUQyQixPQUhsQyxjQUdvQyxRQUM3QjtFSm5HUixrQ0FBQTtFQUNBLDBCQUFBO0VJb0dZLFVBQUE7O0FBSFIsT0FISCxjQUdLLGdCQUtFO0FBTGUsT0FIdEIsY0FHd0IsU0FLakI7QUFMMkIsT0FIbEMsY0FHb0MsUUFLN0I7RUp2RlIsbUJBQW1CLHdCQUFuQjtFQUNBLFdBQVcsd0JBQVg7RUFqQkEsa0NBQUE7RUFDQSwwQkFBQTs7QUkyR0ksT0FiSCxjQWFLO0FBQWMsT0FibkIsY0FhcUIsV0FBVSxJQUFJLGFBQWEsSUFBSTtFSjVGckQsbUJBQW1CLHdCQUFuQjtFQUNBLFdBQVcsd0JBQVg7RUFqQkEsa0NBQUE7RUFDQSwwQkFBQTs7QUlpSEosS0FBSyxVQUNEO0VBQ0ksY0FBQTs7QUFFSixLQUpDLFVBSUEsZUFBZ0I7QUFBZSxlQUFnQixNQUovQyxVQUlpRDtBQUp0RCxLQUFLLFVBSWdFLGNBQWE7RUFDMUUsaUJBQUE7O0FBS0osUUFBQztBQUFELE9BQUM7QUFBaUIsUUFBQztBQUFELE9BQUM7RUo1SG5CLGtDQUFBO0VBQ0EsMEJBQUE7RUFlQSxtQkFBbUIsb0JBQW5CO0VBQ0EsV0FBVyxvQkFBWDs7QUkrR0EsUUFBQztBQUFELE9BQUM7QUFBaUIsUUFBQztBQUFELE9BQUM7RUpoSW5CLGtDQUFBO0VBQ0EsMEJBQUE7O0FJbUlBLFFBQUM7QUFBRCxPQUFDO0FBQWlCLFFBQUM7QUFBRCxPQUFDO0VKcEhuQixtQkFBbUIsd0JBQW5CO0VBQ0EsV0FBVyx3QkFBWDs7QUlzSEEsT0FBUSxXQUFHO0FBQVgsT0FBUSxVQUFHO0FBQWlCLE9BQVEsV0FBRztBQUFYLE9BQVEsVUFBRztFSnZIdkMsbUJBQW1CLHlCQUFuQjtFQUNBLFdBQVcseUJBQVg7O0FJeUhBLE9BQVEsV0FBRyxjQUFjO0FBQXpCLE9BQVEsVUFBRyxjQUFjO0VKMUh6QixtQkFBbUIseUJBQW5CO0VBQ0EsV0FBVyx5QkFBWDs7QUk0SEEsUUFBQyxlQUFlO0FBQWhCLE9BQUMsZUFBZTtBQUFhLFFBQUMsZUFBZTtBQUFoQixPQUFDLGVBQWU7RUo3SDdDLG1CQUFtQix1QkFBbkI7RUFDQSxXQUFXLHVCQUFYOztBSWdJSixLQUFLLFdBQVk7QUFBZSxLQUFLLFVBQVc7RUFDNUMsaUJBQUE7OztBQ2hKSjtFQUNJLFlBQUE7RUFDQSxXQUFBO0VBQ0EsbUJBQUE7RUFDQSxzQkFBQTtFQUNBLGVBQUE7RUFDQSxnQkFBQTtFQUNBLGtCQUFBO0VMbUJBLG9CQUFBO0VBQ0Esb0JBQUE7RUFDQSxxQkFBQTtFQUNBLGFBQUE7RUF1RUEseUJBQUE7RUFDQSxzQkFBQTtFQUNBLDJCQUFBO0VBQ0EsbUJBQUE7RUs3RkEsV0FBQTs7QUFWSixVQVdJO0VBQ0ksa0JBQUE7RUFDQSxXQUFBOztBTG9RSixVS3RRQSxFTHNRQztFQUNHLFNBQVMsRUFBVDtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0Esa0JBQUE7RUFDQSxVQUFBO0VBQ0EsU0FBQTtFQUNBLGtCQUFrQix3R0FBbEI7RUFDQSxrQkFBa0IsNEZBQWxCO0VBQ0EsNEJBQUE7RUFDQSwyQkFBQTtFQUNBLDBCQUFBO0VBQ0EsVUFBQTtFQUNBLG9CQUFBO0VBaFNKLGtDQUFBO0VBQ0EsMEJBQUE7O0FBa1NBLElBQUksSUFBSSxxQkFBc0IsV0t0UjlCLEVMc1IrQixPQUFPO0FBQVMsVUt0Ui9DLEVMc1JnRCxhQUFhO0VBQ3pELFVBQUE7RUFwU0osa0NBQUE7RUFDQSwwQkFBQTs7QUtDSixVQWdCSTtFQUNJLFdBQUE7RUFDQSxZQUFBO0VBQ0Esa0JBQUE7RUx1Q0osbUJBQUE7RUFDQSxzQkFBQTtFQUNBLGtCQUFBO0VBQ0EsY0FBQTs7QUs3REosVUFzQkksTUFBSztFTG9TTCxzQkFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0EsY0FBQTtFQUNBLFlBQUE7RUFDQSx3QkFBQTtFQUNBLHFCQUFBO0VBQ0Esb0JBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBO0VBQ0Esb0JBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtFQUNBLGdCQUFBO0VBRUEsVUFBQTtFQUNBLDZCQUFBO0VLbFRJLFlBQUE7RUFDQSxzQkFBQTtFQUNBLDZCQUFBO0VBQ0EsNEJBQUE7RUFDQSw2QkFBQTtFQUNBLFlBQUE7RUFDQSxrQ0FBQTtFQUNBLDBCQUFBO0VMakNKLGtDQUFBO0VBQ0EsMEJBQUE7RUFrUEEsc0JBQXNCLG1rQkFBdEI7O0FBMEZBLFVLclRBLE1BQUssZUxxVEo7RUFDRyxjQUFBO0VBQ0EsVUFBQTs7QUszU0EsVUFaSixNQUFLLGVBWUE7RUFDRyx3QkFBQTs7QUFuQ1osVUFzQ0k7RUFDSSxrQkFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0EsWUFBQTtFQUNBLE1BQUE7RUFDQSxVQUFBO0VBQ0Esb0JBQUE7RUFDQSwyQkFBQTtFQUNBLDRCQUFBO0VMa01KLHNCQUFzQixxWkFBdEI7RUtoTUksa0NBQUE7RUFDQSwwQkFBQTtFTHBESixrQ0FBQTtFQUNBLDBCQUFBO0VLcURJLGVBQUE7O0FBcERSLFVBc0RJO0VBQ0ksYUFBQTs7QUFFSixVQUFDLGlCQUNHLE1BQUs7RUFDRCxVQUFBOztBQUZSLFVBQUMsaUJBSUc7RUFDSSxvQkFBQTtFQUNBLFVBQUE7O0FBR1IsVUFBQyxvQkFDRztFQUNJLG9CQUFBO0VBQ0EsVUFBQTs7QUFJWjtFQUNJLGtCQUFBO0VBQ0EsT0FBQTtFQUNBLE1BQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFlBQUE7RUFDQSxVQUFBO0VBQ0Esb0JBQUE7RUFDQSwrQkFBQTtFTHBGQSxrQ0FBQTtFQUNBLDBCQUFBO0VBZUEsbUJBQW1CLG9CQUFuQjtFQUNBLFdBQVcsb0JBQVg7O0FLc0VBLGtCQUFDO0VBQ0csVUFBQTtFQUNBLG9CQUFBOztBQUdSO0VBQ0ksYUFBQTs7QUFFSjtBQUFzQixXQUFZO0FBQXNCLFdBQVksR0FBRTtFQUNsRSxhQUFBOztBQUVKLEtBQU07RUFDRixrQkFBQTtFQUNBLFdBQUE7RUFDQSxPQUFBO0VBQ0EsTUFBQTtFQUNBLFlBQUE7O0FBQ0EsS0FORSxhQU1BO0VBQ0UsaUJBQUE7O0FBR1IsYUFDSSxNQUFNO0FBREssZUFDWCxNQUFNO0FBRFYsYUFDd0I7QUFEVCxlQUNTO0VBQ2hCLFNBQUE7O0FBQ0EsYUFGSixNQUFNLGFBRUE7QUFBRixlQUZKLE1BQU0sYUFFQTtBQUFGLGFBRmdCLGFBRWQ7QUFBRixlQUZnQixhQUVkO0VBQ0Usa0JBQUE7OztBQ2hIWixRQUFRO0VOZ0JKLG1CQUFtQixvQkFBbkI7RUFDQSxXQUFXLG9CQUFYO0VNZkEsZ0JBQUE7RUFFQSxZQUFBO0VBQ0EsU0FBQTtFQUNBLFNBQUE7RUFDQSxlQUFBO0VBQ0EsZ0JBQUE7O0FOd0hBLFFNaElJLFdOZ0lIO0VBQ0csU0FBUyxFQUFUO0VBQ0Esa0JBQUE7RUFDQSxPQUFBO0VBQ0EsTUFBQTtFQUNBLFlBQUE7RUFDQSxXQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSx5QkFBQTtFQUNBLGNBQUE7RUFDQSxXQUFBO0VBL0hKLGdDQUFBO0VBQ0Esd0JBQUE7O0FBZ0lJLElBQUksY0FBZSxTTTdJbkIsV05nSUg7RUF4SEQsbUJBc0ltQixXQXRJbkI7RUFDQSxXQXFJbUIsV0FySW5COztBQXVJSSxJQUFJLGNBQWUsU01oSm5CLFdOZ0lIO0VBeEhELG1CQXlJbUIsWUF6SW5CO0VBQ0EsV0F3SW1CLFlBeEluQjs7QU1USixRQUFRLFdBU0o7RUFDSSx3QkFBQTtFQUNBLHFCQUFBO0VBQ0Esb0JBQUE7RUFDQSxnQkFBQTtFQUNBLDhCQUFBO0VBQ0EsMkJBQUE7RUFDQSxzQkFBQTtFQUNBLFlBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxjQUFBO0VBQ0Esb0JBQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtFQUNBLGlCQUFBO0VBQ0Esb0JBQUE7RUFDQSxZQUFBO0VOOEJKLG1CQUFBO0VBQ0Esc0JBQUE7RUFDQSxrQkFBQTtFQUNBLGNBQUE7O0FNL0RKLFFBQVEsV0FpQ0osRUFBQztFQUNHLFdBQUE7RU4rRUosNkJBQUE7RUFDQSw0QkFBQTtFQUNBLG9CQUFBO0VNL0VJLFlBQUE7RUFDQSxpQkFBQTs7QU5vUUosUU16U0ksV0FpQ0osRUFBQyxLTndRQTtFQUNHLGtCQUFrQiwyRkFBbEI7RUFDQSxrQkFBa0IsK0VBQWxCOztBTTNTUixRQUFRLFdBeUNKO0VObUJBLG1CQUFBO0VBQ0Esc0JBQUE7RUFDQSxrQkFBQTtFQUNBLGNBQUE7O0FNL0RKLFFBQVEsV0E0Q0o7RUFDSSxvQkFBQTs7QUFFSixLQUFLLFdBQVksU0EvQ2IsV0ErQ2U7RUFDZixvQkFBQTs7QUFFSixlQUFnQixTQWxEWjtFTmdCSixtQkFBbUIsb0JBQW5CO0VBQ0EsV0FBVyxvQkFBWDtFQWpCQSxnQ0FBQTtFQUNBLHdCQUFBOzs7QU9ESixDQUFDO0VBQ0cscUJBQUE7RUFDQSxzQkFBQTtFQUNBLDBCQUFBO0VBQ0EsMkJBQUE7RUFDQSw0QkFBQTtFQUNBLGtCQUFBO0VBQ0Esa0JBQUE7OztBQUVBLENBVEgsS0FTSTtFQUNHLFdBQUE7RUFDQSxZQUFBO0VQd09KLHNCQUFzQiw0UkFBdEI7O0FPck9BLENBZEgsS0FjSTtFQUNHLFdBQUE7RUFDQSxZQUFBO0VQbU9KLHNCQUFzQixxUkFBdEI7O0FPaE9BLENBbkJILEtBbUJJO0VBQ0csV0FBQTtFQUNBLFlBQUE7RVA4Tkosc0JBQXNCLGlRQUF0Qjs7QU8zTkEsQ0F4QkgsS0F3Qkk7RUFDRyxXQUFBO0VBQ0EsWUFBQTtFUHlOSixzQkFBc0IsNGZBQXRCOztBT3ROQSxDQTdCSCxLQTZCSTtFQUNHLFdBQUE7RUFDQSxZQUFBO0VBQ0Esc0JBQXNCLDJCQUF0QjtFQUNBLGtCQUFBOztBQUVKLENBbkNILEtBbUNJO0FBQVksQ0FuQ2hCLEtBbUNpQjtFQUNWLFdBQUE7RUFDQSxZQUFBOztBQUVKLENBdkNILEtBdUNJO0VQNE1ELHNCQUFzQixpVUFBdEI7O0FPek1BLENBMUNILEtBMENJO0VQeU1ELHNCQUFzQixrVUFBdEI7O0FPdE1BLENBN0NILEtBNkNJO0VBQ0csV0FBQTtFQUNBLFlBQUE7RUFDQSxZQUFBO0VQbU1KLHNCQUFzQiw0U0FBdEI7O0FPaE1BLENBbkRILEtBbURJO0VBQ0csV0FBQTtFQUNBLFlBQUE7RUFDQSxZQUFBO0VQNkxKLHNCQUFzQix3WkFBdEI7O0FRcFBKO0VBQ0ksZUFBQTtFQUNBLHFCQUFBO0VBQ0EsV0FBQTtFQUNBLG1CQUFBO0VBQ0Esa0JBQUE7RUFDQSxnQkFBQTtFQUNBLHNCQUFBO0VBQ0Esc0JBQUE7O0FBRUosS0FBTTtFQUNGLGtCQUFBO0VBQ0EsVUFBQTtFQUNBLGtCQUFBO0VBQ0EsU0FBQTtFQUNBLGVBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBOzs7QUNmSjtFQUNJLGNBQUE7RUFDQSxlQUFBO0VBQ0Esc0JBQUE7O0FUMk5BLGNBb0hDLGFBcEhBO0FBQUQsY0FvSGlCLGFBQWMsR0FwSDlCO0FBQUQsY0FvSG9DLGFBQWMscUJBcEhqRDtFQUNHLGFBQUE7O0FBUEosY0EwSEMsYUExSEE7QUFBRCxjQTBIaUIsYUFBYyxHQTFIOUI7QUFBRCxjQTBIb0MsYUFBYyxxQkExSGpEO0VBQ0csYUFBQTs7QVNuTlI7RUFDSSxrQkFBQTtFQUNBLGdCQUFBO0VBQ0EsU0FBQTtFQUNBLG1CQUFBO0VBQ0EsdUJBQUE7RUFDQSxlQUFBO0VBQ0EsY0FBQTtFQUNBLHNCQUFBO0VBQ0EsaUJBQUE7RUFDQSxpQkFBQTtFQUNBLGdCQUFBO0VBQ0EsMEJBQUE7O0FBWkosb0JBYUk7QUFiSixvQkFhbUI7QUFibkIsb0JBYXFDO0VBQzdCLGVBQUE7O0FBSVI7RUFDSSxrQkFBQTtFQUNBLGtCQUFBO0VBQ0EsV0FBQTtFQUNBLGtCQUFBOztBVG1HQSxvQkFBQztFQUNHLFNBQVMsRUFBVDtFQUNBLGtCQUFBO0VBQ0EsT0FBQTtFQUNBLE1BQUE7RUFDQSxZQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSxXQUFBO0VBQ0EscUNBQUE7RUFDQSxjQUFBO0VBQ0EsV0FBQTtFQS9ISixnQ0FBQTtFQUNBLHdCQUFBOztBQWdJSSxJQUFJLGNBQWUscUJBYnRCO0VBeEhELG1CQXNJbUIsV0F0SW5CO0VBQ0EsV0FxSW1CLFdBckluQjs7QUF1SUksSUFBSSxjQUFlLHFCQWhCdEI7RUF4SEQsbUJBeUltQixZQXpJbkI7RUFDQSxXQXdJbUIsWUF4SW5COztBQW1LQSxvQkFBQztFQUNHLFNBQVMsRUFBVDtFQUNBLGtCQUFBO0VBQ0EsT0FBQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxXQUFBO0VBQ0EscUNBQUE7RUFDQSxjQUFBO0VBQ0EsV0FBQTtFQTNLSixrQ0FBQTtFQUNBLDBCQUFBOztBQTRLSSxJQUFJLGNBQWUscUJBYnRCO0VBcEtELG1CQWtMbUIsV0FsTG5CO0VBQ0EsV0FpTG1CLFdBakxuQjs7QUFtTEksSUFBSSxjQUFlLHFCQWhCdEI7RUFwS0QsbUJBcUxtQixZQXJMbkI7RUFDQSxXQW9MbUIsWUFwTG5COztBU2dCSixvQkFPSSxJQUFFO0VBQ0UsYUFBQTs7QUFSUixvQkFVSSxJQUFFO0VBQ0UsZ0JBQUE7O0FBR1IsY0FBYztFQUNWLGlCQUFBO0VBQ0Esa0JBQUE7RUFDQSxrQkFBQTs7QUFISixjQUFjLE1BSVY7RUFHSSxrQkFBQTs7QVRpTEosY1N4TFUsTUFJVixxQlRvTEM7RUFDRyxhQUFBOztBQVBKLGNTbExVLE1BSVYscUJUOEtDO0VBQ0csYUFBQTs7QVN6S1IsZ0JBQWlDO0VBQzdCLGNBQWM7SUFDVixpQkFBQTtJQUNBLGtCQUFBO0lBQ0Esa0JBQUE7O0VBR0osY0FBYyxhQUFjO0lBRzNCLGtCQUFBOztFVG9LRCxjU3ZLYyxhQUFjLHFCVHVLM0I7SUFDRyxhQUFBOztFQVBKLGNTaktjLGFBQWMscUJUaUszQjtJQUNHLGFBQUE7Ozs7QVV6TlI7RUFDSSxjQUFBO0VBQ0EsZUFBQTs7QUFGSixXQUdJO0VBQ0ksZ0JBQUE7RUFDQSxVQUFBO0VBQ0EsU0FBQTtFQUNBLGtCQUFBOztBVndISixXVTVIQSxHVjRIQztFQUNHLFNBQVMsRUFBVDtFQUNBLGtCQUFBO0VBQ0EsT0FBQTtFQUNBLE1BQUE7RUFDQSxZQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSxXQUFBO0VBQ0EscUNBQUE7RUFDQSxjQUFBO0VBQ0EsV0FBQTtFQS9ISixnQ0FBQTtFQUNBLHdCQUFBOztBQWdJSSxJQUFJLGNBQWUsWVV6SXZCLEdWNEhDO0VBeEhELG1CQXNJbUIsV0F0SW5CO0VBQ0EsV0FxSW1CLFdBckluQjs7QUF1SUksSUFBSSxjQUFlLFlVNUl2QixHVjRIQztFQXhIRCxtQkF5SW1CLFlBekluQjtFQUNBLFdBd0ltQixZQXhJbkI7O0FBbUtBLFdVeEtBLEdWd0tDO0VBQ0csU0FBUyxFQUFUO0VBQ0Esa0JBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSxxQ0FBQTtFQUNBLGNBQUE7RUFDQSxXQUFBO0VBM0tKLGtDQUFBO0VBQ0EsMEJBQUE7O0FBNEtJLElBQUksY0FBZSxZVXJMdkIsR1Z3S0M7RUFwS0QsbUJBa0xtQixXQWxMbkI7RUFDQSxXQWlMbUIsV0FqTG5COztBQW1MSSxJQUFJLGNBQWUsWVV4THZCLEdWd0tDO0VBcEtELG1CQXFMbUIsWUFyTG5CO0VBQ0EsV0FvTG1CLFlBcExuQjs7QVVSSixXQUdJLEdBT0k7RUFHSSxrQkFBQTs7QVZpTlIsV1UzTkEsR0FPSSxHVm9OSDtFQUNHLGFBQUE7O0FBUEosV1VyTkEsR0FPSSxHVjhNSDtFQUNHLGFBQUE7O0FVek5SLFdBaUJJO0FBakJKLFdBaUJnQixXQUFXO0FBakIzQixXQWlCMEMsV0FBVztFVndFakQsd0JBQUE7RUFDQSxxQkFBQTtFQUNBLCtCQUFBO0VBQ0EsdUJBQUE7O0FVaERBLFdBQUM7RUF0QkcsaUJBQUE7RUFDQSxrQkFBQTtFQUNBLGtCQUFBOztBQW9CSixXQUFDLE1BbkJHO0VBQ0ksY0FBQTtFQUNBLGVBQUE7O0FBaUJSLFdBQUMsTUFmRztFQUNJLGtCQUFBOztBVmdNUixXVWxMQyxNQWZHLEdWaU1IO0VBQ0csYUFBQTs7QUFQSixXVTVLQyxNQWZHLEdWMkxIO0VBQ0csYUFBQTs7QVU3S0osV0FBQyxNQVZHLEdBQUUsWUFBYTtFQUNYLDBCQUFBOztBQVNSLFdBQUMsTUFQRyxHQUFFLFdBQVk7RUFDViwwQkFBQTs7QUFNUixXQUFDLE1BSkcsR0FBRSxZQUFZLFdBQVk7RUFDdEIsa0JBQUE7O0FBT0osZ0JBQWlDO0VBd1Z6QyxXQXpWSztJQXpCRyxpQkFBQTtJQUNBLGtCQUFBO0lBQ0Esa0JBQUE7O0VBZ1hSLFdBelZLLGFBdEJHO0lBQ0ksY0FBQTtJQUNBLGVBQUE7O0VBNldaLFdBelZLLGFBbEJHO0lBQ0ksa0JBQUE7O0VWZ01SLFdVL0tDLGFBbEJHLEdWaU1IO0lBQ0csYUFBQTs7RUFQSixXVXpLQyxhQWxCRyxHVjJMSDtJQUNHLGFBQUE7O0VVK0tSLFdBelZLLGFBYkcsR0FBRSxZQUFhO0lBQ1gsMEJBQUE7O0VBcVdaLFdBelZLLGFBVkcsR0FBRSxXQUFZO0lBQ1YsMEJBQUE7O0VBa1daLFdBelZLLGFBUEcsR0FBRSxZQUFZLFdBQVk7SUFDdEIsa0JBQUE7O0VBK1ZaLFdBelZLLGFBdEJHO0lBQ0ksY0FBQTtJQUNBLGVBQUE7O0VBNldaLFdBelZLLGFBbEJHO0lBQ0ksa0JBQUE7O0VWZ01SLFdVL0tDLGFBbEJHLEdWaU1IO0lBQ0csYUFBQTs7RUFQSixXVXpLQyxhQWxCRyxHVjJMSDtJQUNHLGFBQUE7O0VVK0tSLFdBelZLLGFBYkcsR0FBRSxZQUFhO0lBQ1gsMEJBQUE7O0VBcVdaLFdBelZLLGFBVkcsR0FBRSxXQUFZO0lBQ1YsMEJBQUE7O0VBa1daLFdBelZLLGFBUEcsR0FBRSxZQUFZLFdBQVk7SUFDdEIsa0JBQUE7OztBQXpDWixXQXNESTtFQUNJLHNCQUFBO0VBQ0Esa0JBQUE7O0FBeERSLFdBMkRJO0VWaENBLG9CQUFBO0VBQ0Esb0JBQUE7RUFDQSxxQkFBQTtFQUNBLGFBQUE7RUE2QkEsbUJBQUE7RUFDQSxzQkFBQTtFQUNBLGtCQUFBO0VBQ0EsY0FBQTtFQXZCQSx5QkFBQTtFQUNBLHNCQUFBO0VBQ0EseUJBQUE7RUFDQSxtQkFBQTtFQUNBLHFCQUFBO0VBQ0EsaUJBQUE7RUF5REEseUJBQUE7RUFDQSxzQkFBQTtFQUNBLDJCQUFBO0VBQ0EsbUJBQUE7RVV4Q0ksc0JBQUE7RUFDQSxnQkFBQTtFQUNBLG1CQUFBO0VBQ0EsZUFBQTs7QUFuRVIsV0EyREksWUFTSSxFQUFFO0VBQ0UsZ0JBQUE7O0FBckVaLFdBMkRJLFlBWUksRUFBRTtFQUNFLGdCQUFBOztBQXhFWixXQTJFSSxZQUFZO0VBQ1IsaUJBQUE7O0FBNUVSLFdBOEVJO0VBQ0ksbUJBQUE7RUFDQSxrQkFBQTtFQUVBLFdBQUE7RUFDQSxnQkFBQTtFQUNBLG1CQUFBO0VBQ0EsZ0JBQUE7RUFDQSxzQkFBQTtFQUNBLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RVY5REosb0JBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0VBQ0EsYUFBQTtFQStDQSx5QkFBQTtFQUNBLHNCQUFBO0VBQ0Esc0NBQUE7RUFDQSw4QkFBQTtFQXFCQSx5QkFBQTtFQUNBLHNCQUFBO0VBQ0EsMkJBQUE7RUFDQSxtQkFBQTtFQVFBLDRCQUFBO0VBQ0EsMkJBQUE7RUFDQSxtQkFBQTs7QUF5REEsV1U3RkEsWVY2RkM7RUFDRyxTQUFTLEVBQVQ7RUFDQSxrQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0VBQ0EsV0FBQTtFQUNBLHFDQUFBO0VBQ0EsY0FBQTtFQUNBLFdBQUE7RUEzS0osa0NBQUE7RUFDQSwwQkFBQTs7QUE0S0ksSUFBSSxjQUFlLFlVMUd2QixZVjZGQztFQXBLRCxtQkFrTG1CLFdBbExuQjtFQUNBLFdBaUxtQixXQWpMbkI7O0FBbUxJLElBQUksY0FBZSxZVTdHdkIsWVY2RkM7RUFwS0QsbUJBcUxtQixZQXJMbkI7RUFDQSxXQW9MbUIsWUFwTG5COztBVVJKLFdBK0ZJO0VBQ0ksWUFBQTtFVnJDSixtQkFBQTtFQUNBLHNCQUFBO0VBQ0Esa0JBQUE7RUFDQSxjQUFBO0VVb0NJLG1CQUFBO0VBQ0Esa0JBQUE7RUFDQSxnQkFBQTtFQUNBLHVCQUFBO0VBQ0EsZUFBQTs7QUF0R1IsV0F5R0k7RUFDSSxtQkFBQTtFQUNBLGNBQUE7RVZoREosbUJBQUE7RUFDQSxzQkFBQTtFQUNBLGtCQUFBO0VBQ0EsY0FBQTtFVStDSSxnQkFBQTtFVmxGSixvQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7RUFDQSxhQUFBO0VVaUZJLGdCQUFBO0VBQ0EsZUFBQTs7QUFoSFIsV0FrSEksY0FBYztBQWxIbEIsV0FrSCtCLHFCQUFxQjtFQUM1QyxjQUFBO0VBQ0EsZ0JBQUE7RUFDQSx1QkFBQTtFQUNBLGtCQUFBO0VBQ0EsY0FBQTs7QUF2SFIsV0F5SEk7RVYxSEEsa0NBQUE7RUFDQSwwQkFBQTtFVTJISSxjQUFBO0VBQ0EsY0FBQTtFQUNBLGtCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxVQUFBOztBQS9IUixXQXlISSxXQU9JO0VBQ0ksbUJBQUE7RVZpSFIsc0JBQXNCLDJQQUF0QjtFVS9HUSwwQkFBQTtFQUNBLDRCQUFBO0VBQ0EsK0JBQUE7RUFDQSxxQkFBcUIsZ0NBQXJCO0VBQ0EscUJBQXFCLHdCQUFyQjs7QUFFSixJQUFJLElBQUkscUJBQXNCLFlBaEJsQyxXQWdCbUM7QUFBUyxXQWhCNUMsV0FnQjZDO0VBQ3JDLG9DQUFBOztBQUVKLFdBbkJKLFdBbUJLO0VBQ0csZUFBQTtFQUNBLGVBQUE7RUFDQSxjQUFBO0VBQ0EsaUJBQUE7O0FBaEpaLFdBbUpJO0VBQ0ksc0JBQUE7RUFDQSxrQkFBQTtFQUNBLGdCQUFBO0VWM0hKLG9CQUFBO0VBQ0Esb0JBQUE7RUFDQSxxQkFBQTtFQUNBLGFBQUE7RUErQ0EseUJBQUE7RUFDQSxzQkFBQTtFQUNBLHNDQUFBO0VBQ0EsOEJBQUE7RUFxQkEseUJBQUE7RUFDQSxzQkFBQTtFQUNBLDJCQUFBO0VBQ0EsbUJBQUE7O0FVeEdKLFdBNEpJO0VBQ0ksbUJBQUE7RUFDQSxlQUFBO0VBQ0EsZUFBQTtFQUNBLDBCQUFBOztBQWhLUixXQW9LSTtFQUNJLGdCQUFBO0VBQ0Esb0NBQUE7RUFDQSw0QkFBQTs7QUF2S1IsV0F5S0ksVUFBUztFVjFLVCxrQ0FBQTtFQUNBLDBCQUFBOztBVUFKLFdBeUtJLFVBQVMsU0FFTDtFVnBLSixtQlVxS21CLGlCVnJLbkI7RUFDQSxXVW9LbUIsaUJWcEtuQjs7QVVSSixXQStLSSxVQUFTLGNBQ0w7QUFoTFIsV0ErS0ksVUFBUyxjQUNjLHdCQUF3QjtBQWhMbkQsV0ErS0ksVUFBUyxjQUN5Qyx1QkFBdUI7QUFoTDdFLFdBK0tJLFVBQVMsY0FDbUU7RUFDcEUseUJBQUE7RUFDQSxpQkFBQTs7QUFsTFosV0FxTEk7RUFDSSxrQkFBQTtFQUNBLFdBQUE7O0FBdkxSLFdBeUxJO0VBQ0ksOEJBQUE7RUFDQSxzQkFBQTs7QUEzTFIsV0E2TEk7QUE3TEosV0E2TDRCO0VBQ3BCLGtCQUFBO0VBQ0EsTUFBQTtFQUNBLFlBQUE7RVZyS0osb0JBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0VBQ0EsYUFBQTs7QVU5QkosV0E2TEksdUJBS0k7QUFsTVIsV0E2TDRCLHdCQUtwQjtFQUNJLGVBQUE7RUFDQSxXQUFBO0VBQ0EsbUJBQUE7RVYxS1Isb0JBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0VBQ0EsYUFBQTtFQXVFQSx5QkFBQTtFQUNBLHNCQUFBO0VBQ0EsMkJBQUE7RUFDQSxtQkFBQTtFVWdHUSxrQkFBQTtFQUNBLE9BQUE7O0FBQ0EsV0FiUix1QkFLSSxFQVFLO0FBQUQsV0FiZ0Isd0JBS3BCLEVBUUs7RUFDRyxTQUFRLEVBQVI7RUFDQSxrQkFBQTtFQUNBLE1BQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0VBQ0EsV0FBQTs7QUFqTmhCLFdBNkxJLHVCQXVCSSxFQUFDO0FBcE5ULFdBNkw0Qix3QkF1QnBCLEVBQUM7RUFDRyxtQkFBQTs7QUFyTlosV0F3Tkk7RUFDSSxTQUFBO0VWbE5KLG1CVW1OZSxnQlZuTmY7RUFDQSxXVWtOZSxnQlZsTmY7O0FVUkosV0F3Tkksd0JBR0ksRUFBQztFQUNHLFVBQUE7RUFDQSxpQkFBQTs7QUE3TlosV0FnT0k7RUFDSSxRQUFBO0VWMU5KLG1CVTJOZSxpQlYzTmY7RUFDQSxXVTBOZSxpQlYxTmY7O0FVUkosV0FnT0ksdUJBR0ksRUFBQztFQUNHLFdBQUE7RUFDQSxrQkFBQTs7QUFyT1osV0F3T0k7RUFDSSxlQUFBO0VBQ0Esa0JBQUE7RUFDQSxnQkFBQTtFQUNBLG1CQUFBO0VBQ0EsZUFBQTtFQUNBLHVCQUFBOztBQTlPUixXQWdQSTtFQUNJLGVBQUE7RUFDQSxjQUFBO0VBQ0EsaUJBQUE7RUFDQSxrQkFBQTtFQUNBLGdCQUFBO0VBQ0EsZ0JBQUE7RUFDQSx1QkFBQTtFQUNBLHFCQUFBO0VBQ0EsNEJBQUE7RUFDQSxvQkFBQTs7QUFFSixXQUFDLFdBQ0c7QUE3UFIsV0E0UGtCLEdBQUUsV0FDWjtFQUNJLGNBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBO0VWaEpSLDRCQUFBO0VBQ0EsMkJBQUE7RUFDQSxtQkFBQTs7QVUwSUEsV0FBQyxXQU9HLFdBQVc7QUFuUW5CLFdBNFBrQixHQUFFLFdBT1osV0FBVztFQUNQLGdCQUFBO0VBQ0EsbUJBQUE7O0FBVFIsV0FBQyxXQVdHLFdBQVc7QUF2UW5CLFdBNFBrQixHQUFFLFdBV1osV0FBVztFQUNQLG1CQUFBO0VBQ0EsK0JBQUE7RVZ2QlIsc0JBQXNCLDJQQUF0QjtFVXlCUSwwQkFBQTs7QUFmUixXQUFDLFdBaUJHO0FBN1FSLFdBNFBrQixHQUFFLFdBaUJaO0VBQ0ksaUJBQUE7RUFDQSxvQkFBQTtFVi9KUiwrQkFBQTtFQUNBLDhCQUFBO0VBQ0Esc0JBQUE7O0FVMElBLFdBQUMsV0FpQkcsWUFJSTtBQWpSWixXQTRQa0IsR0FBRSxXQWlCWixZQUlJO0VBQ0ksY0FBQTs7QUF0QlosV0FBQyxXQXlCRztBQXJSUixXQTRQa0IsR0FBRSxXQXlCWjtFVjFQSixvQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7RUFDQSxhQUFBO0VBK0NBLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSxzQ0FBQTtFQUNBLDhCQUFBOztBVTRLQSxXQUFDLFdBNkJHLGNBQWM7QUF6UnRCLFdBNFBrQixHQUFFLFdBNkJaLGNBQWM7RUFDVixpQkFBQTtFQUNBLG9CQUFBO0VWM0tSLCtCQUFBO0VBQ0EsOEJBQUE7RUFDQSxzQkFBQTs7QVUrS1EsV0FGUixZQUNJLEdBQ0s7QUFBUSxXQUZqQixZQUNJLEdBQ2M7RUFDTixXQUFBOztBVnBFWixXVWlFQSxZQU1JLGNBQWMsR1Z2RWpCO0VBQ0csYUFBQTs7QVUvTlIsV0F5U0k7QUF6U0osV0F5U21CO0VBQ1gsbUJBQUE7RUFFQSxpQkFBQTtFQUNBLG1CQUFBO0VBQ0Esa0JBQUE7RUFDQSxlQUFBO0VBQ0EsdUJBQUE7RUFDQSxnQkFBQTtFQUNBLDBCQUFBO0VBQ0EsWUFBQTtFQUNBLHNCQUFBO0VBQ0EsaUJBQUE7RUFDQSxlQUFBOztBVnhGSixXVTJFQSxjVjNFQztBQUFELFdVMkVlLGtCVjNFZDtFQUNHLGFBQUE7O0FVL05SLFdBd1RJO0VBQ0ksa0JBQUE7RUFDQSx3QkFBQTtFQUNBLHFCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxRQUFBO0VBQ0EsV0FBQTtFQUNBLGFBQUE7O0FBL1RSLFdBa1VJO0VBQ0ksa0JBQUE7RUFDQSxRQUFBO0VBQ0EsTUFBQTtFQUNBLFdBQUE7RUFDQSxXQUFBO0VBQ0EsNEJBQUE7RUFDQSwwQkFBQTtFQUNBLDJCQUFBO0VBQ0EsV0FBQTtFVnpGSixzQkFBc0IsaVJBQXRCO0VVMkZJLFVBQUE7RUFDQSxrQkFBQTtFQUNBLGVBQUE7RVZoVkosa0NBQUE7RUFDQSwwQkFBQTs7QVVrVkEsV0FBQyxTQUNHO0VWcFZKLGtDQUFBO0VBQ0EsMEJBQUE7O0FVdVZBLFdBQUMsZ0JBQ0c7RUFDSSxtQkFBQTtFQUNBLFVBQUE7O0FBSFIsV0FBQyxnQkFLRztBQUxKLFdBQUMsZ0JBS2dCLFdBQVc7RUFDcEIsbUJBQUE7O0FBTlIsV0FBQyxnQkFRRyxXQUFXO0FBUmYsV0FBQyxnQkFRMkIsV0FBVztFQUMvQixzQkFBQTs7QUFHUixXQUFDLGlCQUNHO0VWcldKLGtDQUFBO0VBQ0EsMEJBQUE7O0FVQUosV0F3V0ksR0FBRTtFQUNFLFdBQUE7RUFDQSxvQ0FBQTtFVnZHQSx3RUFBQTtFQXBRSixnQ0FBQTtFQUNBLHdCQUFBOztBQXdOQSxXVWdKQSxHQUFFLFFBS0UsWVZySkg7RUFDRyxhQUFBOztBQURKLFdVMkpBLEdBQ0ssV0FDRyxhVjdKUDtFQUNHLGFBQUE7O0FBREosV1UySkEsR0FNSyxXQUNHLFlWbEtQO0FBQUQsV1UySkEsR0FNbUIsV0FBWSxHQUFFLFdBQ3pCLFlWbEtQO0VBQ0csYUFBQTs7QUE5Q0osV1V3TUEsR0FXSSxHQUFFLFdBQ0UsWVZwTlA7QUFBRCxXVXdNQSxHQVdvQixXQUFZLEdBQ3hCLFlWcE5QO0VBQ0csU0FBUyxFQUFUO0VBQ0Esa0JBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSxxQ0FBQTtFQUNBLGNBQUE7RUFDQSxXQUFBO0VBM0tKLGtDQUFBO0VBQ0EsMEJBQUE7O0FBNEtJLElBQUksY0FBZSxZVTJMdkIsR0FXSSxHQUFFLFdBQ0UsWVZwTlA7QUFhRyxJQUFJLGNBQWUsWVUyTHZCLEdBV29CLFdBQVksR0FDeEIsWVZwTlA7RUFwS0QsbUJBa0xtQixXQWxMbkI7RUFDQSxXQWlMbUIsV0FqTG5COztBQW1MSSxJQUFJLGNBQWUsWVV3THZCLEdBV0ksR0FBRSxXQUNFLFlWcE5QO0FBZ0JHLElBQUksY0FBZSxZVXdMdkIsR0FXb0IsV0FBWSxHQUN4QixZVnBOUDtFQXBLRCxtQkFxTG1CLFlBckxuQjtFQUNBLFdBb0xtQixZQXBMbkI7O0FBc05BLFdBb0hDLGFBcEhBO0FBQUQsV0FvSGlCLGFBQWMsR0FwSDlCO0FBQUQsV0FvSG9DLGFBQWMscUJBcEhqRDtFQUNHLGFBQUE7O0FBUEosV0EwSEMsYUExSEE7QUFBRCxXQTBIaUIsYUFBYyxHQTFIOUI7QUFBRCxXQTBIb0MsYUFBYyxxQkExSGpEO0VBQ0csYUFBQTs7QUFESixXQWdJQyxxQkFDRyxZQWpJSDtBQUFELFdBZ0lDLHFCQUNnQixhQWpJaEI7QUFBRCxXQWdJQyxxQkFDOEIsY0FqSTlCO0FBQUQsV0FnSUMscUJBQzZDLGtCQWpJN0M7QUFBRCxXQWdJQyxxQkFDZ0Usa0JBakloRTtFQUNHLGFBQUE7OztBV3pOUixXQUNJLE1BQUs7QUFEVCxXQUN3QixNQUFLO0FBRDdCLFdBQ2dELE1BQUs7QUFEckQsV0FDc0UsTUFBSztBQUQzRSxXQUMyRixNQUFLO0FBRGhHLFdBQzhHLE1BQUs7QUFEbkgsV0FDaUksTUFBSztBQUR0SSxXQUNxSixNQUFLO0FBRDFKLFdBQ21MLE1BQUs7QUFEeEwsV0FDdU0sTUFBSztBQUQ1TSxXQUM2TjtBQUQ3TixXQUNxTztFQUM3Tix3QkFBQTtFQUNBLHFCQUFBO0VBQ0Esb0JBQUE7RUFDQSxnQkFBQTtFQUNBLHNCQUFBO0VBQ0EsWUFBQTtFQUNBLGdCQUFBO0VBQ0Esc0JBQUE7RUFDQSxnQkFBQTtFQUNBLGNBQUE7RUFDQSxVQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxvQkFBQTs7QUFDQSxXQWxCSixNQUFLLGFBa0JBO0FBQUQsV0FsQmdCLE1BQUssaUJBa0JwQjtBQUFELFdBbEJ3QyxNQUFLLGVBa0I1QztBQUFELFdBbEI4RCxNQUFLLGNBa0JsRTtBQUFELFdBbEJtRixNQUFLLFlBa0J2RjtBQUFELFdBbEJzRyxNQUFLLFlBa0IxRztBQUFELFdBbEJ5SCxNQUFLLGFBa0I3SDtBQUFELFdBbEI2SSxNQUFLLHVCQWtCako7QUFBRCxXQWxCMkssTUFBSyxhQWtCL0s7QUFBRCxXQWxCK0wsTUFBSyxlQWtCbk07QUFBRCxXQWxCcU4sT0FrQnBOO0FBQUQsV0FsQjZOLFNBa0I1TjtFQUNFLDBCQUFBOztBQXBCWCxXQXVCSTtBQXZCSixXQXVCWTtFQUNKLG1CQUFBO0VBQ0EsMEJBQUE7RVgxQkosa0NBQUE7RUFDQSwwQkFBQTtFVzJCSSxVQUFBO0VYZ0NKLG1CQUFBO0VBQ0Esc0JBQUE7RUFDQSxrQkFBQTtFQUNBLGNBQUE7O0FXOURKLFdBK0JJLE1BQUs7QUEvQlQsV0ErQndCLE1BQUs7RUFDckIsaUJBQUE7O0FBaENSLFdBa0NJO0VBQ0ksd0JBQUE7RUFDQSxxQkFBQTtFQUNBLG9CQUFBO0VBQ0EsZ0JBQUE7O0FBdENSLFdBd0NJO0VBQ0ksWUFBQTtFQUNBLGdCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxtQkFBQTtFQUNBLGFBQUE7O0FBQ0EsV0FOSixTQU1LO0VBQ0csWUFBQTs7QUEvQ1osV0FtREk7RUFDSSxXQUFBO0VBQ0EsV0FBQTtFWE1KLG1CQUFBO0VBQ0Esc0JBQUE7RUFDQSxrQkFBQTtFQUNBLGNBQUE7RVdQSSxZQUFBO0VBQ0Esa0JBQUE7RUFDQSxrQkFBQTtFQUNBLGdCQUFBOztBWDhKSixXVzFKQSxZQUNJLEdYeUpIO0FBQUQsV1cxSmMsWUFDVixHWHlKSDtFQUNHLGFBQUE7O0FXek5SLFdBOERJLFlBSUk7QUFKUyxXQUFDLFlBSVY7RVg4Q0osNkJBQUE7RUFDQSw0QkFBQTtFQUNBLG9CQUFBO0VXOUNRLGdCQUFBO0VBQ0Esa0JBQUE7RUFDQSxVQUFBOztBQXRFWixXQThESSxZQVVJO0FBVlMsV0FBQyxZQVVWO0VBQ0ksY0FBQTtFQUNBLGtCQUFBO0VBQ0EsaUJBQUE7O0FYNklSLFdXMUpBLFlBVUksWVhnSkg7QUFBRCxXVzFKYyxZQVVWLFlYZ0pIO0VBQ0csYUFBQTs7QVd6TlIsV0E4REksWUFnQkk7QUFoQlMsV0FBQyxZQWdCVjtBQTlFUixXQThESSxZQWdCWTtBQWhCQyxXQUFDLFlBZ0JGO0VBQ0osV0FBQTtFQUNBLGVBQUE7O0FBaEZaLFdBOERJLFlBb0JJO0FBcEJTLFdBQUMsWUFvQlY7RVh2RUosOEJBQUE7RUFDQSxzQkFBQTtFQUxBLG1CVzZFbUIsa0JBQWEsZ0JYN0VoQztFQUNBLFdXNEVtQixrQkFBYSxnQlg1RWhDO0VXNkVRLDBCQUFBO0VBQ0EsV0FBQTtFQUNBLGNBQUE7O0FBdkZaLFdBOERJLFlBb0JJLGdCQU1JLGNBQWEsTUFBSztBQTFCYixXQUFDLFlBb0JWLGdCQU1JLGNBQWEsTUFBSztFQUNmLGtCQUFBOztBQXpGZixXQTZGSSxhQUNJO0FBOUZSLFdBNkZrQixpQkFDVjtFQUNJLDBCQUFBO0VYeEZSLG1CV3lGbUIsU0FBUyxhWHpGNUI7RUFDQSxXV3dGbUIsU0FBUyxhWHhGNUI7O0FXUkosV0FtR0ksYUFDSTtBQXBHUixXQW1HSSxhQUNZO0VBQ0osY0FBQTs7QUFJWjtBQUFtQjtFQUNmLGtCQUFBOztBWGlFQSxpQkFBQztBQUFELFlBQUM7RUFDRyxTQUFTLEVBQVQ7RUFDQSxrQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0VBQ0EsV0FBQTtFQUNBLHFDQUFBO0VBQ0EsY0FBQTtFQUNBLFdBQUE7RUEzS0osa0NBQUE7RUFDQSwwQkFBQTs7QUE0S0ksSUFBSSxjQUFlLGtCQWJ0QjtBQWFHLElBQUksY0FBZSxhQWJ0QjtFQXBLRCxtQkFrTG1CLFdBbExuQjtFQUNBLFdBaUxtQixXQWpMbkI7O0FBbUxJLElBQUksY0FBZSxrQkFoQnRCO0FBZ0JHLElBQUksY0FBZSxhQWhCdEI7RUFwS0QsbUJBcUxtQixZQXJMbkI7RUFDQSxXQW9MbUIsWUFwTG5COztBV29HQSxpQkFBQztBQUFELFlBQUM7RVg3R0Qsa0NBQUE7RUFDQSwwQkFBQTs7QVcrR0EsaUJBQUMsWUFBWTtBQUFiLFlBQUMsWUFBWTtBQUFRLGlCQUFDLGdCQUFnQjtBQUFqQixZQUFDLGdCQUFnQjtBQUFRLFlBQWEsa0JBQUM7QUFBZCxZQUFhLGFBQUM7QUFBUSxnQkFBaUIsa0JBQUM7QUFBbEIsZ0JBQWlCLGFBQUM7RUFDbEYsbUJBQUE7RVh6R0osbUJXMEdlLFNYMUdmO0VBQ0EsV1d5R2UsU1h6R2Y7O0FXNEdKLFFBQVE7RUFDSixnQkFBQTs7QUFHSjtFQUNJLHFCQUFBO0VBQ0Esc0JBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLGtCQUFBO0VBQ0EsZUFBQTtFWGRBLDJCQUFBO0VBQ0EsMEJBQUE7RUFDQSxrQkFBQTs7QVdNSixhQVFJO0VBQ0ksV0FBQTtFQUNBLG1CQUFBO0VBQ0Esc0JBQUE7RUFDQSxZQUFBO0VBQ0EsbUJBQUE7RUFDQSxVQUFBO0VBQ0EsU0FBQTtFQUNBLFVBQUE7RUFDQSx3QkFBQTtFQUNBLHFCQUFBO0VBQ0Esb0JBQUE7RUFDQSxnQkFBQTtFQUNBLFlBQUE7RUFDQSxlQUFBO0VBQ0Esa0JBQUE7RVhoSkosa0NBQUE7RUFDQSwwQkFBQTs7QVdpSkksYUFqQkosVUFpQks7RUFDRyxTQUFRLEdBQVI7RUFDQSxZQUFBO0VBQ0EsV0FBQTtFQUNBLG1CQUFBO0VBQ0EsZ0JBQUE7RUFDQSxrQkFBQTtFQUNBLFVBQUE7RUFDQSxTQUFBO0VBQ0EsU0FBQTtFQUNBLHdDQUFBO0VYcEpSLG1CV3FKbUIsZVhySm5CO0VBQ0EsV1dvSm1CLGVYcEpuQjtFQVRBLGtDQUFBO0VBQ0EsMEJBQUE7O0FXd0hKLGFBd0NJLE1BQUs7RUFDRCxhQUFBOztBQUVJLGFBSFIsTUFBSyxpQkFFQSxRQUNJO0VBQ0csbUNBQUE7O0FBQ0EsYUFMWixNQUFLLGlCQUVBLFFBQ0ksWUFFSTtFWDlKYixtQlcrSjJCLGdCWC9KM0I7RUFDQSxXVzhKMkIsZ0JYOUozQjtFVytKZ0IsbUJBQUE7O0FBS2hCLFdBQVk7RUFDUixTQUFBOztBQUtSO0VBQ0ksY0FBQTtFQUNBLHFCQUFBO0VBQ0Esa0JBQUE7RUFDQSxjQUFBO0VBQ0Esa0JBQUE7RUFDQSxpQkFBQTtFQUNBLHNCQUFBO0VBQ0Esd0JBQUE7RUFDQSxxQkFBQTtFQUNBLG9CQUFBO0VBQ0EsZ0JBQUE7RUFDQSxnQkFBQTtFQUNBLGVBQUE7RUFDQSxTQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0VBQ0EsdUJBQUE7RUFDQSxlQUFBO0VBQ0EseUJBQUE7RUFDQSxvQkFBQTtFQUNBLGVBQUE7RUFDQSxlQUFBO0VBQ0EsY0FBQTtFQUNBLGtCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxVQUFBO0VBQ0EsWUFBQTtFWDlNQSxrQ0FBQTtFQUNBLDBCQUFBO0VBZUEsbUJBQW1CLG9CQUFuQjtFQUNBLFdBQVcsb0JBQVg7O0FXZ01BLEtBQUssZUFBZTtBQUFHLEtBQUssZUFBZTtFQUN2QyxXQUFBOztBQUVKLElBQUksSUFBSSxxQkFBc0IsUUFBQztBQUFTLE9BQUM7RUFDckMsOEJBQUE7O0FBRUosT0FBQztFQUNHLHlCQUFBO0VBQ0EsV0FBQTs7QUFDQSxJQUFJLElBQUkscUJBQXNCLFFBSGpDLFlBR2tDO0FBQVMsT0FIM0MsWUFHNEM7RUFDckMsbUJBQUE7O0FBR1IsT0FBQztFQUNHLFlBQUE7RUFDQSxpQkFBQTtFQUNBLGtCQUFBOztBQTlDUixPQWlESSxFQUFDLEtBQU07QUFqRFgsT0FrREksS0FBSSxJQUFJLGNBQWU7QUFsRDNCLE9BbURJLEtBQUksSUFBSSxjQUFlLElBQUc7QUFuRDlCLE9Bb0RJLEVBQUMsS0FBTSxJQUFHO0VBQ04sZ0JBQUE7O0FBSUEsT0FESSxRQUNILElBQUk7QUFBTCxRQURnQixRQUNmLElBQUk7QUFBTCxVQUQ4QixRQUM3QixJQUFJO0FBQUwsY0FEZ0QsUUFDL0MsSUFBSTtFQUNELFdBQUE7O0FBQ0EsSUFBSSxJQUFJLHFCQUFzQixRQUg5QixRQUNILElBQUksY0FFOEI7QUFBL0IsSUFBSSxJQUFJLHFCQUFzQixTQUhsQixRQUNmLElBQUksY0FFOEI7QUFBL0IsSUFBSSxJQUFJLHFCQUFzQixXQUhKLFFBQzdCLElBQUksY0FFOEI7QUFBL0IsSUFBSSxJQUFJLHFCQUFzQixlQUhjLFFBQy9DLElBQUksY0FFOEI7QUFBUyxPQUh4QyxRQUNILElBQUksY0FFd0M7QUFBRCxRQUg1QixRQUNmLElBQUksY0FFd0M7QUFBRCxVQUhkLFFBQzdCLElBQUksY0FFd0M7QUFBRCxjQUhJLFFBQy9DLElBQUksY0FFd0M7RUFDckMscUNBQUE7O0FBS2hCO0VYYVEsd0VBQUE7O0FXWEosSUFBSSxJQUFJLHFCQUFzQixlQUFDO0FBQVMsY0FBQztFWGNyQyx3RUFBQTs7QVdWUjtFWHpJSSwyQkFBQTtFQUNBLDBCQUFBO0VBQ0Esa0JBQUE7RUF2RkEsb0JBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0VBQ0EsYUFBQTtFQVNBLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSx5QkFBQTtFQUNBLG1CQUFBO0VBQ0EscUJBQUE7RUFDQSxpQkFBQTs7QVc2TUosWUFJSTtFQUNJLGlCQUFBO0VBQ0EsV0FBQTtFQUNBLG1CQUFBO0VBQ0EsV0FBQTs7QUFSUixZQVVJLFFBQU87RUFDSCxjQUFBOztBQU1SO0VBQ0ksV0FBQTtFQUNBLGtCQUFBO0VBQ0EsZ0JBQUE7RVg3SkEsMkJBQUE7RUFDQSwwQkFBQTtFQUNBLGtCQUFBOztBV3dKSixhQUtJLE1BQUs7RUFDRCxrQkFBQTtFQUNBLFlBQUE7RUFDQSxXQUFBO0VBQ0EsU0FBQTtFQUNBLHdCQUFBO0VBQ0EscUJBQUE7RUFDQSxvQkFBQTtFQUNBLGdCQUFBO0VBQ0EsWUFBWSwwQ0FBMEMsd0JBQXdCLDBCQUE5RTtFQUNBLFlBQVksa0RBQVo7RUFDQSwyQkFBQTtFQUNBLHlCQUFBO0VBQ0EsNEJBQUE7RUFDQSxVQUFBO0VBQ0EsZ0NBQUE7O0FBQ0EsYUFoQkosTUFBSyxjQWdCQTtBQUFRLGFBaEJiLE1BQUssY0FnQlM7RUFDTixTQUFBO0VBQ0EsZUFBQTs7QUF2QlosYUEyQ0ksTUFBSyxjQUFjO0VBZGYsd0JBQUE7RUFDQSxxQkFBQTtFQUNBLG9CQUFBO0VBQ0EsZ0JBQUE7RUFDQSxZQUFBO0VBQ0EsVUFBQTtFQUNBLFlBQUE7RUFDQSxXQUFBO0VBQ0Esa0JBQUE7RUFDQSxtQkFBQTtFQUNBLG1CQUFBOztBQXZDUixhQStDSSxNQUFLLGNBQWMsc0JBQXNCO0VBQ3JDLGtCQUFBO0VBQ0EsUUFBQTtFQUNBLFdBQUE7RUFDQSxhQUFBO0VBQ0EsV0FBQTtFQUNBLGdCQUFBO0VBQ0EsVUFBQTtFQUNBLG1CQUFBO0VBQ0EsU0FBUyxHQUFUOztBQXhEUixhQTRESSxNQUFLLGNBQWM7RUFDZixXQUFBO0VBQ0EsV0FBQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLFVBQUE7O0FBakVSLGFBbUVJLE1BQUssY0FBYztFQXRDZix3QkFBQTtFQUNBLHFCQUFBO0VBQ0Esb0JBQUE7RUFDQSxnQkFBQTtFQUNBLFlBQUE7RUFDQSxVQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0VBQ0EsbUJBQUE7O0FBdkNSLGFBd0VJLE1BQUssY0FBYztFQUNmLFdBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtFQUNBLHVCQUFBO0VBQ0EseUJBQUE7RUFDQSxrQkFBQTs7QUE5RVIsYUFnRkksTUFBSyxjQUFjO0VBbkRmLHdCQUFBO0VBQ0EscUJBQUE7RUFDQSxvQkFBQTtFQUNBLGdCQUFBO0VBQ0EsWUFBQTtFQUNBLFVBQUE7RUFDQSxZQUFBO0VBQ0EsV0FBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTs7QUF2Q1IsYUFvRkksTUFBSyxjQUFjO0VBQ2YsbUJBQUE7O0FBckZSLGFBdUZJLE1BQUssY0FBYztFQUNmLG1CQUFBOztBQUdKLFdBQVk7RUFDUixRQUFBOztBQUtSLEtBQUs7RUFDRCxlQUFBOztBQURKLEtBQUssZUFFRCxFQUFDO0VBQ0csV0FBQTtFQUNBLFlBQUE7RUFDQSxrQkFBQTtFQUNBLGtCQUFBO0VBQ0EseUJBQUE7RUFDQSxzQkFBQTtFWHBYSixrQ0FBQTtFQUNBLDBCQUFBO0VXcVhJLHVCQUFBOztBQUNBLEtBWEgsZUFFRCxFQUFDLG1CQVNJO0VBQ0csU0FBUSxHQUFSO0VBQ0Esa0JBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFVBQUE7RUFDQSxTQUFBO0VYN1hSLGtDQUFBO0VBQ0EsMEJBQUE7RVc4WFEsVUFBQTtFQUNBLDRCQUFBO0VYN0lSLHNCQUFzQiwrUUFBdEI7RVcrSVEsa0NBQUE7RUFDQSwwQkFBQTs7QUF2QlosS0FBSyxlQTBCRCxNQUFLO0FBMUJULEtBQUssZUEwQnVCLE1BQUs7RUFDekIsYUFBQTs7QUFDQSxLQTVCSCxlQTBCRCxNQUFLLGlCQUVBLFFBQVMsY0FDTixFQUFDO0FBREwsS0E1QkgsZUEwQnVCLE1BQUssY0FFeEIsUUFBUyxjQUNOLEVBQUM7QUFEb0IsS0E1QjVCLGVBMEJELE1BQUssaUJBRXlCLFFBQVMsY0FDL0IsRUFBQztBQURvQixLQTVCNUIsZUEwQnVCLE1BQUssY0FFQyxRQUFTLGNBQy9CLEVBQUM7QUFENkMsS0E1QnJELGVBMEJELE1BQUssaUJBRWtELFFBQVMsY0FDeEQsRUFBQztBQUQ2QyxLQTVCckQsZUEwQnVCLE1BQUssY0FFMEIsUUFBUyxjQUN4RCxFQUFDO0VBQ0cscUJBQUE7RUFDQSx5QkFBQTs7QUFIUixLQTVCSCxlQTBCRCxNQUFLLGlCQUVBLFFBQVMsY0FLTixFQUFDLG1CQUFtQjtBQUx4QixLQTVCSCxlQTBCdUIsTUFBSyxjQUV4QixRQUFTLGNBS04sRUFBQyxtQkFBbUI7QUFMQyxLQTVCNUIsZUEwQkQsTUFBSyxpQkFFeUIsUUFBUyxjQUsvQixFQUFDLG1CQUFtQjtBQUxDLEtBNUI1QixlQTBCdUIsTUFBSyxjQUVDLFFBQVMsY0FLL0IsRUFBQyxtQkFBbUI7QUFMMEIsS0E1QnJELGVBMEJELE1BQUssaUJBRWtELFFBQVMsY0FLeEQsRUFBQyxtQkFBbUI7QUFMMEIsS0E1QnJELGVBMEJ1QixNQUFLLGNBRTBCLFFBQVMsY0FLeEQsRUFBQyxtQkFBbUI7RUFDaEIsVUFBQTs7QUFLaEIsS0FBSztFQUNELGVBQUE7O0FBREosS0FBSyxZQUVELEVBQUM7RUFDRyxXQUFBO0VBQ0EsWUFBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7RUFDQSx5QkFBQTtFQUNBLHNCQUFBO0VYM1pKLGtDQUFBO0VBQ0EsMEJBQUE7O0FXNFpJLEtBVkgsWUFFRCxFQUFDLGdCQVFJO0VBQ0csU0FBUSxHQUFSO0VBQ0Esa0JBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFNBQUE7RUFDQSxRQUFBO0VBQ0EsaUJBQUE7RUFDQSxnQkFBQTtFQUNBLHlCQUFBO0VBQ0EsbUJBQUE7RVgvWlIsbUJXZ2FtQixRWGhhbkI7RUFDQSxXVytabUIsUVgvWm5CO0VBVEEsa0NBQUE7RUFDQSwwQkFBQTs7QVdrWkosS0FBSyxZQXlCRCxNQUFLO0FBekJULEtBQUssWUF5QnVCLE1BQUs7RUFDekIsYUFBQTs7QUFDQSxLQTNCSCxZQXlCRCxNQUFLLGlCQUVBLFFBQVMsY0FDTixFQUFDO0FBREwsS0EzQkgsWUF5QnVCLE1BQUssY0FFeEIsUUFBUyxjQUNOLEVBQUM7QUFEb0IsS0EzQjVCLFlBeUJELE1BQUssaUJBRXlCLFFBQVMsY0FDL0IsRUFBQztBQURvQixLQTNCNUIsWUF5QnVCLE1BQUssY0FFQyxRQUFTLGNBQy9CLEVBQUM7QUFENkMsS0EzQnJELFlBeUJELE1BQUssaUJBRWtELFFBQVMsY0FDeEQsRUFBQztBQUQ2QyxLQTNCckQsWUF5QnVCLE1BQUssY0FFMEIsUUFBUyxjQUN4RCxFQUFDO0VBQ0cscUJBQUE7O0FBRlIsS0EzQkgsWUF5QkQsTUFBSyxpQkFFQSxRQUFTLGNBSU4sRUFBQyxnQkFBZ0I7QUFKckIsS0EzQkgsWUF5QnVCLE1BQUssY0FFeEIsUUFBUyxjQUlOLEVBQUMsZ0JBQWdCO0FBSkksS0EzQjVCLFlBeUJELE1BQUssaUJBRXlCLFFBQVMsY0FJL0IsRUFBQyxnQkFBZ0I7QUFKSSxLQTNCNUIsWUF5QnVCLE1BQUssY0FFQyxRQUFTLGNBSS9CLEVBQUMsZ0JBQWdCO0FBSjZCLEtBM0JyRCxZQXlCRCxNQUFLLGlCQUVrRCxRQUFTLGNBSXhELEVBQUMsZ0JBQWdCO0FBSjZCLEtBM0JyRCxZQXlCdUIsTUFBSyxjQUUwQixRQUFTLGNBSXhELEVBQUMsZ0JBQWdCO0VBQ2IseUJBQUE7RVgzYVosbUJXNGF1QixRWDVhdkI7RUFDQSxXVzJhdUIsUVgzYXZCOztBV2diSixLQUFLO0FBQWlCLEtBQUs7RUFDdkIsa0JBQUE7RUFDQSxnQkFBQTtFQUNBLFVBQUE7RVg1YkEsa0NBQUE7RUFDQSwwQkFBQTs7QVd3YkosS0FBSyxlQUtELFlBQ0ksRUFBQztBQU5hLEtBQUssWUFLdkIsWUFDSSxFQUFDO0FBTlQsS0FBSyxlQUtELFlBQzBCLEVBQUM7QUFOVCxLQUFLLFlBS3ZCLFlBQzBCLEVBQUM7RUFDbkIsZ0JBQUE7RUFDQSxrQkFBQTs7QUFHUixXQUFZLE1BWFgsZUFZRyxZQUNJLEVBQUM7QUFGVCxXQUFZLE1BWFcsWUFZbkIsWUFDSSxFQUFDO0FBRk0sV0FBWSxNQVgxQixlQVlHLFlBQ0ksRUFBQztBQUZNLFdBQVksTUFYSixZQVluQixZQUNJLEVBQUM7QUFGVCxXQUFZLE1BWFgsZUFZRyxZQUMwQixFQUFDO0FBRi9CLFdBQVksTUFYVyxZQVluQixZQUMwQixFQUFDO0FBRmhCLFdBQVksTUFYMUIsZUFZRyxZQUMwQixFQUFDO0FBRmhCLFdBQVksTUFYSixZQVluQixZQUMwQixFQUFDO0VBQ25CLGVBQUE7O0FBSVosSUFBSSxJQUFJLHFCQUFzQixNQWxCN0IsZUFrQjhCO0FBQS9CLElBQUksSUFBSSxxQkFBc0IsTUFsQlAsWUFrQlE7QUFBUyxLQWxCdkMsZUFrQndDO0FBQUQsS0FsQmpCLFlBa0JrQjtFQUNyQyxvQ0FBQTs7QVh2T0osSVdzT0ksSUFBSSxxQkFBc0IsTUFsQjdCLGVBa0I4QixPQUUzQixZWHhPSDtBQUFELElXc09JLElBQUkscUJBQXNCLE1BbEJQLFlBa0JRLE9BRTNCLFlYeE9IO0FBQUQsS1dvTkMsZUFrQndDLGFBRXJDLFlYeE9IO0FBQUQsS1dvTnVCLFlBa0JrQixhQUVyQyxZWHhPSDtFQUNHLDZCQUFBOztBVzhPUixhQUNJO0VBQ0ksYUFBQTs7O0FDdGRSO0VBQ0ksa0JBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0Esa0JBQUE7RUFDQSxhQUFBO0VaZ1FJLDBFQUFBO0VZOVBKLHlCQUFBO0VBQ0EsV0FBQTtFQUNBLGdCQUFBO0VaWEEsa0NBQUE7RUFDQSwwQkFBQTtFQTJCQSxvQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7RUFDQSxhQUFBO0VBdUVBLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSwyQkFBQTtFQUNBLG1CQUFBO0VBckJBLHdCQUFBO0VBQ0EscUJBQUE7RUFDQSwrQkFBQTtFQUNBLHVCQUFBOztBWXZFQSxJQUFJLElBQUkscUJBQXNCLGlCQUFDO0FBQVMsZ0JBQUM7RUFDckMsbUJBQUE7O0FBR1I7QUFBMEI7RUFDdEIsa0JBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7O0FBSkosd0JBS0k7QUFMc0IsV0FLdEI7RUFDSSxRQUFBO0VBQ0EsU0FBQTtFQUNBLGtCQUFBOztBQUlSLFdBQ0ksaUJBQ0k7RUFDSSxrQkFBQTtFQUNBLFNBQUE7RUFDQSxRQUFBO0VaN0JSLG1CWThCbUIsMkJBQTJCLGFBQWEsUVo5QjNEO0VBQ0EsV1k2Qm1CLDJCQUEyQixhQUFhLFFaN0IzRDtFQVRBLGtDQUFBO0VBQ0EsMEJBQUE7O0FZK0JKLFdBQ0ksaUJBUUksRUFBRTtFWmpDTixtQllrQ21CLDJCQUEyQixlQUFlLFVabEM3RDtFQUNBLFdZaUNtQiwyQkFBMkIsZUFBZSxVWmpDN0Q7RVlrQ1EsVUFBQTs7QUFHUixXQUFDLGtCQUNHLGlCQUNJO0VaeENSLG1CWXlDdUIsMkJBQTJCLGNBQWMsVVp6Q2hFO0VBQ0EsV1l3Q3VCLDJCQUEyQixjQUFjLFVaeENoRTtFWXlDWSxVQUFBOztBQUpaLFdBQUMsa0JBQ0csaUJBS0ksRUFBRTtFWjVDVixtQlk2Q3VCLDJCQUEyQixhQUFhLFFaN0MvRDtFQUNBLFdZNEN1QiwyQkFBMkIsYUFBYSxRWjVDL0Q7RVk2Q1ksVUFBQTs7QUFLaEI7RUFDSSxrQkFBQTtFQUNBLFdBQUE7RUFDQSxTQUFBO0VBQ0Esa0JBQUE7RUFDQSxZQUFBO0VBQ0EsbUJBQUE7RVpyQ0Esb0JBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0VBQ0EsYUFBQTtFWW9DQSw0QkFBQTtFQUNBLDhCQUFBO0VBQ0EseUJBQUE7RUFDQSwyQkFBQTtFQUNBLGtDQUFBO0VBQ0Esc0NBQUE7RUFDQSw4QkFBQTtFQUNBLGtCQUFBO0VBQ0Esb0JBQUE7O0FBaEJKLG1CQWlCSTtFQUNJLFdBQUE7RUFDQSxZQUFBO0VBQ0EsVUFBQTtFQUNBLFdBQUE7RUFDQSxrQkFBQTtFQUNBLGtCQUFBO0VBQ0EsVUFBQTtFQUNBLGdCQUFBO0VBQ0EseUJBQUE7RVpyRkosa0NBQUE7RUFDQSwwQkFBQTtFQTJCQSxvQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7RUFDQSxhQUFBO0VBdUVBLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSwyQkFBQTtFQUNBLG1CQUFBO0VBckJBLHdCQUFBO0VBQ0EscUJBQUE7RUFDQSwrQkFBQTtFQUNBLHVCQUFBO0VBL0VBLG1CWXFGZSx1QkFBdUIsVVpyRnRDO0VBQ0EsV1lvRmUsdUJBQXVCLFVacEZ0QztFQUdBLHVDQUFBO0VBQ0EsK0JBQUE7O0FZeUVJLElBQUksSUFBSSxxQkFBc0Isb0JBVmxDLEVBVW1DO0FBQVMsbUJBVjVDLEVBVTZDO0VBQ3JDLG1CQUFBOztBQTVCWixtQkFpQkksRUFtQkk7RUFDSSxtQkFBQTs7QUFHUixrQkFBbUI7RUFDZixtQkFBQTtFQUNBLG9CQUFBOztBQUZKLGtCQUFtQixvQkFHZjtFQUNJLFVBQUE7RVovRlIsbUJZZ0dtQixxQkFBcUIsU1poR3hDO0VBQ0EsV1krRm1CLHFCQUFxQixTWi9GeEM7RUE4UEksMEVBQUE7O0FZN0pJLGtCQVBXLG9CQUdmLEVBSUssVUFBVTtFWnRHbkIsOEJBQUE7RUFDQSxzQkFBQTs7QVl3R1Esa0JBVlcsb0JBR2YsRUFPSyxVQUFVO0VaekduQiwrQkFBQTtFQUNBLHVCQUFBOztBWTJHUSxrQkFiVyxvQkFHZixFQVVLLFVBQVU7RVo1R25CLCtCQUFBO0VBQ0EsdUJBQUE7O0FZOEdRLGtCQWhCVyxvQkFHZixFQWFLLFVBQVU7RVovR25CLCtCQUFBO0VBQ0EsdUJBQUE7O0FZaUhRLGtCQW5CVyxvQkFHZixFQWdCSyxVQUFVO0VabEhuQiwrQkFBQTtFQUNBLHVCQUFBOztBWTBIQSwyQkFBQztFWi9IRCxrQ0FBQTtFQUNBLDBCQUFBOztBWWlJQSwyQkFBQztFWmxJRCxrQ0FBQTtFQUNBLDBCQUFBOztBWWlJQSwyQkFBQyw4QkFFRztFQUNJLFVBQUE7RVpySVIsa0NBQUE7RUFDQSwwQkFBQTs7QVl3SUEsMkJBQUM7RUFDRyxnQkFBQTtFWjFJSixrQ0FBQTtFQUNBLDBCQUFBO0VZMklJLGdCQUFBOztBQUVKLDJCQUFDO0VaMUlELDZCQUFBO0VBQ0EscUJBQUE7RUFMQSxrQ0FBQTtFQUNBLDBCQUFBOztBWTZJQSwyQkFBQywrQkFHRztFQUNJLFVBQUE7RVpsSlIsa0NBQUE7RUFDQSwwQkFBQTtFQUdBLCtCQUFBO0VBQ0EsdUJBQUE7OztBYUVKO0FBQWdCO0FBQThCO0FBQWdCO0VBQzFELGtCQUFBO0VBQ0EsT0FBQTtFQUNBLE1BQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLDhCQUFBO0VBQ0EsY0FBQTtFQUNBLGtCQUFBO0VBQ0EsVUFBQTtFYmhCQSxrQ0FBQTtFQUNBLDBCQUFBOztBYWlCQSxjQUFDO0FBQUQsNEJBQUM7QUFBRCxjQUFDO0FBQUQscUJBQUM7RUFDRyxtQkFBQTtFQUNBLFVBQUE7O0FBR1I7RUFDSSxjQUFBOztBQUVKO0VBQ0ksY0FBQTs7QUFFSjtFQUNJLFlBQUE7RUFDQSxrQkFBQTtFQUNBLGNBQUE7RUFDQSxTQUFBO0VBQ0EsbUJBQUE7RUFDQSxhQUFBO0VBQ0EsUUFBQTtFQUNBLGtCQUFBO0VBQ0EsVUFBQTtFYjlCQSxtQmErQlcscUJBQW1CLFliL0I5QjtFQUNBLFdhOEJXLHFCQUFtQixZYjlCOUI7RWErQkEsdURBQUE7RUFDQSxpREFBQTtFQUNBLCtDQUFBO0VBQ0EsNkNBQUE7RUFDQSx1Q0FBQTtFQUNBLGNBQUE7RUFDQSxhQUFBO0VBQ0EsZ0JBQUE7RUFDQSxlQUFBO0ViNk5JLDJFQUFBOztBYTNOSixNQUFDO0VBQ0csVUFBQTtFYm5ESixrQ0FBQTtFQUNBLDBCQUFBO0VBT0EsbUJhNkNlLHFCQUFtQixRYjdDbEM7RUFDQSxXYTRDZSxxQkFBbUIsUWI1Q2xDOztBYThDQSxNQUFDO0VBQ0csVUFBQTtFQUNBLGNBQUE7RWJ6REosa0NBQUE7RUFDQSwwQkFBQTtFQU9BLG1CYW1EZSxxQkFBbUIsWWJuRGxDO0VBQ0EsV2FrRGUscUJBQW1CLFlibERsQzs7QWFxREo7RUFDSSx1QkFBQTtFQUNBLGtCQUFBOztBQUVKO0VBQ0ksZ0JBQUE7RUFDQSxlQUFBO0VBQ0EsY0FBQTtFQUNBLGdCQUFBOztBQUpKLFlBS0k7RUFDSSxnQkFBQTs7QUFHUjtFQUNJLGdCQUFBOztBQUVKO0VBQ0ksWUFBQTtFQUNBLGdCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxzQkFBQTtFYnREQSxvQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7RUFDQSxhQUFBO0VBeUNBLHFCQUFBO0VBQ0Esa0JBQUE7RUFDQSxpQ0FBQTtFQUNBLHlCQUFBOztBYVVBLGNBQUM7RUFDRyxjQUFBO0VBQ0EsWUFBQTtFQUNBLGtCQUFBOztBQUhKLGNBQUMsdUJBSUc7RUFDSSxjQUFBO0VBQ0EsaUJBQUE7RUFDQSxZQUFBO0VBQ0EsaUJBQUE7RUFDQSxnQkFBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7O0FBSVo7QUFBZSxjQUFlO0VGZ0YxQixjQUFBO0VBQ0EscUJBQUE7RUFDQSxrQkFBQTtFQUNBLGNBQUE7RUFDQSxrQkFBQTtFQUNBLGlCQUFBO0VBQ0Esc0JBQUE7RUFDQSx3QkFBQTtFQUNBLHFCQUFBO0VBQ0Esb0JBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBO0VBQ0EsZUFBQTtFQUNBLFNBQUE7RUFDQSxZQUFBO0VBQ0EsbUJBQUE7RUFDQSx1QkFBQTtFQUNBLGVBQUE7RUFDQSx5QkFBQTtFQUNBLG9CQUFBO0VBQ0EsZUFBQTtFQUNBLGVBQUE7RUFDQSxjQUFBO0VBQ0Esa0JBQUE7RUFDQSxnQkFBQTtFQUNBLFVBQUE7RUFDQSxZQUFBO0VYOU1BLGtDQUFBO0VBQ0EsMEJBQUE7RUFlQSxtQkFBbUIsb0JBQW5CO0VBQ0EsV0FBVyxvQkFBWDtFY2ZBLHlCQUFBO0VBQ0EsaUJBQUE7O0FIOE1BLEtBQUssZUFBZTtBQUFwQixLQUFLLGVBQWUsY0U3R007QUY2R0gsS0FBSyxlQUFlO0FBQXBCLEtBQUssZUFBZSxjRTdHakI7RUY4R3RCLFdBQUE7O0FBRUosSUFBSSxJQUFJLHFCQUFzQixjQUFDO0FBQS9CLElBQUksSUFBSSxxQkFBc0IsZUVoSEosUUZnSEs7QUFBUyxhQUFDO0FBQUQsY0VoSGQsUUZnSGU7RUFDckMsOEJBQUE7O0FBRUosYUFBQztBQUFELGNFbkgwQixRRm1IekI7RUFDRyx5QkFBQTtFQUNBLFdBQUE7O0FBQ0EsSUFBSSxJQUFJLHFCQUFzQixjQUhqQyxZQUdrQztBQUEvQixJQUFJLElBQUkscUJBQXNCLGVFdEhSLFFGbUh6QixZQUdrQztBQUFTLGFBSDNDLFlBRzRDO0FBQUQsY0V0SGxCLFFGbUh6QixZQUc0QztFQUNyQyxtQkFBQTs7QUFHUixhQUFDO0FBQUQsY0UxSDBCLFFGMEh6QjtFQUNHLFlBQUE7RUFDQSxpQkFBQTtFQUNBLGtCQUFBOztBRTdIUixhRmdJSSxFQUFDLEtBQU07QUVoSUksY0FBZSxRRmdJMUIsRUFBQyxLQUFNO0FFaElYLGFGaUlJLEtBQUksSUFBSSxjQUFlO0FFaklaLGNBQWUsUUZpSTFCLEtBQUksSUFBSSxjQUFlO0FFakkzQixhRmtJSSxLQUFJLElBQUksY0FBZSxJQUFHO0FFbElmLGNBQWUsUUZrSTFCLEtBQUksSUFBSSxjQUFlLElBQUc7QUVsSTlCLGFGbUlJLEVBQUMsS0FBTSxJQUFHO0FFbklDLGNBQWUsUUZtSTFCLEVBQUMsS0FBTSxJQUFHO0VBQ04sZ0JBQUE7O0FBSUEsT0FESSxjQUNILElBQUk7QUFBTCxPQURJLGVFdklrQixRRndJckIsSUFBSTtBQUFMLFFBRGdCLGNBQ2YsSUFBSTtBQUFMLFFBRGdCLGVFdklNLFFGd0lyQixJQUFJO0FBQUwsVUFEOEIsY0FDN0IsSUFBSTtBQUFMLFVBRDhCLGVFdklSLFFGd0lyQixJQUFJO0FBQUwsY0FEZ0QsY0FDL0MsSUFBSTtBQUFMLGNBRGdELGVFdkkxQixRRndJckIsSUFBSTtFQUNELFdBQUE7O0FBQ0EsSUFBSSxJQUFJLHFCQUFzQixRQUg5QixjQUNILElBQUksY0FFOEI7QUFBL0IsSUFBSSxJQUFJLHFCQUFzQixRQUg5QixlRXZJa0IsUUZ3SXJCLElBQUksY0FFOEI7QUFBL0IsSUFBSSxJQUFJLHFCQUFzQixTQUhsQixjQUNmLElBQUksY0FFOEI7QUFBL0IsSUFBSSxJQUFJLHFCQUFzQixTQUhsQixlRXZJTSxRRndJckIsSUFBSSxjQUU4QjtBQUEvQixJQUFJLElBQUkscUJBQXNCLFdBSEosY0FDN0IsSUFBSSxjQUU4QjtBQUEvQixJQUFJLElBQUkscUJBQXNCLFdBSEosZUV2SVIsUUZ3SXJCLElBQUksY0FFOEI7QUFBL0IsSUFBSSxJQUFJLHFCQUFzQixlQUhjLGNBQy9DLElBQUksY0FFOEI7QUFBL0IsSUFBSSxJQUFJLHFCQUFzQixlQUhjLGVFdkkxQixRRndJckIsSUFBSSxjQUU4QjtBQUFTLE9BSHhDLGNBQ0gsSUFBSSxjQUV3QztBQUFELE9BSHhDLGVFdklrQixRRndJckIsSUFBSSxjQUV3QztBQUFELFFBSDVCLGNBQ2YsSUFBSSxjQUV3QztBQUFELFFBSDVCLGVFdklNLFFGd0lyQixJQUFJLGNBRXdDO0FBQUQsVUFIZCxjQUM3QixJQUFJLGNBRXdDO0FBQUQsVUFIZCxlRXZJUixRRndJckIsSUFBSSxjQUV3QztBQUFELGNBSEksY0FDL0MsSUFBSSxjQUV3QztBQUFELGNBSEksZUV2STFCLFFGd0lyQixJQUFJLGNBRXdDO0VBQ3JDLHFDQUFBOztBSTdPZCxhQUFDLE9BQ0MsRUFBQztBQURILGNGa0c0QixRRWxHM0IsT0FDQyxFQUFDO0VBQ0Msc0JBQUE7O0FGa0dGLGFBQUM7QUFBRCxjQUYwQixRQUV6QjtFQUNHLGdCQUFBOztBQUhSLGFBS0k7QUFMVyxjQUFlLFFBSzFCO0VBQ0ksZ0JBQUE7O0FBR1IsaUJBQ0k7RUFDSSxhQUFBOztBQUlSO0VBQ0ksa0JBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLGNBQUE7RUFDQSxXQUFBO0VBQ0EsZ0JBQUE7RWJqSEEsbUJha0hXLHVCYmxIWDtFQUNBLFdhaUhXLHVCYmpIWDtFYWtIQSxnQkFBQTtFYm5HQSxjQUFBO0VBQ0EsaUNBQUE7O0Fhb0dBLGNBQUM7RWI3SEQsa0NBQUE7RUFDQSwwQkFBQTtFQU9BLG1CYXVIZSxvQmJ2SGY7RUFDQSxXYXNIZSxvQmJ0SGY7O0Fhd0hBLGNBQUM7RUFDRyxjQUFBO0VibElKLGtDQUFBO0VBQ0EsMEJBQUE7RUFPQSxtQmE0SGUsdUJiNUhmO0VBQ0EsV2EySGUsdUJiM0hmOztBYThISjtFQUNJLGtCQUFBOztBYm9DQSxvQkFBQztFQUNHLFNBQVMsRUFBVDtFQUNBLGtCQUFBO0VBQ0EsT0FBQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxXQUFBO0VBQ0EseUJBQUE7RUFDQSxjQUFBO0VBQ0EsV0FBQTtFQTNLSixrQ0FBQTtFQUNBLDBCQUFBOztBQTRLSSxJQUFJLGNBQWUscUJBYnRCO0VBcEtELG1CQWtMbUIsV0FsTG5CO0VBQ0EsV0FpTG1CLFdBakxuQjs7QUFtTEksSUFBSSxjQUFlLHFCQWhCdEI7RUFwS0QsbUJBcUxtQixZQXJMbkI7RUFDQSxXQW9MbUIsWUFwTG5COztBQWdOQSxvQmEvRUMsV2IrRUE7RUFDRyxhQUFBOztBYTVFUjtBQUF1QjtFQUNuQixXQUFBO0VBQ0EsbUJBQUE7RUFDQSxTQUFBO0VBQ0Esc0JBQUE7RUFDQSxjQUFBO0VBQ0Esa0JBQUE7RUFDQSxlQUFBOztBQVBKLHFCQVFJO0FBUm1CLG9CQVFuQjtFQUNJLHFCQUFBO0VBQ0EsY0FBQTtFQUNBLGNBQUE7O0FBWFIscUJBYUk7QUFibUIsb0JBYW5CO0VBQ0ksZ0JBQUE7O0FBRUoscUJBQUM7QUFBRCxvQkFBQztFQUNHLGdCQUFBOztBQUVKLHFCQUFDO0FBQUQsb0JBQUM7RUFDRyxjQUFBOztBQUVKLHFCQUFDO0FBQUQsb0JBQUM7RUFDRyxhQUFBO0VBQ0EsY0FBQTs7QUFHUjtFQUNJLGVBQUE7RUFDQSxpQkFBQTtFQUNBLGVBQUE7RUFDQSwwQkFBQTtFYjdLQSxrQ0FBQTtFQUNBLDBCQUFBOztBYXdLSixxQkFNSTtBQUFHO0VBQ0Msa0JBQUE7RUFDQSxnQkFBQTtFQUNBLG1CQUFBO0VBQ0EsdUJBQUE7O0FBRUosSUFBSSxJQUFJLHFCQUFzQixzQkFBQztBQUFTLHFCQUFDO0VBQ3JDLDhCQUFBOztBQUdSO0VBQ0ksZUFBQTtFQUNBLDBCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxnQkFBQTtFQUNBLGlCQUFBO0VBQ0Esb0JBQUE7RWJuS0Esb0JBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0VBQ0EsYUFBQTtFQW1DQSx1QkFBQTtFQUNBLG9CQUFBO0VBQ0EsbUNBQUE7RUFDQSwyQkFBQTtFQWlDQSx5QkFBQTtFQUNBLHNCQUFBO0VBQ0EsMkJBQUE7RUFDQSxtQkFBQTs7QWE0RkosS0FBSztFQUNELHNCQUFBO0VBQ0EsWUFBQTtFQUNBLGdCQUFBO0VBQ0EsU0FBQTtFQUNBLGdCQUFBO0VBQ0EsVUFBQTtFQUNBLFlBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtFQUNBLG9CQUFBO0VBQ0EsY0FBQTtFQUNBLGdCQUFBO0VBQ0Esd0JBQUE7RUFDQSxxQkFBQTtFQUNBLG9CQUFBO0VBQ0EsZ0JBQUE7RWJyTkEsa0NBQUE7RUFDQSwwQkFBQTs7QWFzTkEsS0FsQkMsaUJBa0JBO0VBQ0UsMEJBQUE7O0FBbkJQLEtBQUssaUJBcUJELFFBQU87RUFDSCxnQkFBQTs7QUFJUjtFQUNJLFlBQUE7RUFDQSxnQkFBQTtFQUNBLGNBQUE7RUFDQSxTQUFBO0VBQ0EsTUFBQTtFQUNBLFVBQUE7RUFDQSxPQUFBO0VBQ0Esa0JBQUE7RUFDQSxrQkFBQTtFQUNBLGFBQUE7RWIyQkksd0VBQUE7RUE1UEosbUJhbU9XLGdCYm5PWDtFQUNBLFdha09XLGdCYmxPWDtFYW1PQSxzRUFBQTtFQUNBLGdFQUFBO0VBQ0Esc0RBQUE7O0FBQ0EsUUFBQztFYm5PRCx1Q0FBQTtFQUNBLCtCQUFBOztBYXFPQSxRQUFDO0VidE9ELG9DQUFBO0VBQ0EsNEJBQUE7O0Fhd09BLFFBQUM7RWI3T0QsbUJhOE9lLFFiOU9mO0VBQ0EsV2E2T2UsUWI3T2Y7RUFUQSxrQ0FBQTtFQUNBLDBCQUFBO0VhdVBJLFVBQUE7O0FBRUosUUFBQztFYmxQRCxtQmFtUGUsUWJuUGY7RUFDQSxXYWtQZSxRYmxQZjtFQVRBLGtDQUFBO0VBQ0EsMEJBQUE7RWE0UEksVUFBQTs7QUE5QlIsUUFnQ0k7RUFDSSxTQUFBOztBYmpDSixRYWdDQSxZQUVLLFlBQVksV0FBWSxHYmxDNUI7RUFDRyxhQUFBOztBQVBKLFFhc0NBLFlBRUssWUFBWSxXQUFZLEdieEM1QjtFQUNHLGFBQUE7O0FhS1IsUUFnQ0ksWUFNSTtFQUNJLGdCQUFBOztBYnZDUixRYWdDQSxZQU1JLEdidENIO0VBQ0csYUFBQTs7QWF5Q0EsUUFWSixZQVVLLFlBQ0c7RUFDSSwwQkFBQTs7QUFGUixRQVZKLFlBVUssWUFJRyxHQUFFLFlBQWE7RUFDWCwwQkFBQTs7QUFHUixRQWxCSixZQWtCSyxXQUNHO0VBRUksMEJBQUE7O0FiM0RaLFFhc0NBLFlBa0JLLFdBQ0csR2J6RFA7RUFDRyxhQUFBOztBYXVEQSxRQWxCSixZQWtCSyxXQUtHLEdBQUUsV0FBWTtFQUNWLDBCQUFBOztBQUdSLFFBM0JKLFlBMkJLLFlBQVksV0FDVCxHQUFFLFlBQVksV0FBWTtBQUQ5QixRQTNCSixZQTJCSyxZQUFZLFdBQ29CLEdBQUUsWUFBWTtFQUN2QyxrQkFBQTs7QUFJWixRQUFDO0VicFJELHVDQUFBO0VBQ0EsK0JBQUE7RUFMQSxtQmEwUmUsVWIxUmY7RUFDQSxXYXlSZSxVYnpSZjtFYTBSSSxrQkFBQTtFQUNBLGdCQUFBO0ViN0JBLDBFQUFBOztBYStCQSxRQU5ILHdCQU1JO0VBQ0csaUJBQUE7RWIvUlIsbUJhZ1NtQixRYmhTbkI7RUFDQSxXYStSbUIsUWIvUm5CO0VBTEEsK0JBQUE7RUFDQSx1QkFBQTtFQUxBLGtDQUFBO0VBQ0EsMEJBQUE7O0FhMlNJLFFBWkgsd0JBWUk7RUFDRyxrQkFBQTtFYnJTUixtQmFzU21CLFVidFNuQjtFQUNBLFdhcVNtQixVYnJTbkI7RUFMQSw2QkFBQTtFQUNBLHFCQUFBO0VBTEEsa0NBQUE7RUFDQSwwQkFBQTs7QWErUkEsUUFBQyx3QkFrQkc7RUFDSSxTQUFBOztBQUNBLFFBcEJQLHdCQWtCRyxZQUVLLFlBQ0c7RUFDSSxnQkFBQTs7QUFGUixRQXBCUCx3QkFrQkcsWUFFSyxZQUlHLEdBQUUsWUFBYTtFQUNYLGdCQUFBOztBQUdSLFFBNUJQLHdCQWtCRyxZQVVLLFdBQ0c7RUFDSSxnQkFBQTs7QUFGUixRQTVCUCx3QkFrQkcsWUFVSyxXQUlHLEdBQUUsV0FBWTtFQUNWLGdCQUFBOztBQUdSLFFBcENQLHdCQWtCRyxZQWtCSyxZQUFZLFdBQ1QsR0FBRSxZQUFZLFdBQVk7QUFEOUIsUUFwQ1Asd0JBa0JHLFlBa0JLLFlBQVksV0FDb0IsR0FBRSxZQUFZO0VBQ3ZDLGdCQUFBOztBQU1wQjtFYnBUSSxjQUFBO0VBQ0EsaUNBQUE7O0Fhc1RKLGdCQUNJO0VBQ0ksU0FBQTs7QUFHUjtFQUNJLGlCQUFBO0VBQ0EsMEJBQUE7RUFDQSxlQUFBO0VBQ0EsZ0JBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBO0VBQ0Esa0JBQUE7O0FiL0tBLHNCQUFDO0VBQ0csU0FBUyxFQUFUO0VBQ0Esa0JBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSx5QkFBQTtFQUNBLGNBQUE7RUFDQSxXQUFBO0VBM0tKLGtDQUFBO0VBQ0EsMEJBQUE7O0FBNEtJLElBQUksY0FBZSx1QkFidEI7RUFwS0QsbUJBa0xtQixXQWxMbkI7RUFDQSxXQWlMbUIsV0FqTG5COztBQW1MSSxJQUFJLGNBQWUsdUJBaEJ0QjtFQXBLRCxtQkFxTG1CLFlBckxuQjtFQUNBLFdBb0xtQixZQXBMbkI7O0FBZ05BLHNCYW9JQyxXYnBJQTtFQUNHLGFBQUE7O0Fhd0lSO0FBQVE7RUFDSixrQkFBQTtFQUNBLE9BQUE7RUFDQSxNQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxjQUFBO0VBQ0EsZ0JBQUE7RUFDQSxzQkFBQTtFQUNBLGFBQUE7RWJuVkEsY0FBQTtFQUNBLGlDQUFBO0Vhb1ZBLDhDQUFBO0VBQ0Esd0NBQUE7RUFDQSxzQ0FBQTtFQUNBLG9DQUFBO0VBQ0EsOEJBQUE7RWJqV0EsbUJBQW1CLHVCQUFuQjtFQUNBLFdBQVcsdUJBQVg7O0Fha1dBLE1BQUM7QUFBRCxhQUFDO0FBQVcsTUFBQztBQUFELGFBQUM7RWJuWGIsa0NBQUE7RUFDQSwwQkFBQTs7QWFxWEEsTUFBQztBQUFELGFBQUM7RWJ0V0QsbUJBQW1CLG9CQUFuQjtFQUNBLFdBQVcsb0JBQVg7O0Fhd1dBLE1BQUM7QUFBRCxhQUFDO0VieldELG1CQUFtQix1QkFBbkI7RUFDQSxXQUFXLHVCQUFYOztBYTRXSixhQUFhO0FBQVcsYUFBYTtFQUNqQyxjQUFBOztBQUdKLGdCQUFpQyx1QkFBdUI7RUFDcEQsTUFBTSxJQUFJO0lBQ04sWUFBQTtJQUNBLGFBQUE7SUFDQSxTQUFBO0lBQ0EsUUFBQTtJQUNBLG1CQUFBO0lBQ0Esa0JBQUE7SUFDQSw0Q0FBQTtJQUNBLGtCQUFBO0liMVhKLG1CQUFtQix5QkFBbkI7SUFDQSxXQUFXLHlCQUFYOztFYTJYSSxNQVZFLElBQUksb0JBVUw7SWI1WEwsbUJBQW1CLG9CQUFuQjtJQUNBLFdBQVcsb0JBQVg7O0VhOFhJLE1BYkUsSUFBSSxvQkFhTDtJYi9YTCxtQkFBbUIseUJBQW5CO0lBQ0EsV0FBVyx5QkFBWDs7O0FhcVlBLGdCQUFnQyxvQkFBcUI7RUFnSnhELElBbEpHLHVCQUdJO0lBQ0ksaUNBQUE7SUFDQSx5QkFBQTtJQUNBLFNBQUE7O0VBNElYLElBbEpHLHVCQVFJO0lBQ0ksYUFBQTs7O0FBVFosSUFBSSx1QkFZQTtBQVpKLElBQUksdUJBWWUsT0FBTTtFQUNqQixpQ0FBQTtFQUNBLHlCQUFBO0VBQ0EsU0FBQTs7QUFLUixnQkFDSTtBQURKLGdCQUNrQjtFQUNWLGtCQUFBOztBQUdSO0VBQ0ksbUJBQUE7RUFDQSxVQUFBO0VBQ0EsZ0JBQUE7O0FBRUo7RUFDSSxrQkFBQTtFQUNBLFNBQUE7RUFDQSxRQUFBO0VBQ0EsWUFBQTtFQUNBLGtCQUFBO0VBQ0EsaUJBQUE7RUFDQSw4QkFBQTtFQUNBLGNBQUE7RUFDQSxrQkFBQTs7QUFUSiwwQkFVSTtFQUNJLGNBQUE7O0FBS1I7RUFDSSxrQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLGFBQUE7RUFDQSxjQUFBO0VBQ0EsYUFBQTtFQUNBLDhDQUFBO0VBQ0Esd0NBQUE7RUFDQSxzQ0FBQTtFQUNBLG9DQUFBO0VBQ0EsOEJBQUE7RUFDQSxnQkFBQTtFYi9iQSxtQkFBbUIsdUJBQW5CO0VBQ0EsV0FBVyx1QkFBWDs7QWFnY0EsYUFBQztBQUFXLGFBQUM7RWJqZGIsa0NBQUE7RUFDQSwwQkFBQTs7QWFtZEEsYUFBQztFYnBjRCxtQkFBbUIsb0JBQW5CO0VBQ0EsV0FBVyxvQkFBWDs7QWFzY0EsYUFBQztFYnZjRCxtQkFBbUIsdUJBQW5CO0VBQ0EsV0FBVyx1QkFBWDs7QWFpYkosYUF3Qkk7RUFDSSxZQUFBO0VBQ0Esa0JBQUE7O0FBMUJSLGFBNEJJO0VBQ0ksa0JBQUE7RUFDQSxXQUFBO0VBQ0EsTUFBQTs7QUEvQlIsYUE0QkksU0FJSTtFQUNJLGlDQUFBO0VBQ0EsOEJBQUE7RUFDQSx5QkFBQTs7QUFuQ1osYUE0QkksU0FTSSxFQUFDO0ViM2FMLG1CQUFBO0VBQ0Esc0JBQUE7RUFDQSxrQkFBQTtFQUNBLGNBQUE7O0FhbVlKLGFBeUNJO0FBekNKLGFBeUNvQjtFQUNaLFlBQUE7O0FBMUNSLGFBNENJO0VBQ0ksbUJBQUE7O0FBN0NSLGFBNENJLGVBRUksV0FBVztFQUNQLGlCQUFBOztBQS9DWixhQTRDSSxlQUtJLGlCQUFpQixXQUFXO0VBQ3hCLHFDQUFBO0VBQ0Esa0NBQUE7RUFDQSw2QkFBQTs7QUFwRFosYUF1REk7RUFDSSxrQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQTlhSixZQUFBO0VBQ0EsZ0JBQUE7RUFDQSxnQkFBQTtFQUNBLHNCQUFBO0VidERBLG9CQUFBO0VBQ0Esb0JBQUE7RUFDQSxxQkFBQTtFQUNBLGFBQUE7RUF5Q0EscUJBQUE7RUFDQSxrQkFBQTtFQUNBLGlDQUFBO0VBQ0EseUJBQUE7O0FhVUEsYUFvYUEsZUFwYUM7RUFDRyxjQUFBO0VBQ0EsWUFBQTtFQUNBLGtCQUFBOztBQUhKLGFBb2FBLGVBcGFDLHVCQUlHO0VBQ0ksY0FBQTtFQUNBLGlCQUFBO0VBQ0EsWUFBQTtFQUNBLGlCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBOztBQWtXWixhQStESSxlQUNJO0FBaEVSLGFBK0RvQixlQUNaO0VBQ0ksaUNBQUE7RUFDQSw4QkFBQTtFQUNBLHlCQUFBOztBQW5FWixhQStESSxlQU1JLFdBQVc7QUFyRW5CLGFBK0RvQixlQU1aLFdBQVc7RUFDUCxxQ0FBQTtFQUNBLGtDQUFBO0VBQ0EsNkJBQUE7O0FBR1IsYUFBQztBQUFzQixRQUFTO0VBQzVCLGNBQUE7RUFDQSxrQkFBQTtFQUNBLGdCQUFBO0VBQ0EsZ0JBQUE7RWJqZ0JKLG1CQUFtQixvQkFBbkI7RUFDQSxXQUFXLG9CQUFYOztBYTRmQSxhQUFDLG9CQU1HO0FBTm1CLFFBQVMsY0FNNUI7RUFDSSxNQUFBOztBQUdSLFFBQVM7RUFDTCxXQUFBOztBQURKLFFBQVMsY0FFTCxTQUFRO0FBRlosUUFBUyxjQUVpQixlQUFjO0VBQ2hDLDBCQUFBOztBQUdSLGFBQUMsb0JBQ0c7RUFDSSxTQUFBOztBYmhVUixhYThUQyxvQkFDRyxZQUVJLEdialVQO0VBQ0csYUFBQTs7QUFQSixhYW9VQyxvQkFDRyxZQUVJLEdidlVQO0VBQ0csYUFBQTs7O0FnQnhOUjtFQUNJLGtCQUFBO0VBQ0EsT0FBQTtFQUNBLE1BQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLDhCQUFBO0VBQ0EsVUFBQTtFQUNBLGFBQUE7RUFDQSxhQUFBO0VoQkhBLG1CZ0JJVyxvQmhCSlg7RUFDQSxXZ0JHVyxvQmhCSFg7RUFUQSxrQ0FBQTtFQUNBLDBCQUFBOztBZ0JjSjtFQUNJLGFBQUE7RUFDQSxhQUFBO0VBQ0EsZ0JBQUE7RUFDQSxzQkFBQTtFaEJLQSxjQUFBO0VBQ0EsaUNBQUE7RWdCSkEsa0JBQUE7RUFDQSxZQUFBO0VBQ0EsTUFBQTtFQUNBLFlBQUE7RWhCUkEsbUJBQW1CLG9CQUFuQjtFQUNBLFdBQVcsb0JBQVg7RUFqQkEsa0NBQUE7RUFDQSwwQkFBQTs7QWdCNkJJLE1BRkgsV0FFSTtFQUNHLGFBQUE7RUFDQSxZQUFBOztBQUVKLE1BTkgsV0FNSTtFQUNHLE9BQUE7O0FBSUosTUFESCxZQUNJO0VBQ0csYUFBQTtFQUNBLGFBQUE7O0FBRUosTUFMSCxZQUtJO0VBQ0csUUFBQTs7QUFJWixJQUFJLHNCQUNBO0FBRHdCLElBQUksdUJBQzVCO0VBQ0ksMkNBQUE7O0FBRlIsSUFBSSxzQkFJQTtBQUp3QixJQUFJLHVCQUk1QjtFaEJwQ0EsbUJBQW1CLG9CQUFuQjtFQUNBLFdBQVcsb0JBQVg7O0FnQitCSixJQUFJLHNCQU9BO0FBUHdCLElBQUksdUJBTzVCO0VBQ0ksY0FBQTtFQUNBLFVBQUE7O0FBR1IsSUFBSSx1QkFDQTtBQUR5QixJQUFJLHdCQUM3QjtFQUNJLDJDQUFBO0VoQjlESixrQ0FBQTtFQUNBLDBCQUFBO0VnQitESSwwREFBQTtFQUNBLG9EQUFBO0VBQ0EsMENBQUE7O0FBTlIsSUFBSSx1QkFRQTtBQVJ5QixJQUFJLHdCQVE3QjtFQUNJLDRCQUFBO0VBQ0EsY0FBQTtFQUNBLFVBQUE7O0FBR1IsSUFBSSx1QkFDQTtFaEIzREEsbUJBQW1CLHdCQUFuQjtFQUNBLFdBQVcsd0JBQVg7O0FnQnlESixJQUFJLHVCQUlBO0VoQjlEQSxtQkFBbUIsd0JBQW5CO0VBQ0EsV0FBVyx3QkFBWDs7QWdCaUVKLElBQUksc0JBQ0E7RWhCbkVBLG1CQUFtQix3QkFBbkI7RUFDQSxXQUFXLHdCQUFYOztBZ0JzRUosSUFBSSx3QkFDQTtFaEJ4RUEsbUJBQW1CLHlCQUFuQjtFQUNBLFdBQVcseUJBQVg7O0FnQnNFSixJQUFJLHdCQUlBO0VoQjNFQSxtQkFBbUIseUJBQW5CO0VBQ0EsV0FBVyx5QkFBWDs7QWdCOEVKLElBQUksdUJBQ0E7RWhCaEZBLG1CQUFtQix5QkFBbkI7RUFDQSxXQUFXLHlCQUFYOztBZ0JtRkosSUFBSSxjQUNBO0VBQ0ksY0FBQTs7QUFGUixJQUFJLGNBSUE7RWhCeEdBLGtDQUFBO0VBQ0EsMEJBQUE7RWdCeUdJLDBEQUFBO0VBQ0Esb0RBQUE7RUFDQSwwQ0FBQTs7O0FDNUdSLEtBQ0k7RUFDSSxhQUFBOztBQUZSLEtBSUksS0FBSTtFQUNBLGNBQUE7O0FBR1I7RUFDSSxrQkFBQTtFQUNBLFdBQUE7RUFDQSxnQkFBQTtFQUNBLFlBQUE7O0FBSkosbUJBS0k7RWpCZUEsb0JBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0VBQ0EsYUFBQTtFaUJoQkksWUFBQTtFakJmSixrQ0FBQTtFQUNBLDBCQUFBOztBaUJPSixtQkFLSSxRQUlJO0VBQ0ksV0FBQTtFQUNBLGNBQUE7RWpCeUNSLG1CQUFBO0VBQ0Esc0JBQUE7RUFDQSxrQkFBQTtFQUNBLGNBQUE7O0FpQnZDSjtFQUNJLFlBQUE7O0FBREosb0JBRUksUUFBUTtFQUNKLGNBQUE7OztBQzFCUjtFQUNJLGdCQUFBOztBQUVKO0VsQndCSSxvQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7RUFDQSxhQUFBO0VrQnpCQSw0QkFBQTtFQUNBLHlCQUFBO0VBQ0EsMEJBQUE7RUFDQSw4QkFBQTtFQUNBLHNCQUFBOztBQUVKO0VBQ0ksa0JBQUE7RUFDQSxnQkFBQTtFQUNBLGVBQUE7RUFDQSxjQUFBO0VBQ0EsaUJBQUE7O0FBTEosY0FNSTtFQUNJLGdCQUFBOztBQUdSO0VBQ0ksc0JBQUE7RUFDQSx1QkFBQTtFQUNBLGNBQUE7RWxCR0Esb0JBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0VBQ0EsYUFBQTtFa0JKQSw0QkFBQTtFQUNBLHlCQUFBO0VBQ0EsMEJBQUE7RUFDQSw4QkFBQTtFQUNBLHNCQUFBOztBQUNBLFFBQUM7RUFDRyxlQUFBOztBQUVKLFFBQUMsWUFDRztFQUNJLGNBQUE7O0FBSVo7QUFBZTtBQUFnQjtBQUFlO0VBQzFDLDBCQUFBOztBQUVKO0VBQ0ksZUFBQTtFQUNBLGNBQUE7RUFDQSxrQkFBQTtFQUNBLGVBQUE7O0FBQ0Esa0JBQW1CO0VBQ2YsYUFBQTs7QUFHUjtFQUNJLGVBQUE7RUFDQSxjQUFBO0VBQ0EsZUFBQTs7QUFDQSxtQkFBb0I7RUFDaEIsYUFBQTs7QUFHUjtFQUNJLFdBQUE7RUFDQSxZQUFBO0VBQ0EsbUJBQUE7RUFDQSxpQkFBQTtFQUNBLGtCQUFBO0VBQ0EsUUFBQTtFQUNBLHNCQUFBO0VBQ0EsVUFBQTtFbEJyRUEsa0NBQUE7RUFDQSwwQkFBQTs7QWtCc0VBLG9CQUFxQjtFQUNqQixVQUFBOztBQUdSO0VBQ0ksc0JBQUE7RUFDQSxrQkFBQTtFQUNBLGdCQUFBO0VBQ0EsZUFBQTtFQUNBLGVBQUE7RUFDQSxnQkFBQTtFQUNBLHNCQUFBO0VBQ0EsV0FBQTtFQUNBLGdCQUFBO0VBQ0Esa0JBQUE7RWxCckVBLG1CQUFtQixvQkFBbkI7RUFDQSxXQUFXLG9CQUFYOztBa0IwREosYUFZSTtFQUNJLGVBQUE7RUFDQSxZQUFBOztBQUVKLFlBQWE7RUFDVCxZQUFBOztBQUdSO0VBQ0ksZUFBQTtFQUNBLGVBQUE7O0FBQ0EsWUFBYSxJQUFJO0VBQ2IsZUFBQTs7QUFHUjtFQUNJLHdCQUFBO0VBQ0EsNEJBQUE7RUFDQSxvQkFBQTtFbEJUQSxzQkFBQTtFQUNBLG1CQUFBO0VBQ0EsNkJBQUE7RUFDQSxxQkFBQTs7QWtCR0osYUFLSTtBQUxKLGFBS21CO0VBQ1gsaUJBQUE7O0FBTlIsYUFRSTtFQUNJLHlCQUFBO0VBQ0EsaUJBQUE7RUFDQSw0QkFBQTtFQUNBLGlCQUFBOztBQUNBLGFBTEosY0FLSztFQUNHLGtCQUFBO0VBQ0EsU0FBUyxFQUFUO0VBQ0Esa0NBQUE7RUFDQSxtQ0FBQTtFQUNBLGdDQUFBO0VBQ0EsVUFBQTtFQUNBLFNBQUE7RUFDQSxRQUFBO0VBQ0EsU0FBQTs7QUFHUixhQUFDLG9CQUNHO0FBREosYUFBQyxvQkFDa0I7QUFEbkIsYUFBQyxvQkFDaUM7RUFDMUIsa0JBQUE7O0FBSVo7RUFDSSwwQkFBQTtFQUNBLDhCQUFBO0VBQ0Esc0JBQUE7RWxCOUNBLHdCQUFBO0VBQ0EscUJBQUE7RUFDQSwrQkFBQTtFQUNBLHVCQUFBOztBa0J3Q0osaUJBS0k7RUFDSSxzQkFBQTtFQUNBLDhCQUFBO0VBQ0EsZ0JBQUE7O0FBQ0EsaUJBSkosY0FJSztFQUNHLGtCQUFBO0VBQ0EsU0FBUyxFQUFUO0VBQ0Esa0NBQUE7RUFDQSxtQ0FBQTtFQUNBLDZCQUFBO0VBQ0EsV0FBQTtFQUNBLFNBQUE7RUFDQSxRQUFBO0VBQ0EsU0FBQTs7QUFsQlosaUJBcUJJO0FBckJKLGlCQXFCbUI7RUFDWCxnQkFBQTs7QUFFSixpQkFBQyxvQkFDRztBQURKLGlCQUFDLG9CQUNrQjtBQURuQixpQkFBQyxvQkFDaUM7RUFDMUIsaUJBQUE7O0FBS1o7RUFDSSxnREFBQTtFQUNBLHdDQUFBOztBQUVKO0VBQ0ksNkNBQUE7RUFDQSxxQ0FBQTs7QUFHSjtFQUNJO0lBQ0ksbUJBQW1CLHVCQUFuQjs7RUFFSjtJQUNJLG1CQUFtQixvQkFBbkI7OztBQUdSO0VBQ0k7SUFDSSxXQUFXLHVCQUFYOztFQUVKO0lBQ0ksV0FBVyxvQkFBWDs7O0FBR1I7RUFDSTtJQUNJLG1CQUFtQix3QkFBbkI7O0VBRUo7SUFDSSxtQkFBbUIsb0JBQW5COzs7QUFHUjtFQUNJO0lBQ0ksV0FBVyx3QkFBWDs7RUFFSjtJQUNJLFdBQVcsb0JBQVg7Ozs7QUMxTVIsSUFBSSx1QkFBd0I7RUFDeEIsaUJBQUE7RUFDQSxzQkFBQTs7QUFGSixJQUFJLHVCQUF3QixLQUd4QjtFQUNJLGNBQUE7O0FBSlIsSUFBSSx1QkFBd0IsS0FNeEI7RUFDSSxpQkFBQTs7QUFHUjtFQUNJLG1CQUFBO0VBQ0EsY0FBQTtFQUNBLGtCQUFBO0VBQ0EsT0FBQTtFQUNBLE1BQUE7RUFDQSxZQUFBO0VBQ0EsV0FBQTtFQUNBLGFBQUE7RW5CbEJBLGtDQUFBO0VBQ0EsMEJBQUE7Ozs7OztBb0JFSjtFQVVJLFlBQUE7RUFFQSxxQkFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0EseURBQUE7RUFDQSxpREFBQTs7QUFoQkosVUFrQkk7RUFDSSxXQUFBO0VBQ0EsWUFBQTtFQUNBLHlEQUFBO0VBQ0EsaURBQUE7O0FBdEJSLFVBa0JJLElBTUk7RUFDSSxVQUFBO0VBQ0EsZUFBQTtFQUNBLHNCQUFBO0VBQ0Esd0NBM0JNLHVDQTJCTjtFQUNBLGdDQTVCTSx1Q0E0Qk47O0FBR1I7RUFDSTtJQUNJLG1CQUFtQixTQUFuQjs7RUFFSjtJQUNJLG1CQUFtQixjQUFuQjs7O0FBR1I7RUFDSTtJQUNJLFdBQVcsU0FBWDs7RUFFSjtJQUNJLFdBQVcsY0FBWDs7O0FBSVI7RUFDSTtJQUNJLG1CQUFtQixpQkFBbkI7O0VBRUo7SUFDSSxtQkFBbUIsU0FBbkI7OztBQUdSO0VBQ0k7SUFDSSxXQUFXLGlCQUFYOztFQUVKO0lBQ0ksV0FBVyxTQUFYOzs7QUFHUjtFQUNJO0lBQ0ksa0NBQUE7SUFDQSxvQkFBQTs7RUFFSjtJQUNJLGdEQUFBO0lBQ0Esb0JBQUE7O0VBRUo7SUFDSSxrQ0FBQTtJQUNBLGtDQUFBOzs7QUFHUjtFQUNJO0lBQ0ksa0NBQUE7SUFDQSxvQkFBQTs7RUFFSjtJQUNJLGdEQUFBO0lBQ0Esb0JBQUE7O0VBRUo7SUFDSSxrQ0FBQTtJQUNBLGtDQUFBOzs7QUFJWjtFQU1JLGtCQUFBO0VBQ0EsY0FBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0EsZ0RBVHVCLHVDQVN2QjtFQUNBLHdDQVZ1Qix1Q0FVdkI7O0FBWEosZ0JBWUk7RUFDSSxrQkFBQTtFQUNBLFVBQUE7RUFDQSxTQUFBO0VBQ0EsaUJBQUE7RUFDQSxNQUFBO0VBQ0EsU0FBQTtFQUNBLHNCQUFBO0VBQ0EsNkJBQUE7O0FBcEJSLGdCQXNCSTtBQXRCSixnQkFzQjJCO0VBQ25CLGtCQUFBO0VBQ0EsTUFBQTtFQUNBLFlBQUE7RUFDQSxVQUFBO0VBQ0EsZ0JBQUE7O0FBM0JSLGdCQTZCSTtFQUNJLGtCQUFBO0VBQ0EsTUFBQTtFQUNBLFlBQUE7RUFDQSxXQUFBO0VBQ0Esc0JBQUE7RUFDQSx5QkFBQTtFQUNBLDJDQUFBO0VBQ0Esa0JBQUE7RUFDQSwyQ0FBQTtFQUNBLG1DQUFBO0VBQ0EsbUNBdkNtQiw4QkF1Q25CO0VBQ0EsbUNBQUE7RUFDQSwyQkFBQTtFQUNBLDJCQTFDbUIsOEJBMENuQjs7QUFFSixnQkFBaUIsaUJBQ2I7QUFESixnQkFBaUIsaUJBQ1M7RUFDbEIsa0JBQUE7O0FBL0NaLGdCQWtESTtFQUNJLE9BQUE7O0FBbkRSLGdCQWtESSxzQkFFSTtFQUNJLE9BQUE7RUFDQSwwQ0FBQTtFQUNBLDZDQUFBO0VBQ0EscUNBQUE7O0FBeERaLGdCQTJESTtFQUNJLFFBQUE7O0FBNURSLGdCQTJESSx1QkFFSTtFQUNJLFFBQUE7RUFDQSx5Q0FBQTtFQUNBLDhDQUFBO0VBQ0Esc0NBQUE7O0FBR1IsWUFBYSxpQkFDVCxzQkFDSTtFQUNJLHdEQUFBO0VBQ0EsZ0RBQUE7O0FBSlosWUFBYSxpQkFPVCx1QkFDSTtFQUNJLHlEQUFBO0VBQ0EsaURBQUE7O0FBS2hCO0VBQ0k7RUFBSTtJQUNBLG1CQUFtQixjQUFuQjs7RUFFSjtJQUNJLG1CQUFtQixhQUFuQjs7O0FBR1I7RUFDSTtFQUFJO0lBQ0EsV0FBVyxjQUFYOztFQUVKO0lBQ0ksV0FBVyxhQUFYOzs7QUFHUjtFQUNJO0VBQUk7SUFDQSxtQkFBbUIsZUFBbkI7O0VBRUo7SUFDSSxtQkFBbUIsWUFBbkI7OztBQUdSO0VBQ0k7RUFBSTtJQUNBLFdBQVcsZUFBWDs7RUFFSjtJQUNJLFdBQVcsWUFBWDs7O0FBSVI7RUFDSTtJQUNJLG1CQUFtQixjQUFuQjs7RUFFSjtJQUNJLG1CQUFtQixjQUFuQjs7RUFFSjtJQUNJLG1CQUFtQixjQUFuQjs7RUFFSjtJQUNJLG1CQUFtQixjQUFuQjs7RUFFSjtJQUNJLG1CQUFtQixjQUFuQjs7RUFFSjtJQUNJLG1CQUFtQixjQUFuQjs7RUFFSjtJQUNJLG1CQUFtQixjQUFuQjs7RUFFSjtJQUNJLG1CQUFtQixlQUFuQjs7O0FBR1I7RUFDSTtJQUNJLFdBQVcsY0FBWDs7RUFFSjtJQUNJLFdBQVcsY0FBWDs7RUFFSjtJQUNJLFdBQVcsY0FBWDs7RUFFSjtJQUNJLFdBQVcsY0FBWDs7RUFFSjtJQUNJLFdBQVcsY0FBWDs7RUFFSjtJQUNJLFdBQVcsY0FBWDs7RUFFSjtJQUNJLFdBQVcsY0FBWDs7RUFFSjtJQUNJLFdBQVcsZUFBWDs7O0FBR1I7RUFDSTtFQUNBO0lBQ0ksMEJBQUE7SUFDQSxtQkFBbUIsY0FBbkI7O0VBRUo7SUFDSSwwQkFBQTtJQUNBLHlCQUFBOztFQUVKO0lBQ0ksMEJBQUE7SUFDQSx5QkFBQTtJQUNBLG1CQUFtQixhQUFuQjs7RUFFSjtJQUNJLDBCQUFBO0lBQ0EseUJBQUE7OztBQUdSO0VBQ0k7RUFDQTtJQUNJLDBCQUFBO0lBQ0EsV0FBVyxjQUFYOztFQUVKO0lBQ0ksMEJBQUE7SUFDQSx5QkFBQTs7RUFFSjtJQUNJLDBCQUFBO0lBQ0EseUJBQUE7SUFDQSxXQUFXLGFBQVg7O0VBRUo7SUFDSSwwQkFBQTtJQUNBLHlCQUFBOzs7QUFHUjtFQUNJO0VBQ0E7SUFDSSwyQkFBQTtJQUNBLG1CQUFtQixlQUFuQjs7RUFFSjtJQUNJLDJCQUFBO0lBQ0EseUJBQUE7O0VBRUo7SUFDSSwyQkFBQTtJQUNBLHlCQUFBO0lBQ0EsbUJBQW1CLFlBQW5COztFQUVKO0lBQ0kseUJBQUE7SUFDQSwyQkFBQTs7O0FBR1I7RUFDSTtFQUNBO0lBQ0ksMkJBQUE7SUFDQSxXQUFXLGVBQVg7O0VBRUo7SUFDSSwyQkFBQTtJQUNBLHlCQUFBOztFQUVKO0lBQ0ksMkJBQUE7SUFDQSx5QkFBQTtJQUNBLFdBQVcsWUFBWDs7RUFFSjtJQUNJLHlCQUFBO0lBQ0EsMkJBQUE7Ozs7QUN0VlI7QUFBYztFQUNWLFdBQUE7RUFDQSxXQUFBO0VBQ0EsZ0JBQUE7RUFDQSxjQUFBO0VBQ0Esa0JBQUE7RXJCT0EsdUNBQUE7RUFDQSwrQkFBQTtFcUJOQSxtQ0FBQTs7QUFHSjtFQUNJLGNBQUE7RUFDQSxzQkFBQTtFQUNBLG9DQUFBO0VBQ0EsNEJBQUE7O0FBSkosWUFLSTtFQUNJLFNBQVMsRUFBVDtFQUNBLFdBQUE7RUFDQSxtQkFBQTtFQUNBLFlBQUE7RUFDQSxrQkFBQTtFQUNBLE9BQUE7RUFDQSxNQUFBO0VyQk5KLG1CQUFtQix3QkFBbkI7RUFDQSxXQUFXLHdCQUFYO0VBakJBLGtDQUFBO0VBQ0EsMEJBQUE7O0FxQjJCSjtFQUNJLGNBQUE7O0FBQ0EscUJBQUM7QUFBUyxxQkFBQztFQUNQLFNBQVMsRUFBVDtFQUNBLGtCQUFBO0VBQ0EsT0FBQTtFQUNBLE1BQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0VyQnpCSixxQ0FBQTtFQUNBLDZCQUFBOztBcUIyQkEscUJBQUM7RXJCcEJELDREQUFBO0VBQ0Esb0RBQUE7O0FxQnNCQSxxQkFBQztFckJ2QkQsNERBQUE7RUFDQSxvREFBQTs7QXFCeUJBLElBQUksdUJBQXdCLEtBQUs7QUFBSyxJQUFJLHVCQUF3QixpQkFBaUI7RUFDL0UsU0FBQTs7QUFNUixxQkFBcUI7RUFDakIsMkJBQUE7O0FBQ0EscUJBRmlCLFlBRWhCO0FBQVMscUJBRk8sWUFFTjtFQUNQLFdBQUE7RUFDQSxlQUFBOztBQUVKLHFCQU5pQixZQU1oQjtFQUNHLGdCQUFBO0VyQnhDSiwwRUFBQTtFQUNBLGtFQUFBOztBcUIwQ0EscUJBVmlCLFlBVWhCO0VBQ0csZ0JBQUE7RXJCNUNKLDBFQUFBO0VBQ0Esa0VBQUE7RUFUQSx1Q0FBQTtFQUNBLCtCQUFBOztBcUJ5REosSUFDSTtBQURFLEtBQ0Y7QUFEUyxNQUNUO0FBRGlCLEtBQ2pCO0FBRHdCLE1BQ3hCO0FBRGdDLE1BQ2hDO0FBRHdDLGdCQUN4QztBQURKLElBQ29CO0FBRGQsS0FDYztBQURQLE1BQ087QUFEQyxLQUNEO0FBRFEsTUFDUjtBQURnQixNQUNoQjtBQUR3QixnQkFDeEI7RUFDWixrQkFBQTtFQUNBLE9BQUE7RUFDQSxNQUFBO0VBQ0EsY0FBQTtFckIvREosb0NBQUE7RUFDQSw0QkFBQTs7QXFCbUVKO0VyQjVESSxnREFBQTtFQUNBLHdDQUFBOztBcUI4REo7RXJCL0RJLGlEQUFBO0VBQ0EseUNBQUE7O0FxQmtFSixJQUFJLHVCQUF3QixLQUFLO0FBQWdCLElBQUksdUJBQXdCLGlCQUFpQjtFQUMxRixTQUFBOztBQUVKO0VBQ0k7SUFDSSxVQUFBO0lBQ0EsbUJBQW1CLFNBQW5COztFQUVKO0lBQ0ksVUFBQTtJQUNBLG1CQUFtQixTQUFuQjs7O0FBR1I7RUFDSTtJQUNJLFVBQUE7SUFDQSxXQUFXLFNBQVg7O0VBRUo7SUFDSSxVQUFBO0lBQ0EsV0FBVyxTQUFYOzs7QUFHUjtFQUNJO0lBQ0ksVUFBQTtJQUNBLG1CQUFtQixTQUFuQjs7RUFFSjtJQUNJLFVBQUE7SUFDQSxtQkFBbUIsU0FBbkI7OztBQUdSO0VBQ0k7SUFDSSxVQUFBO0lBQ0EsV0FBVyxTQUFYOztFQUVKO0lBQ0ksVUFBQTtJQUNBLFdBQVcsU0FBWDs7O0FBR1I7RUFDSTtJQUNJLG1CQUFtQixpQkFBaUIsV0FBcEM7O0VBRUo7SUFDSSxtQkFBbUIsZ0JBQWdCLFdBQW5DOztFQUVKO0lBQ0ksbUJBQW1CLGlCQUFpQixTQUFwQzs7RUFFSjtJQUNJLG1CQUFtQixpQkFBaUIsU0FBcEM7OztBQUdSO0VBQ0k7SUFDSSxXQUFXLGlCQUFpQixXQUE1Qjs7RUFFSjtJQUNJLFdBQVcsZ0JBQWdCLFdBQTNCOztFQUVKO0lBQ0ksV0FBVyxpQkFBaUIsU0FBNUI7O0VBRUo7SUFDSSxXQUFXLGlCQUFpQixTQUE1Qjs7O0FBR1I7RUFDSTtJQUNJLG1CQUFtQixrQkFBa0IsU0FBckM7O0VBRUo7SUFDSSxtQkFBbUIsa0JBQWtCLFNBQXJDOztFQUVKO0lBQ0ksbUJBQW1CLGdCQUFnQixZQUFuQzs7RUFFSjtJQUNJLG1CQUFtQixpQkFBaUIsV0FBcEM7O0VBRUo7SUFDSSxtQkFBbUIsaUJBQWlCLFdBQXBDOzs7QUFHUjtFQUNJO0lBQ0ksV0FBVyxrQkFBa0IsU0FBN0I7O0VBRUo7SUFDSSxXQUFXLGtCQUFrQixTQUE3Qjs7RUFFSjtJQUNJLFdBQVcsZ0JBQWdCLFlBQTNCOztFQUVKO0lBQ0ksV0FBVyxpQkFBaUIsV0FBNUI7O0VBRUo7SUFDSSxXQUFXLGlCQUFpQixXQUE1Qjs7O0FBSVI7RUFDSTtJQUNJLHlCQUFBOztFQUVKO0lBQ0kseUJBQUE7O0VBRUo7SUFDSSx5QkFBQTs7RUFFSjtJQUNJLHlCQUFBOzs7QUFHUjtFQUNJO0lBQ0kseUJBQUE7O0VBRUo7SUFDSSx5QkFBQTs7RUFFSjtJQUNJLHlCQUFBOztFQUVKO0lBQ0kseUJBQUE7OztBQUdSO0VBQ0k7SUFDSSxtQkFBbUIsU0FBbkI7SUFDQSx5QkFBQTs7RUFFSjtJQUNJLG1CQUFtQixTQUFuQjtJQUNBLHlCQUFBOztFQUVKO0lBQ0ksbUJBQW1CLFNBQW5CO0lBQ0EseUJBQUE7O0VBRUo7SUFDSSxtQkFBbUIsU0FBbkI7SUFDQSx5QkFBQTs7RUFFSjtJQUNJLG1CQUFtQixTQUFuQjtJQUNBLHlCQUFBOztFQUVKO0lBQ0ksbUJBQW1CLFNBQW5CO0lBQ0EseUJBQUE7O0VBRUo7SUFDSSxtQkFBbUIsU0FBbkI7SUFDQSx5QkFBQTs7RUFFSjtJQUNJLG1CQUFtQixTQUFuQjtJQUNBLHlCQUFBOzs7QUFHUjtFQUNJO0lBQ0ksV0FBVyxTQUFYO0lBQ0EseUJBQUE7O0VBRUo7SUFDSSxXQUFXLFNBQVg7SUFDQSx5QkFBQTs7RUFFSjtJQUNJLFdBQVcsU0FBWDtJQUNBLHlCQUFBOztFQUVKO0lBQ0ksV0FBVyxTQUFYO0lBQ0EseUJBQUE7O0VBRUo7SUFDSSxXQUFXLFNBQVg7SUFDQSx5QkFBQTs7RUFFSjtJQUNJLFdBQVcsU0FBWDtJQUNBLHlCQUFBOztFQUVKO0lBQ0ksV0FBVyxTQUFYO0lBQ0EseUJBQUE7O0VBRUo7SUFDSSxXQUFXLFNBQVg7SUFDQSx5QkFBQTs7OztBQzlSUjtFQUNJLFdBQUE7RUFDQSxhQUFBO0VBQ0EsY0FBQTs7QUFDQSxlQUFDO0VBQ0csYUFBQTs7QUFFSixRQUFnQyw2QkFBd0I7RUFDcEQsZUFBQyxJQUFJO0lBQ0QsYUFBQTs7O0FBSVosUUFBUTtFQUNKLFlBQUE7O0FBREosUUFBUSx1QkFFSjtFQUNJLDBCQUFBOztBQUdSO0V0QlNJLG9CQUFBO0VBQ0Esb0JBQUE7RUFDQSxxQkFBQTtFQUNBLGFBQUE7RUFxREEsd0JBQUE7RUFDQSxxQkFBQTtFQUNBLCtCQUFBO0VBQ0EsdUJBQUE7RXNCakVBLFVBQUE7RUFDQSxpQkFBQTtFQUNBLGVBQUE7RUFDQSx3QkFBd0IsZ0hBQXhCO0VBQ0Esd0JBQXdCLHdHQUF4Qjs7QUFFSjtFQUNJLGdCQUFBO0VBQ0Esa0JBQUE7RUFDQSxnQkFBQTs7QUFFQSxpQkFBQztFQUNHLGdCQUFBOztBQUVKLGlCQUFDO0VBQ0csa0JBQUE7O0FBRUosaUJBQUM7RUFDRyxpQkFBQTs7QUFFSixpQkFBQztFQUNHLDBCQUFBO0V0QmZKLG9CQUFBO0VBQ0Esb0JBQUE7RUFDQSxxQkFBQTtFQUNBLGFBQUE7RUF1RUEseUJBQUE7RUFDQSxzQkFBQTtFQUNBLDJCQUFBO0VBQ0EsbUJBQUE7O0FzQnpESjtFdEJoREksa0NBQUE7RUFDQSwwQkFBQTtFc0JrREEsNENBQUE7RUFDQSxvQ0FBQTs7QUFFSjtFQUNJLFlBQUE7RUFDQSxpQkFBQTtFQUNBLGVBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBO0VBQ0EsZ0JBQUE7RUFDQSx1QkFBQTtFQUNBLDBCQUFBO0VBQ0EsT0FBQTtFQUNBLE1BQUE7RUFDQSxXQUFBO0VBQ0Esc0JBQUE7RXRCbEVBLGtDQUFBO0VBQ0EsMEJBQUE7O0FzQm1FQSwwQkFBMkI7RUFDdkIsa0JBQUE7O0FBRUosWUFBQztFQUNHLG9CQUFBOztBQUVKLFlBQUM7RUFDRywwQkFBQTtFdEJuRUosbUJzQm9FZSxxQkFBbUIsYXRCcEVsQztFQUNBLFdzQm1FZSxxQkFBbUIsYXRCbkVsQzs7QXNCc0VKO0VBQ0ksWUFBQTtFQUNBLHNCQUFBO0VBQ0Esa0JBQUE7RUFDQSxPQUFBO0VBQ0EsV0FBQTtFQUNBLFFBQUE7RUFDQSxpQkFBQTtFQUdBLG9CQUFBOztBdEJ1Q0Esd0JBQUM7RUFDRyxTQUFTLEVBQVQ7RUFDQSxrQkFBQTtFQUNBLE9BQUE7RUFDQSxNQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7RUFDQSxXQUFBO0VBQ0EsV0FBQTtFQUNBLHFDQUFBO0VBQ0EsY0FBQTtFQUNBLFdBQUE7RUEvSEosZ0NBQUE7RUFDQSx3QkFBQTs7QUFnSUksSUFBSSxjQUFlLHlCQWJ0QjtFQXhIRCxtQkFzSW1CLFdBdEluQjtFQUNBLFdBcUltQixXQXJJbkI7O0FBdUlJLElBQUksY0FBZSx5QkFoQnRCO0VBeEhELG1CQXlJbUIsWUF6SW5CO0VBQ0EsV0F3SW1CLFlBeEluQjs7QUFtS0Esd0JBQUM7RUFDRyxTQUFTLEVBQVQ7RUFDQSxrQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0VBQ0EsV0FBQTtFQUNBLHFDQUFBO0VBQ0EsY0FBQTtFQUNBLFdBQUE7RUEzS0osa0NBQUE7RUFDQSwwQkFBQTs7QUE0S0ksSUFBSSxjQUFlLHlCQWJ0QjtFQXBLRCxtQkFrTG1CLFdBbExuQjtFQUNBLFdBaUxtQixXQWpMbkI7O0FBbUxJLElBQUksY0FBZSx5QkFoQnRCO0VBcEtELG1CQXFMbUIsWUFyTG5CO0VBQ0EsV0FvTG1CLFlBcExuQjs7QXNCbUZKLFVBQ0k7RUFDSSxnQkFBQTtFQUNBLDJCQUFBO0VBQ0EsbUJBQUE7O0FBSlIsVUFNSTtBQU5KLFVBTXVCO0FBTnZCLFVBTWtEO0VBQzFDLG9DQUFBO0VBQ0EsNEJBQUE7O0FBUlIsVUFVSTtFQUNJLGlCQUFBOztBQVhSLFVBYUk7RUFDSSw4Q0FBQTtFQUNBLHNDQUFBO0VBQ0EsbUNBQUE7RUFDQSwyQkFBQTtFQUNBLDRDQUFBO0VBQ0Esb0NBQUE7OztBQzlHUjtFQUNJLGtCQUFBO0VBQ0EsT0FBQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0VBQ0EsY0FBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsU0FBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0Esc0JBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBO0VBQ0EsaUNBQUE7RXZCZkEsa0NBQUE7RUFDQSwwQkFBQTtFdUJnQkEsMkJBQUE7RUFDQSxtQkFBQTs7QUFFQSxjQUFDLFdBQVk7RUFHVCxnQkFBQTtFQUNBLG1CQUFBO0VBQ0EsY0FBQTs7QXZCc01KLGN1QjNNQyxXQUFZLEt2QjJNWjtFQUNHLGFBQUE7O0FBUEosY3VCck1DLFdBQVksS3ZCcU1aO0VBQ0csYUFBQTs7QXVCek5SLGNBMEJJO0V2QitEQSx3QkFBQTtFQUNBLHFCQUFBO0VBQ0EsK0JBQUE7RUFDQSx1QkFBQTtFdUJoRUksa0JBQUE7O0FBNUJSLGNBOEJJO0VBQ0ksZUFBQTtFQUNBLG1CQUFBO0VBQ0EsbUJBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBOztBQW5DUixjQXFDSTtFQUNJLG1CQUFBO0VBQ0EsY0FBQTtFQUNBLGlCQUFBOztBdkJnTEosY3VCbkxBLFl2Qm1MQztFQUNHLGFBQUE7O0F1QnpOUixjQTJDSTtFQUNJLGdCQUFBO0VBQ0EsaUJBQUE7O0FBN0NSLGNBK0NJLFFBQU87RUFDSCxjQUFBOztBQWhEUixjQWtESTtFQUNJLGNBQUE7RXZCcERKLGtDQUFBO0VBQ0EsMEJBQUE7RUFHQSwrQkFBQTtFQUNBLHVCQUFBO0VBV0EsbUJBQW1CLG9CQUFuQjtFQUNBLFdBQVcsb0JBQVg7RXVCdUNJLFVBQUE7O0FBdkRSLGNBeURJO0VBQ0ksVUFBQTtFdkJ2REosNkJBQUE7RUFDQSxxQkFBQTtFQVdBLG1CQUFtQixvQkFBbkI7RUFDQSxXQUFXLG9CQUFYOztBdUJoQkosY0E4REk7RXZCM0RBLDZCQUFBO0VBQ0EscUJBQUE7O0F1QjZEQSxRQUEwQjtFQUN0QixjQUFDLFdBQVk7SUFDVCxrQkFBQTtJQUNBLFdBQUE7SUFDQSxnQkFBQTs7OztBVHJFWjtBQUFTLENBQUM7QUFBa0IsZ0JBQWlCO0FBQUssQ0FBQztBQUFPLENBQUM7QUFBWTtBQUFTO0FBQWU7QUFBVztBQUFjO0FBQWlCO0FBQXVCLG1CQUFvQjtFQUNoTCx5QkFBQTtFQUNBLGlCQUFBOztBQUdKO0VBQ0ksT0FBQTtFQUNBLE1BQUE7RUFDQSw2QkFBQTtFQUNBLGtCQUFBO0VBQ0Esb0JBQUE7RUFDQSxXQUFBO0VBQ0EsOEJBQUE7RUFDQSxVQUFBO0VBQ0EsU0FBQTtFQUNBLFlBQUE7RWRSQSxtQmNTVyx5QkFBeUIsUWRUcEM7RUFDQSxXY1FXLHlCQUF5QixRZFJwQztFQVRBLG1DQUFBO0VBQ0EsMkJBQUE7O0Fja0JBLFlBQUM7RWRuQkQsa0NBQUE7RUFDQSwwQkFBQTtFY29CSSxhQUFBOztBQUVKLFlBQUM7RWR2QkQsa0NBQUE7RUFDQSwwQkFBQTtFY3dCSSxVQUFBOztBQUVKLFlBQWE7QUFBSSxvQkFBcUI7RUFDbEMsVUFBQTs7QUFHUixZQUNJO0FBRFUsT0FDVjtBQURtQixRQUNuQjtBQUQ2QixVQUM3QjtBQUR5QyxVQUN6QztBQURxRCxjQUNyRDtBQURxRSxnQkFDckU7QUFEdUYsbUJBQW9CLEVBQzNHO0VBQ0ksb0NBQUE7O0FBR1IsV0FDSTtFQUNJLDhCQUFBOzs7QVV0Q1I7QUFBVztFQUNQLGFBQUE7RUFDQSxvQkFBQTs7QUFDQSxTQUFVO0FBQVYsU0FBVTtBQUFHLFVBQVc7QUFBWCxVQUFXO0VBQ3BCLFVBQUE7O0FDSFIsTUFBTSxRQUNKLGdCQUVFLGNBQ0UsWUFBVztFQUNULGdCQUFBOztBQVNOLGVBQUM7QUFBRCxjQUFDO0FBQUQsbUJBQUM7RUFDQyxZQUFBOztBQUtGLFNBQUMsTUFFQztBQURGLFNBQUMsUUFDQztFQUNFLGNBQUE7O0FBSEosU0FBQyxNQUVDLFlBR0U7QUFKSixTQUFDLFFBQ0MsWUFHRTtFQUNFLGdCQUFBO0VBQ0EsZ0JBQUE7O0FBR0YsU0FWSCxNQUVDLFlBUUc7QUFBRCxTQVRILFFBQ0MsWUFRRztFQUNDLGFBQUE7O0FBREYsU0FWSCxNQUVDLFlBUUcsWUFHQyxHQUFFLFlBQWE7QUFIakIsU0FUSCxRQUNDLFlBUUcsWUFHQyxHQUFFLFlBQWE7RUFDYixnQkFBQTs7QUFLTixTQW5CRCxNQXFCRztBQUZGLFNBbEJELFFBb0JHO0FBckJKLFNBQUMsTUFvQkMsZUFDRTtBQXBCSixTQUFDLFFBbUJDLGVBQ0U7RUFDRSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFNBQUE7RUFDQSxVQUFBOztBQXpCTixTQUFDLE1BNkJDO0FBNUJGLFNBQUMsUUE0QkM7RUFDRSxrQkFBQTs7QUE5QkosU0FBQyxNQTZCQyxjQUdFO0FBL0JKLFNBQUMsUUE0QkMsY0FHRTtFQUNFLGtCQUFBOztBQWxDUixTQXVDRTtFQUNFLFdBQUE7RUFDQSxZQUFBO0VBQ0EsU0FBQTtFQUNBLFVBQUE7O0FBM0NKLFNBdUNFLFlBTUU7RUFDRSxNQUFBO0VBQ0EsWUFBQTs7QUEvQ04sU0FrREU7RUFDRSxhQUFBOztBQ3RFSixTQUNFO0VBQ0UsNkJBQUE7O0FBRkosU0FLRTtFQUNFLGVBQUE7RUFDQSxnQkFBQTtFQUNBLDZCQUFBOztBQVJKLFNBS0UsR0FLRTtFQUNFLHFCQUFBOztBQVhOLFNBZUU7RUFDRSxrQkFBQTtFQUNBLFVBQUE7O0FBRUEsU0FKRixRQUlHO0VBQ0MsU0FBUyxFQUFUO0VBQ0Esa0JBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0UxQnlORixzQkFBc0Isd3JCQUF0Qjs7QTJCaFBBLGFBREYsWUFDRyxTQUNDO0VBQ0UsV0FBQTtFQUNBLGFBQUE7RUFDQSxpQkFBQTs7QUFKSixhQURGLFlBQ0csU0FPQztFQUNFLGVBQUE7RUFDQSxjQUFBOztBQUlKLGFBZEYsWUFjRztFQUNDLGNBQUE7RUFDQSxlQUFBO0VBQ0EsY0FBQTtFQUNBLGlCQUFBO0VBQ0EsaUJBQUE7O0FBSUosYUFBQyxRQUNDO0VBQ0UsY0FBQTtFQUNBLGlCQUFBOztBQUhKLGFBQUMsUUFDQyxZQUlFO0VBQ0UsV0FBQTs7QUFOTixhQUFDLFFBQ0MsWUFJRSxPQUdFO0VBQ0UsT0FBQTtFQUNBLGVBQUE7RUFDQSxnQkFBQTs7QUFFQSxhQWJQLFFBQ0MsWUFJRSxPQUdFLFFBS0c7RUFDQyxjQUFBOztBQUdGLGFBakJQLFFBQ0MsWUFJRSxPQUdFLFFBU0c7RUFDQyxXQUFBO0VBQ0EseUJBQUE7O0FBM0NaLGFBa0RFO0VBQ0UsV0FBQTtFQUNBLFlBQUE7RUFDQSxtQkFBQTtFQUNBLGdCQUFBO0VBQ0EsK0NBQUE7O0FBS0YsVUFBQyxhQUNDO0VBQ0Usc0JBQUE7RUFDQSxtQkFBQTs7QUFLTixRQUFTLFlBQVcsV0FBWSxHQUFFLFdBQVksU0FBUztFQUNyRCxrQkFBQTs7QVpwRUEsT0FBQyxPQUNDLEVBQUM7RUFDQyxzQkFBQTs7QWFITjtFQUNFLFdBQUE7RUFDQSx5QkFBQTtFQUNBLGNBQUE7O0FBSEYsY0FLRTtFQUNFLGdCQUFBOztBQU5KLGNBU0U7RUFDRSxnQkFBQTs7QUFWSixjQVNFLFlBR0U7RUFDRSxZQUFBOztBQWJOLGNBU0UsWUFPRTtFQUNFLHFCQUFBOztBQUlBLElBQUksTUFBTyxlQVpmLFlBV0U7RUFFSSxlQUFBOztBQ3RCUixjQUNFO0VBQ0UsWUFBQTtFQUNBLGtCQUFBO0VBQ0EsZUFBQTtFQUNBLGdCQUFBO0VBQ0EsbUJBQUE7RUFDQSwrQ0FBQTs7QUFHRSxjQVRKLEVBUUcsT0FDRTtFQUNDLFNBQVEsR0FBUjtFQUNBLGtCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSw4Q0FBQTtFQUNBLFVBQUE7RUFDQSxrQkFBQTs7QUFJSixjQXBCRixFQW9CRztFQUNDLDRCQUFBO0VBQ0EsMEJBQUE7RTdCMk5GLHNCQUFzQixnWUFBdEI7O0E2QmxQSixjQTRCRSxjQUNFO0VBQ0UscUJBQUE7RUFDQSxpQkFBQTs7QUEvQk4sY0FtQ0UsaUJBQ0U7RUFDRSxpQkFBQTs7QUFJSixjQUFDLFdBQVcsV0FBWSxHQUFFLFdBQVk7RUFDcEMsZ0JBQUE7O0FDMUNKLE1BQ0U7RUFDRSxrQkFBQTs7QUFGSixNQUtFLGVBQWM7RUFDWixjQUFBOztBQU5KLE1BU0U7RUFDRSxtQkFBQTs7QUFWSixNQVNFLGVBR0U7RUFDRSxXQUFBOztBQWJOLE1BaUJFO0VBQ0UsbUJBQUE7RUFDQSxTQUFBOztBQUVBLE1BSkYsR0FJRztFQUNDLFdBQUE7RUFDQSxpQkFBQTtFQUNBLGdCQUFBOztBQXhCTixNQTRCRSxFQUFFO0VBQ0EsaUJBQUE7O0FBN0JKLE1BZ0NFO0VBQ0UsZ0JBQWdCLGdGQUFoQjs7QUNqQ0osT0FDRSxXQUFVLFNBQ1I7RUFDRSxlQUFBOztBQUhOLE9BQ0UsV0FBVSxTQUtSO0VBQ0UsV0FBQTtFQUNBLGFBQUE7RUFDQSxTQUFBO0VBQ0EsaUJBQUE7O0FBVk4sT0FDRSxXQUFVLFNBS1IsUUFNRTtFQUNFLGlCQUFBOztBQUVBLE9BZE4sV0FBVSxTQUtSLFFBTUUsV0FHRztFQUNDLFVBQUE7O0FBU1YsTUFDRSxXQUFVLFNBQ1I7QUFGSixNQUNFLFdBQVUsU0FFUjtBQUhKLE1BQ0UsV0FBVSxTQUdSO0VBQ0Usc0JBQUE7O0FBTE4sTUFDRSxXQUFVLFNBT1I7RUFDRSxlQUFBOztBQVROLE1BQ0UsV0FBVSxTQVdSO0VBQ0UsV0FBQTtFQUNBLFNBQUE7RUFDQSxpQkFBQTs7QUFmTixNQUNFLFdBQVUsU0FXUixRQUtFO0VBQ0UsVUFBQTs7QUFsQlIsTUFDRSxXQUFVLFNBcUJSLE9BQ0U7RUFDRSxTQUFBOztBQXhCUixNQUNFLFdBQVUsU0FxQlIsT0FDRSxJQUdFLEVBQUM7RUFDQyxZQUFBOztBQ3BEUixDQURELEtBQ0U7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaENnUEEsc0JBQXNCLGliQUF0Qjs7QWdDN09GLENBTkQsS0FNRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQzJPQSxzQkFBc0IsaWJBQXRCOztBZ0N4T0YsQ0FYRCxLQVdFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDc09BLHNCQUFzQix1cEJBQXRCOztBZ0NuT0YsQ0FoQkQsS0FnQkU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaENpT0Esc0JBQXNCLHlqQkFBdEI7O0FnQzlORixDQXJCRCxLQXFCRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQzROQSxzQkFBc0IsbWxDQUF0Qjs7QWdDek5GLENBMUJELEtBMEJFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDdU5BLHNCQUFzQiw4OUJBQXRCOztBZ0NwTkYsQ0EvQkQsS0ErQkU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaENrTkEsc0JBQXNCLDJxQkFBdEI7O0FnQy9NRixDQXBDRCxLQW9DRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQzZNQSxzQkFBc0IsK2dCQUF0Qjs7QWdDMU1GLENBekNELEtBeUNFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDd01BLHNCQUFzQiw2bERBQXRCOztBZ0NyTUYsQ0E5Q0QsS0E4Q0U7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaENtTUEsc0JBQXNCLCt5QkFBdEI7O0FnQ2hNRixDQW5ERCxLQW1ERTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQzhMQSxzQkFBc0IsMmhCQUF0Qjs7QWdDM0xGLENBeERELEtBd0RFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDeUxBLHNCQUFzQiwyd0JBQXRCOztBZ0N4SkYsQ0EzRkQsS0EyRkU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFQzNGRix5QkFBQTtFQUNBLHdCQUF3Qiw2YUFBeEI7O0FENkZBLENBaEdELEtBZ0dFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RUNoR0YseUJBQUE7RUFDQSx3QkFBd0IsOGFBQXhCOztBRGtHQSxDQXJHRCxLQXFHRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VDckdGLHlCQUFBO0VBQ0Esd0JBQXdCLCthQUF4Qjs7QUR1R0EsQ0ExR0QsS0EwR0U7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFQzFHRix5QkFBQTtFQUNBLHdCQUF3Qiw4YUFBeEI7O0FENEdBLENBL0dELEtBK0dFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RUMvR0YseUJBQUE7RUFDQSx3QkFBd0IscWdCQUF4Qjs7QURpSEEsQ0FwSEQsS0FvSEU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFQ3BIRix5QkFBQTtFQUNBLHdCQUF3QiwyZ0JBQXhCOztBRHNIQSxDQXpIRCxLQXlIRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQ3dIQSxzQkFBc0IsMGtCQUF0Qjs7QWdDckhGLENBOUhELEtBOEhFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDbUhBLHNCQUFzQixtbEJBQXRCOztBZ0NoSEYsQ0FuSUQsS0FtSUU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaEM4R0Esc0JBQXNCLDJtQkFBdEI7O0FnQzNHRixDQXhJRCxLQXdJRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQ3lHQSxzQkFBc0IsbW1CQUF0Qjs7QWdDdEdGLENBN0lELEtBNklFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDb0dBLHNCQUFzQixvNkJBQXRCOztBZ0NqR0YsQ0FsSkQsS0FrSkU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaEMrRkEsc0JBQXNCLG04QkFBdEI7O0FnQzVGRixDQXZKRCxLQXVKRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQzBGQSxzQkFBc0IscWtCQUF0Qjs7QWdDdkZGLENBNUpELEtBNEpFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDcUZBLHNCQUFzQixtakJBQXRCOztBZ0NsRkYsQ0FqS0QsS0FpS0U7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaENnRkEsc0JBQXNCLDJhQUF0Qjs7QWdDN0VGLENBdEtELEtBc0tFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDMkVBLHNCQUFzQiwrdkJBQXRCOztBZ0N4RUYsQ0EzS0QsS0EyS0U7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaENzRUEsc0JBQXNCLG1xQkFBdEI7O0FnQ25FRixDQWhMRCxLQWdMRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQ2lFQSxzQkFBc0IsbTVLQUF0Qjs7QWdDN0RGLENBdExELEtBc0xFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RUN0TEYseUJBQUE7RUFDQSx3QkFBd0IsOHBCQUF4Qjs7QUR3TEEsQ0EzTEQsS0EyTEU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFQzNMRix5QkFBQTtFQUNBLHdCQUF3Qix5MEJBQXhCOztBRDZMQSxDQWhNRCxLQWdNRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VDaE1GLHlCQUFBO0VBQ0Esd0JBQXdCLG9xQkFBeEI7O0FEcU1BLENBeE1ELEtBd01FO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDeUNBLHNCQUFzQiw0WUFBdEI7O0FnQ3RDRixDQTdNRCxLQTZNRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQ29DQSxzQkFBc0Isa2FBQXRCOztBZ0NqQ0YsQ0FsTkQsS0FrTkU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaEMrQkEsc0JBQXNCLGdnQkFBdEI7O0FnQzVCRixDQXZORCxLQXVORTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQzBCQSxzQkFBc0IsNlVBQXRCOztBZ0N2QkYsQ0E1TkQsS0E0TkU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaENxQkEsc0JBQXNCLHNaQUF0Qjs7QWdDbEJGLENBak9ELEtBaU9FO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDZ0JBLHNCQUFzQixxYUFBdEI7O0FnQ2JGLENBdE9ELEtBc09FO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDV0Esc0JBQXNCLHFhQUF0Qjs7QWdDUkYsQ0EzT0QsS0EyT0U7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaENNQSxzQkFBc0Isc1pBQXRCOztBZ0NIRixDQWhQRCxLQWdQRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQ0NBLHNCQUFzQixxYUFBdEI7O0FnQ0VGLENBclBELEtBcVBFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDSkEsc0JBQXNCLHFhQUF0Qjs7QWdDVUYsQ0E3UEQsS0E2UEU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaENaQSxzQkFBc0IseWJBQXRCOztBZ0NlRixDQWxRRCxLQWtRRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQ2pCQSxzQkFBc0IseWJBQXRCOztBZ0NvQkYsQ0F2UUQsS0F1UUU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaEN0QkEsc0JBQXNCLHVmQUF0Qjs7QWdDeUJGLENBNVFELEtBNFFFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDM0JBLHNCQUFzQiw2Z0JBQXRCOztBZ0MrQkYsQ0FsUkQsS0FrUkU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaENqQ0Esc0JBQXNCLDBwQkFBdEI7O0FnQ3FDRixDQXhSRCxLQXdSRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQ3ZDQSxzQkFBc0IsK3pCQUF0Qjs7QWdDMkNGLENBOVJELEtBOFJFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDN0NBLHNCQUFzQixtckJBQXRCOztBZ0NpREYsQ0FwU0QsS0FvU0U7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaENuREEsc0JBQXNCLDZoQkFBdEI7O0FnQ3VERixDQTFTRCxLQTBTRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQ3pEQSxzQkFBc0IsK3pCQUF0Qjs7QWdDNkRGLENBaFRELEtBZ1RFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDL0RBLHNCQUFzQiw4aEJBQXRCOztBZ0NtRUYsQ0F0VEQsS0FzVEU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaENyRUEsc0JBQXNCLHVvQkFBdEI7O0FnQ3lFRixDQTVURCxLQTRURTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQzNFQSxzQkFBc0IsOHBCQUF0Qjs7QWdDaUZGLENBcFVELEtBb1VFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDbkZBLHNCQUFzQiw4aUhBQXRCOztBZ0NzRkYsQ0F6VUQsS0F5VUU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaEN4RkEsc0JBQXNCLDAyREFBdEI7O0FnQ2dHQSxPQURGLEVBQUMsS0FDRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQ2xHRixzQkFBc0IsZ2RBQXRCOztBZ0NxR0EsT0FORixFQUFDLEtBTUU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaEN2R0Ysc0JBQXNCLGlkQUF0Qjs7QWdDMEdBLE9BWEYsRUFBQyxLQVdFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDNUdGLHNCQUFzQixvcEJBQXRCOztBZ0MrR0EsT0FoQkYsRUFBQyxLQWdCRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQ2pIRixzQkFBc0IseVlBQXRCOztBZ0NvSEEsT0FyQkYsRUFBQyxLQXFCRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQ3RIRixzQkFBc0IsNFdBQXRCOztBZ0N5SEEsT0ExQkYsRUFBQyxLQTBCRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQzNIRixzQkFBc0Isc2pCQUF0Qjs7QWdDOEhBLE9BL0JGLEVBQUMsS0ErQkU7RUFDQyxXQUFBO0VBQ0EsWUFBQTtFaENoSUYsc0JBQXNCLGdsQ0FBdEI7O0FnQ21JQSxPQXBDRixFQUFDLEtBb0NFO0VBQ0MsV0FBQTtFQUNBLFlBQUE7RWhDcklGLHNCQUFzQixvaERBQXRCOztBZ0N3SUEsT0F6Q0YsRUFBQyxLQXlDRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQzFJRixzQkFBc0IsOGFBQXRCOztBZ0M2SUEsT0E5Q0YsRUFBQyxLQThDRTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQy9JRixzQkFBc0IsOGFBQXRCOztBZ0NrSkEsT0FuREYsRUFBQyxLQW1ERTtFQUNDLFdBQUE7RUFDQSxZQUFBO0VoQ3BKRixzQkFBc0IsOGFBQXRCOztBa0N4TEo7RUFDRSxrQkFBQTtFQUNBLE9BQUE7RUFDQSxRQUFBO0VBQ0EsU0FBQTtFQUNBLFNBQUE7RUFDQSxZQUFBO0VBQ0EsZ0JBQUE7RWxDbEVFLGtDQUFBO0VBQ0EsMEJBQUE7O0FrQ3NFSjtFQUNFLHlCQUFBO0VBQ0EsaUJBQUE7O0FBR0Y7QUFBTztFQUNMLDhCQUFBO0VBQ0EseUJBQUE7RUFDQSxpQkFBQTs7QUFLRixVQUVFO0FBREYsVUFDRTtFQUNFLHNCQUFBOztBQVFBLGFBREY7QUFERixhQUNFLEtBQ0s7RUFDRCxtQkFBQTs7QUFITixhQU9FO0VBQ0UsU0FBQTtFQUNBLFlBQUE7O0FBVEosYUFPRSxHQUlFO0VBQ0UsV0FBQTtFQUNBLFlBQUE7O0FBT04sT0FDRTtFQUNFLFdBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTs7QUFKSixPQUNFLEdBS0U7RUFDRSxXQUFBO0VBQ0EsWUFBQTtFQUNBLHlCQUFBOztBQU9OLFFBRUU7QUFERixRQUNFO0VBQ0UsZ0JBQUE7O0FBSEosUUFNRTtBQUxGLFFBS0U7RUFDRSxXQUFBO0VBQ0EsWUFBQTtFQUNBLGlCQUFBO0VBQ0EseUJBQUE7O0FBQ0EsSUFBSSxjQUFlLFNBTHJCO0FBS0UsSUFBSSxjQUFlLFNBTHJCO0VBTUksMkJBQUE7O0FBRUYsSUFBSSxjQUFlLFNBUnJCO0FBUUUsSUFBSSxjQUFlLFNBUnJCO0VBU0ksNEJBQUE7O0FBZk4sUUFNRSxHQWdCRTtBQXJCSixRQUtFLEdBZ0JFO0VBQ0UsV0FBQTtFQUNBLFlBQUE7RUFDQSx5QkFBQTtFQUNBLHNCQUFBOztBQTFCTixRQU1FLEdBZ0JFLE9BTUU7QUEzQk4sUUFLRSxHQWdCRSxPQU1FO0VBQ0UsV0FBQTtFQUNBLGtCQUFBO0VBQ0Esa0JBQUE7RUFDQSxRQUFBOztBQVFSLGFBQ0U7RUFDSSxtQkFBQTs7QUFGTixhQUtFO0VBQ0UsU0FBQTtFQUNBLFlBQUE7O0FBUEosYUFLRSxHQUlFO0VBQ0UseUNBQUE7O0FBT04sWUFDRTtFQUNFLGdCQUFBO0VBQ0EsbUJBQUE7O0FBSEosWUFDRSxLQUlFO0VBQ0UsU0FBQTtFQUNBLFlBQUE7RUFDQSx5Q0FBQTtFQUNBLFdBQUE7RUFDQSxZQUFBOztBQU9OLFlBQ0U7RUFDRSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7O0FBSkosWUFDRSxHQUtFO0VBQ0UsV0FBQTtFQUNBLFlBQUE7RUFDQSx3QkFBQSIsInNvdXJjZXNDb250ZW50IjpbIkBpbWdCYXNlVXJsOiBcIi4uL2ltZ1wiO1xuaHRtbCwgYm9keSwgLmZyYW1ld29yazctcm9vdCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG59XG5ib2R5IHtcbiAgICBmb250LWZhbWlseTogUm9ib3RvLCBOb3RvLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGNvbG9yOiAjMjEyMTIxO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMS41O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlO1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5mcmFtZXdvcms3LXJvb3Qge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG4qIHtcbiAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7XG4gICAgLXdlYmtpdC10b3VjaC1jYWxsb3V0Om5vbmU7XG59XG5hLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCB7XG4gICAgb3V0bGluZTogMDtcbn1cblxuYSB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGNvbG9yOiBAdGhlbWVDb2xvcjtcbn1cbnAge1xuICAgIG1hcmdpbjogMWVtIDA7XG59IiwiLyogPT09IEdyaWQgPT09ICovXG4ucm93IHtcbiAgICAuZmxleGJveCgpO1xuICAgIC5qdXN0aWZ5LWNvbnRlbnQoc3BhY2UtYmV0d2Vlbik7XG4gICAgLmZsZXgtd3JhcCh3cmFwKTtcbiAgICAuYWxpZ24taXRlbXMoZmxleC1zdGFydCk7XG4gICAgPiBbY2xhc3MqPVwiY29sLVwiXSB7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxufVxuQGNvbHM6IDUsIDEwLCAxNSwgMjAsIDI1LCAzMCwgMTAwLzMsIDM1LCA0MCwgNDUsIDUwLCA1NSwgNjAsIDY1LCAxMDAqKDIvMyksIDcwLCA3NSwgODAsIDg1LCA5MCwgOTUsIDEwMDtcbi5yb3cge1xuICAgIC5jb2wtYXV0byB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgICAuLShAaTogbGVuZ3RoKEBjb2xzKSkgd2hlbiAoQGkgPiAwKSB7XG4gICAgICAgIEBkaXZpZGVyOiBlKGV4dHJhY3QoQGNvbHMsIEBpKSk7XG4gICAgICAgIEBjbGFzc05hbWU6IGBNYXRoLmZsb29yKEB7ZGl2aWRlcn0pYDtcbiAgICAgICAgQG46IGAxMDAvcGFyc2VGbG9hdChAe2RpdmlkZXJ9KWA7XG4gICAgICAgIEBuLTE6IEBuIC0gMTtcbiAgICAgICAgLmNvbC1Ae2NsYXNzTmFtZX0ge1xuICAgICAgICAgICAgd2lkdGg6IH5cIkB7ZGl2aWRlcn0lXCI7XG4gICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTZweCpAe24tMX0pIC8gQHtufSlcIjsgICBcbiAgICAgICAgICAgIHdpZHRoOiB+XCJjYWxjKCgxMDAlIC0gMTZweCpAe24tMX0pIC8gQHtufSlcIjsgICBcbiAgICAgICAgfVxuICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAuY29sLUB7Y2xhc3NOYW1lfSB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IH5cIkB7ZGl2aWRlcn0lXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLi0oKEBpIC0gMSkpO1xuICAgIH0gLi07XG4gICAgLi0tKEBqOiAxKSB3aGVuIChAaiA8IGxlbmd0aChAY29scykpIHtcbiAgICAgICAgQGRpdmlkZXI6IGUoZXh0cmFjdChAY29scywgQGopKTtcbiAgICAgICAgQGNsYXNzTmFtZTogYE1hdGguZmxvb3IoQHtkaXZpZGVyfSlgO1xuICAgICAgICAuY29sLWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSksIC5jb2wtYXV0bzpudGgtbGFzdC1jaGlsZChAe2p9KSB+IC5jb2wtYXV0byB7XG4gICAgICAgICAgICBAai0xOiBAaiAtIDE7ICBcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlIC8gQGo7XG4gICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTZweCpAe2otMX0pIC8gQHtqfSlcIjsgICBcbiAgICAgICAgICAgIHdpZHRoOiB+XCJjYWxjKCgxMDAlIC0gMTZweCpAe2otMX0pIC8gQHtqfSlcIjsgICBcbiAgICAgICAgfVxuICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAuY29sLWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSksIC5jb2wtYXV0bzpudGgtbGFzdC1jaGlsZChAe2p9KSB+IC5jb2wtYXV0byB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCUgLyBAajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAuLS0oKEBqICsgMSkpO1xuICAgIH0gLi0tO1xuICAgIFxufVxuXG5AbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOjc2OHB4KSB7XG4gICAgLnJvdyB7XG4gICAgICAgIC4tKEBpOiBsZW5ndGgoQGNvbHMpKSB3aGVuIChAaSA+IDApIHtcbiAgICAgICAgICAgIEBkaXZpZGVyOiBlKGV4dHJhY3QoQGNvbHMsIEBpKSk7XG4gICAgICAgICAgICBAY2xhc3NOYW1lOiBgTWF0aC5mbG9vcihAe2RpdmlkZXJ9KWA7XG4gICAgICAgICAgICBAbjogYDEwMC9wYXJzZUZsb2F0KEB7ZGl2aWRlcn0pYDtcbiAgICAgICAgICAgIEBuLTE6IEBuIC0gMTtcbiAgICAgICAgICAgIC50YWJsZXQtQHtjbGFzc05hbWV9IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiQHtkaXZpZGVyfSVcIjtcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTZweCpAe24tMX0pIC8gQHtufSlcIjsgICBcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiY2FsYygoMTAwJSAtIDE2cHgqQHtuLTF9KSAvIEB7bn0pXCI7ICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAgICAgLnRhYmxldC1Ae2NsYXNzTmFtZX0ge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogflwiQHtkaXZpZGVyfSVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAuLSgoQGkgLSAxKSk7XG4gICAgICAgIH0gLi07XG4gICAgICAgIC4tLShAajogMSkgd2hlbiAoQGogPCBsZW5ndGgoQGNvbHMpKSB7XG4gICAgICAgICAgICAudGFibGV0LWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSksIC50YWJsZXQtYXV0bzpudGgtbGFzdC1jaGlsZChAe2p9KSB+IC5jb2wtYXV0byB7XG4gICAgICAgICAgICAgICAgQGotMTogQGogLSAxOyAgXG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCUgLyBAajtcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTZweCpAe2otMX0pIC8gQHtqfSlcIjsgICBcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiY2FsYygoMTAwJSAtIDE2cHgqQHtqLTF9KSAvIEB7an0pXCI7ICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAgICAgLnRhYmxldC1hdXRvOm50aC1sYXN0LWNoaWxkKEB7an0pLCAudGFibGV0LWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSkgfiAudGFibGV0LWF1dG8ge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJSAvIEBqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC4tLSgoQGogKyAxKSk7XG4gICAgICAgIH0gLi0tO1xuICAgIH1cblxufVxuIiwiLnRyYW5zaXRpb24oQGQpIHtcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IEBkO1xuICAgIHRyYW5zaXRpb24tZHVyYXRpb246IEBkO1xufVxuLmRlbGF5KEBkKSB7XG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiBAZDtcbiAgICB0cmFuc2l0aW9uLWRlbGF5OiBAZDtcbn1cbi50cmFuc2Zvcm0oQHQpIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogQHQ7XG4gICAgdHJhbnNmb3JtOiBAdDtcbn1cbi50cmFuc2Zvcm0tb3JpZ2luKEB0bykge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogQHRvO1xuICAgIHRyYW5zZm9ybS1vcmlnaW46IEB0bztcbn1cbi50cmFuc2xhdGUzZChAeDowLCBAeTowLCBAejowKSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKEB4LEB5LEB6KTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKEB4LEB5LEB6KTtcbn1cbi5hbmltYXRpb24oQGEpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogQGE7XG4gICAgYW5pbWF0aW9uOiBAYTtcbn1cbi5zY3JvbGxhYmxlKCl7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xufVxuLmZsZXhib3goKSB7XG4gICAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gICAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gICAgZGlzcGxheTogLXdlYmtpdC1mbGV4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG4uZmxleGJveC1pbmxpbmUoKSB7XG4gICAgZGlzcGxheTogLXdlYmtpdC1pbmxpbmUtYm94O1xuICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDtcbiAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4O1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuLmZsZXgtd3JhcChAZncpIHdoZW4gKEBmdyA9IG5vd3JhcCkge1xuICAgIC13ZWJraXQtYm94LWxpbmVzOiBzaW5nbGU7XG4gICAgLW1vei1ib3gtbGluZXM6IHNpbmdsZTtcbiAgICAtd2Via2l0LWZsZXgtd3JhcDogbm93cmFwO1xuICAgIC1tcy1mbGV4LXdyYXA6IG5vbmU7XG4gICAgLW1zLWZsZXgtd3JhcDogbm93cmFwO1xuICAgIGZsZXgtd3JhcDogbm93cmFwO1xufVxuLmZsZXgtd3JhcChAZncpIHdoZW4gKEBmdyA9IHdyYXApIHtcbiAgICAtd2Via2l0LWJveC1saW5lczogbXVsdGlwbGU7XG4gICAgLW1vei1ib3gtbGluZXM6IG11bHRpcGxlO1xuICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwO1xuICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7XG4gICAgZmxleC13cmFwOiB3cmFwO1xufVxuLmZsZXgtd3JhcChAZncpIHdoZW4gbm90IChAZncgPSB3cmFwKSBhbmQgbm90IChAZncgPSBub3dyYXApIHtcbiAgICAtd2Via2l0LWZsZXgtd3JhcDogQGZ3O1xuICAgIC1tcy1mbGV4LXdyYXA6IEBmdztcbiAgICBmbGV4LXdyYXA6IEBmdztcbn1cbi5mbGV4LXNocmluayhAZnMpIHtcbiAgICAtd2Via2l0LWJveC1mbGV4OiBAZnM7XG4gICAgLXdlYmtpdC1mbGV4LXNocmluazogQGZzO1xuICAgIC1tcy1mbGV4OiAwIEBmcyBhdXRvO1xuICAgIGZsZXgtc2hyaW5rOiBAZnM7XG59XG4uanVzdGlmeS1jb250ZW50KEBqYykgd2hlbiAoQGpjID0gZmxleC1zdGFydCkge1xuICAgIC13ZWJraXQtYm94LXBhY2s6IHN0YXJ0O1xuICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0O1xuICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbn1cbi5qdXN0aWZ5LWNvbnRlbnQoQGpjKSB3aGVuIChAamMgPSBmbGV4LWVuZCkge1xuICAgIC13ZWJraXQtYm94LXBhY2s6IGVuZDtcbiAgICAtbXMtZmxleC1wYWNrOiBlbmQ7XG4gICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG59XG4uanVzdGlmeS1jb250ZW50KEBqYykgd2hlbiAoQGpjID0gc3BhY2UtYmV0d2Vlbikge1xuICAgIC13ZWJraXQtYm94LXBhY2s6IGp1c3RpZnk7XG4gICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTtcbiAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG59XG4uanVzdGlmeS1jb250ZW50KEBqYykgd2hlbiBub3QgKEBqYyA9IGZsZXgtc3RhcnQpIGFuZCBub3QgKEBqYyA9IGZsZXgtZW5kKSBhbmQgbm90IChAamMgPSBzcGFjZS1iZXR3ZWVuKSB7XG4gICAgLXdlYmtpdC1ib3gtcGFjazogQGpjO1xuICAgIC1tcy1mbGV4LXBhY2s6IEBqYztcbiAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogQGpjO1xuICAgIGp1c3RpZnktY29udGVudDogQGpjO1xufVxuLmFsaWduLWl0ZW1zKEBhaSkgd2hlbiAoQGFpID0gZmxleC1zdGFydCkge1xuICAgIC13ZWJraXQtYm94LWFsaWduOiBzdGFydDtcbiAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7XG4gICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbn1cbi5hbGlnbi1pdGVtcyhAYWkpIHdoZW4gKEBhaSA9IGZsZXgtZW5kKSB7XG4gICAgLXdlYmtpdC1ib3gtYWxpZ246IGVuZDtcbiAgICAtbXMtZmxleC1hbGlnbjogZW5kO1xuICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcbn1cbi5hbGlnbi1pdGVtcyhAYWkpIHdoZW4gbm90IChAYWkgPSBmbGV4LXN0YXJ0KSBhbmQgbm90IChAYWkgPSBmbGV4LWVuZCkge1xuICAgIC13ZWJraXQtYm94LWFsaWduOiBAYWk7XG4gICAgLW1zLWZsZXgtYWxpZ246IEBhaTtcbiAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBAYWk7XG4gICAgYWxpZ24taXRlbXM6IEBhaTtcbn1cbi5hbGlnbi1jb250ZW50KEBhaSkge1xuICAgIC1tcy1mbGV4LWxpbmUtcGFjazogQGFpO1xuICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogQGFpO1xuICAgIGFsaWduLWNvbnRlbnQ6IEBhaTtcbn1cbi5hbGlnbi1zZWxmKEBhcykge1xuICAgIC1tcy1mbGV4LWl0ZW0tYWxpZ246IEBhcztcbiAgICAtd2Via2l0LWFsaWduLXNlbGY6IEBhcztcbiAgICBhbGlnbi1zZWxmOiBAYXM7XG59XG4uY2xlYXJmaXgoKSB7XG4gICAgJjpiZWZvcmUsXG4gICAgJjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6IFwiIFwiO1xuICAgICAgICBkaXNwbGF5OiB0YWJsZTtcbiAgICB9XG4gICAgJjphZnRlciB7XG4gICAgICAgIGNsZWFyOiBib3RoO1xuICAgIH1cbn1cbi5oYWlybGluZShAcG9zaXRpb24sIEBjb2xvcikgd2hlbiAoQHBvc2l0aW9uID0gdG9wKSB7XG4gICAgJjpiZWZvcmUge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGJvdHRvbTogYXV0bztcbiAgICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICAgIGhlaWdodDogMXB4O1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgei1pbmRleDogMTU7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKDUwJSAwJSk7XG4gICAgICAgIGh0bWwucGl4ZWwtcmF0aW8tMiAme1xuICAgICAgICAgICAgLnRyYW5zZm9ybShzY2FsZVkoMC41KSk7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbC5waXhlbC1yYXRpby0zICZ7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlWSgwLjMzKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4uaGFpcmxpbmUoQHBvc2l0aW9uLCBAY29sb3IpIHdoZW4gKEBwb3NpdGlvbiA9IGxlZnQpIHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgYm90dG9tOiBhdXRvO1xuICAgICAgICByaWdodDogYXV0bztcbiAgICAgICAgd2lkdGg6IDFweDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB6LWluZGV4OiAxNTtcbiAgICAgICAgLnRyYW5zZm9ybS1vcmlnaW4oMCUgNTAlKTtcbiAgICAgICAgaHRtbC5waXhlbC1yYXRpby0yICZ7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlWCgwLjUpKTtcbiAgICAgICAgfVxuICAgICAgICBodG1sLnBpeGVsLXJhdGlvLTMgJntcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGVYKDAuMzMpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi5oYWlybGluZShAcG9zaXRpb24sIEBjb2xvcikgd2hlbiAoQHBvc2l0aW9uID0gYm90dG9tKSB7XG4gICAgJjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICAgIHRvcDogYXV0bztcbiAgICAgICAgaGVpZ2h0OiAxcHg7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB6LWluZGV4OiAxNTtcbiAgICAgICAgLnRyYW5zZm9ybS1vcmlnaW4oNTAlIDEwMCUpO1xuICAgICAgICBodG1sLnBpeGVsLXJhdGlvLTIgJntcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGVZKDAuNSkpO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwucGl4ZWwtcmF0aW8tMyAme1xuICAgICAgICAgICAgLnRyYW5zZm9ybShzY2FsZVkoMC4zMykpO1xuICAgICAgICB9XG4gICAgfVxufVxuLmhhaXJsaW5lKEBwb3NpdGlvbiwgQGNvbG9yKSB3aGVuIChAcG9zaXRpb24gPSByaWdodCkge1xuICAgICY6YWZ0ZXIge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBsZWZ0OiBhdXRvO1xuICAgICAgICBib3R0b206IGF1dG87XG4gICAgICAgIHdpZHRoOiAxcHg7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgei1pbmRleDogMTU7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKDEwMCUgNTAlKTtcbiAgICAgICAgaHRtbC5waXhlbC1yYXRpby0yICZ7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlWCgwLjUpKTtcbiAgICAgICAgfVxuICAgICAgICBodG1sLnBpeGVsLXJhdGlvLTMgJntcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGVYKDAuMzMpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIEZvciByaWdodCBhbmQgYm90dG9tXG4uaGFpcmxpbmUtcmVtb3ZlKEBwb3NpdGlvbikgd2hlbiBub3QgKEBwb3NpdGlvbiA9IGxlZnQpIGFuZCBub3QgKEBwb3NpdGlvbiA9IHRvcCkge1xuICAgICY6YWZ0ZXIge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cbi8vIEZvciBsZWZ0IGFuZCB0b3Bcbi5oYWlybGluZS1yZW1vdmUoQHBvc2l0aW9uKSB3aGVuIG5vdCAoQHBvc2l0aW9uID0gcmlnaHQpIGFuZCBub3QgKEBwb3NpdGlvbiA9IGJvdHRvbSkge1xuICAgICY6YmVmb3JlIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG59XG4vLyBGb3IgcmlnaHQgYW5kIGJvdHRvbVxuLmhhaXJsaW5lLWNvbG9yKEBwb3NpdGlvbiwgQGNvbG9yKSB3aGVuIG5vdCAoQHBvc2l0aW9uID0gbGVmdCkgYW5kIG5vdCAoQHBvc2l0aW9uID0gdG9wKSB7XG4gICAgJjphZnRlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBjb2xvcjtcbiAgICB9XG59XG4vLyBGb3IgbGVmdCBhbmQgdG9wXG4uaGFpcmxpbmUtY29sb3IoQHBvc2l0aW9uLCBAY29sb3IpIHdoZW4gbm90IChAcG9zaXRpb24gPSByaWdodCkgYW5kIG5vdCAoQHBvc2l0aW9uID0gYm90dG9tKSB7XG4gICAgJjpiZWZvcmUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgfVxufVxuXG4vLyBFbmNvZGVkIFNWRyBCYWNrZ3JvdW5kXG4uZW5jb2RlZC1zdmctYmFja2dyb3VuZChAc3ZnKSB7XG4gICAgQHVybDogYGVuY29kZVVSSUNvbXBvbmVudChAe3N2Z30pYDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCxAe3VybH1cIik7XG59XG5cbi8vIFByZXNlcnZlM0Rcbi5wcmVzZXJ2ZTNkKCkge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDtcbiAgICAtbW96LXRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgLW1zLXRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDtcbn1cblxuLy8gU2hhZG93XG4uZGVwdGgoQGxldmVsOjEpIHtcbiAgICAmIHdoZW4gKEBsZXZlbCA9IDEpIHtcbiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwwLDAsMC4xMiksIDAgMXB4IDJweCByZ2JhKDAsMCwwLDAuMjQpO1xuICAgIH1cbiAgICAmIHdoZW4gKEBsZXZlbCA9IDIpIHtcbiAgICAgICAgYm94LXNoYWRvdzogMCAzcHggNnB4IHJnYmEoMCwwLDAsMC4xNiksIDAgM3B4IDZweCByZ2JhKDAsMCwwLDAuMjMpO1xuICAgIH1cbiAgICAmIHdoZW4gKEBsZXZlbCA9IDMpIHtcbiAgICAgICAgYm94LXNoYWRvdzogMCAxMHB4IDIwcHggcmdiYSgwLDAsMCwwLjE5KSwgMCA2cHggNnB4IHJnYmEoMCwwLDAsMC4yMyk7XG4gICAgfVxuICAgICYgd2hlbiAoQGxldmVsID0gNCkge1xuICAgICAgICBib3gtc2hhZG93OiAwIDE0cHggMjhweCByZ2JhKDAsMCwwLDAuMjUpLCAwIDEwcHggMTBweCByZ2JhKDAsMCwwLDAuMjIpO1xuICAgIH1cbiAgICAmIHdoZW4gKEBsZXZlbCA9IDUpIHtcbiAgICAgICAgYm94LXNoYWRvdzogMCAxOXB4IDM4cHggcmdiYSgwLDAsMCwwLjMwKSwgMCAxNXB4IDEycHggcmdiYSgwLDAsMCwwLjIyKTtcbiAgICB9XG59XG5cbi8vIEhpZ2hsaWdodGVkIExpbmtzXG4uYWN0aXZlLWhpZ2hsaWdodChAY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwwLjE1KSkge1xuICAgICY6YmVmb3JlIHtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIHdpZHRoOiAxNTIlO1xuICAgICAgICBoZWlnaHQ6IDE1MiU7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogLTI2JTtcbiAgICAgICAgdG9wOiAtMjYlO1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LXJhZGlhbC1ncmFkaWVudChjZW50ZXIsIGNpcmNsZSBjb3ZlciwgQGNvbG9yIDY2JSwgcmdiYShyZWQoQGNvbG9yKSxncmVlbihAY29sb3IpLGJsdWUoQGNvbG9yKSwwKSA2NiUpO1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IGNlbnRlciwgQGNvbG9yIDY2JSwgcmdiYShyZWQoQGNvbG9yKSxncmVlbihAY29sb3IpLGJsdWUoQGNvbG9yKSwwKSA2NiUpO1xuICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgLnRyYW5zaXRpb24oNjAwbXMpO1xuICAgIH1cbiAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZTpiZWZvcmUsICYuYWN0aXZlLXN0YXRlOmJlZm9yZSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIC50cmFuc2l0aW9uKDE1MG1zKTtcbiAgICB9XG59XG4uYWN0aXZlLWhpZ2hsaWdodC1jb2xvcihAY29sb3IpIHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtcmFkaWFsLWdyYWRpZW50KGNlbnRlciwgY2lyY2xlIGNvdmVyLCBAY29sb3IgNjYlLCByZ2JhKHJlZChAY29sb3IpLGdyZWVuKEBjb2xvciksYmx1ZShAY29sb3IpLDApIDY2JSk7XG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgY2VudGVyLCBAY29sb3IgNjYlLCByZ2JhKHJlZChAY29sb3IpLGdyZWVuKEBjb2xvciksYmx1ZShAY29sb3IpLDApIDY2JSk7XG4gICAgfVxufVxuXG4vLyBObyBTY3JvbGxiYXJcbi5uby1zY3JvbGxiYXIoKSB7XG4gICAgJjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgIHdpZHRoOiAwICFpbXBvcnRhbnQ7XG4gICAgICAgIGhlaWdodDogMCAhaW1wb3J0YW50O1xuICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIG9wYWNpdHk6IDAgIWltcG9ydGFudDtcbiAgICB9XG59XG5cbi8vIEJhcnMgSW5wdXRcbi5iYXJzLWlucHV0KCkge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAzMnB4O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgIC1tcy1hcHBlYXJhbmNlOiBub25lO1xuICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZmZmO1xuICAgICY6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIge1xuICAgICAgICBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwxKTtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG59XG4ubm8taGFpcmxpbmVzKCkge1xuICAgICYubm8taGFpcmxpbmVzLCAmLm5vLWhhaXJsaW5lcyB1bCwgJi5uby1oYWlybGluZXMgLmNvbnRlbnQtYmxvY2staW5uZXIge1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICB9XG59XG4ubm8taGFpcmxpbmVzLWJldHdlZW4oKSB7XG4gICAgJi5uby1oYWlybGluZXMtYmV0d2VlbiB7XG4gICAgICAgIC5pdGVtLWlubmVyLCAubGlzdC1idXR0b24sIC5pdGVtLWRpdmlkZXIsIC5saXN0LWdyb3VwLXRpdGxlLCAubGlzdC1ncm91cC10aXRsZSB7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyogPT09IFZpZXdzID09PSAqL1xuLnZpZXdzLCAudmlldyB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB6LWluZGV4OiA1MDAwO1xufVxuLnZpZXdzIHtcbiAgICAuc2Nyb2xsYWJsZSgpO1xufVxuLnZpZXcge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbiIsIi8qID09PSBQYWdlcyA9PT0gKi9cblxuLy8gUGFnZXMgYW5pbWF0aW9uc1xuQHBhZ2VEdXJhdGlvbjogMzAwbXM7XG5AbmV3UGFnZU9mZnNldDogNTZweDtcblxuLnBhZ2VzIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG4ucGFnZSB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAmLmNhY2hlZCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxufVxuLnBhZ2Utb24tbGVmdCB7XG4gICAgb3BhY2l0eTogMTtcbiAgICAudHJhbnNsYXRlM2QoMCwwLDApO1xufVxuLnBhZ2Utb24tcmlnaHQge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgLnRyYW5zbGF0ZTNkKDAsIEBuZXdQYWdlT2Zmc2V0LCAwKTtcbn1cbi5wYWdlLWNvbnRlbnQge1xuICAgIC5zY3JvbGxhYmxlKCk7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDE7XG59XG5cbi8vQ2xhc3MgdGhhdCB3aWxsIHRyaWdnZXIgdHJhbnNpdGlvbiBkdXJpbmcgcGFnZSBjdXN0b20gdHJhbnNpdGlvbnMgKGxpa2Ugc3dpcGUtYmFjaylcbi5wYWdlLXRyYW5zaXRpb25pbmcge1xuICAgIC50cmFuc2l0aW9uKEBwYWdlRHVyYXRpb24pO1xufVxuLy8gRnJvbS90byBSaWdodCBUby9mcm9tIENlbnRlciBhbmltYXRpb25zXG4ucGFnZS1mcm9tLXJpZ2h0LXRvLWNlbnRlciB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgLmFuaW1hdGlvbihwYWdlRnJvbVJpZ2h0VG9DZW50ZXIgQHBhZ2VEdXJhdGlvbiBmb3J3YXJkcyk7XG59XG4ucGFnZS1mcm9tLWNlbnRlci10by1yaWdodCB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgLmFuaW1hdGlvbihwYWdlRnJvbUNlbnRlclRvUmlnaHQgQHBhZ2VEdXJhdGlvbiBmb3J3YXJkcyk7XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgcGFnZUZyb21SaWdodFRvQ2VudGVyIHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIEBuZXdQYWdlT2Zmc2V0LDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBwYWdlRnJvbVJpZ2h0VG9DZW50ZXIge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIEBuZXdQYWdlT2Zmc2V0LDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBwYWdlRnJvbUNlbnRlclRvUmlnaHQge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCBAbmV3UGFnZU9mZnNldCwwKTtcbiAgICB9XG59XG5Aa2V5ZnJhbWVzIHBhZ2VGcm9tQ2VudGVyVG9SaWdodCB7XG4gICAgZnJvbSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgQG5ld1BhZ2VPZmZzZXQsMCk7XG4gICAgfVxufVxuXG5cbi8vIEZyb20vdG8gQ2VudGVyIFRvL2Zyb20gTGVmdCBhbmltYXRpb25zXG4ucGFnZS1mcm9tLWNlbnRlci10by1sZWZ0IHtcbiAgICAuYW5pbWF0aW9uKHBhZ2VGcm9tQ2VudGVyVG9MZWZ0IEBwYWdlRHVyYXRpb24gZm9yd2FyZHMpO1xufVxuLnBhZ2UtZnJvbS1sZWZ0LXRvLWNlbnRlciB7XG4gICAgLmFuaW1hdGlvbihwYWdlRnJvbUxlZnRUb0NlbnRlciBAcGFnZUR1cmF0aW9uIGZvcndhcmRzKTtcbn1cblxuQC13ZWJraXQta2V5ZnJhbWVzIHBhZ2VGcm9tQ2VudGVyVG9MZWZ0IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcGFnZUZyb21DZW50ZXJUb0xlZnQge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIHBhZ2VGcm9tTGVmdFRvQ2VudGVyIHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcGFnZUZyb21MZWZ0VG9DZW50ZXIge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxufSIsIi8qID09PSBUb29sYmFycyA9PT0gKi9cblxuLy9Ub29sYmFyL05hdmJhclxuQHRvb2xiYXJCZyA6IEB0aGVtZUNvbG9yO1xuQHRvb2xiYXJDb2xvcjogI2ZmZjtcbkB0b29sYmFyTGlua3NDb2xvcjogI2ZmZjtcbkBuYXZiYXJTaXplOiA1NnB4O1xuQHRvb2xiYXJTaXplOiA0OHB4O1xuXG4vL1RhYiBiYXJcbkB0YWJiYXJTaXplOiA0OHB4O1xuQHRhYmJhckxhYmVsc1NpemU6IDcycHg7XG5AdGFiYmFyTGlua3NDb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjcpO1xuQHRhYmJhckFjdGl2ZUxpbmtzQ29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMSk7XG5cbi8vIFRvb2xiYXJzIGFuaW1hdGlvbnNcbkB0b29sYmFyRHVyYXRpb246IDMwMG1zO1xuXG4ubmF2YmFyLWlubmVyLCAudG9vbGJhci1pbm5lciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgLmZsZXhib3goKTtcbiAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbn1cbi5uYXZiYXItaW5uZXIge1xuICAgIC5qdXN0aWZ5LWNvbnRlbnQoZmxleC1zdGFydCk7XG59XG4udG9vbGJhci1pbm5lciB7XG4gICAgLmp1c3RpZnktY29udGVudChzcGFjZS1iZXR3ZWVuKTsgICBcbn1cbi5uYXZiYXItaW5uZXIuY2FjaGVkIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuLm5hdmJhciwgLnRvb2xiYXIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1hcmdpbjogMDtcbiAgICB6LWluZGV4OiA1MDA7XG4gICAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGNvbG9yOiBAdG9vbGJhckNvbG9yO1xuICAgIGIge1xuICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgIH1cbn1cbi5uYXZiYXIgfiAudG9vbGJhciB7XG4gICAgei1pbmRleDogNDk5O1xufVxuLm5hdmJhciwgLnRvb2xiYXIsIC5zdWJuYXZiYXIge1xuICAgIGJhY2tncm91bmQ6IEB0b29sYmFyQmc7XG4gICAgYS5saW5rIHtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGNvbG9yOiBAdG9vbGJhckxpbmtzQ29sb3I7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5qdXN0aWZ5LWNvbnRlbnQoY2VudGVyKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgIHBhZGRpbmc6IDAgMTZweDtcbiAgICAgICAgbWluLXdpZHRoOiA0OHB4O1xuICAgICAgICAuYWN0aXZlLWhpZ2hsaWdodCgpO1xuICAgICAgICBpK3NwYW4sIGkraSwgc3BhbitpLCBzcGFuK3NwYW4ge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhLmljb24tb25seSB7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDApO1xuICAgIH1cbiAgICBpLmljb24ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG59XG4ubmF2YmFyLCAuc3VibmF2YmFyIHtcbiAgICAuY2VudGVyIHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbjogMCAxNnB4O1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiBAbmF2YmFyU2l6ZTtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIH1cbiAgICAubGVmdCwgLnJpZ2h0IHtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDApO1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAuanVzdGlmeS1jb250ZW50KGZsZXgtc3RhcnQpO1xuICAgICAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG4gICAgLnJpZ2h0IHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgfVxuICAgIC5yaWdodDpmaXJzdC1jaGlsZCB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgcmlnaHQ6IDE2cHg7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG59XG4ubmF2YmFyIHtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICBoZWlnaHQ6IEBuYXZiYXJTaXplO1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICBhLmxpbmsge1xuICAgICAgICBsaW5lLWhlaWdodDogQG5hdmJhclNpemU7XG4gICAgICAgIGhlaWdodDogQG5hdmJhclNpemU7XG4gICAgfVxuICAgIC5wb3B1cCAmIHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59XG4uc3VibmF2YmFyIHtcbiAgICBoZWlnaHQ6IEB0b29sYmFyU2l6ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDEwMCU7XG4gICAgei1pbmRleDogMjA7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBwYWRkaW5nOiAwIDE2cHg7XG4gICAgLmZsZXhib3goKTtcbiAgICAuanVzdGlmeS1jb250ZW50KHNwYWNlLWJldHdlZW4pO1xuICAgIC5hbGlnbi1pdGVtcyhjZW50ZXIpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYS5saW5rIHtcbiAgICAgICAgbGluZS1oZWlnaHQ6IEB0b29sYmFyU2l6ZTtcbiAgICAgICAgaGVpZ2h0OiBAdG9vbGJhclNpemU7XG4gICAgfVxuICAgIC5jZW50ZXIge1xuICAgICAgICBsaW5lLWhlaWdodDogQHRvb2xiYXJTaXplO1xuICAgICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiA1NnB4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC5uYXZiYXIubm8tYm9yZGVyICYge1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgIH1cbiAgICAubmF2YmFyLW9uLWxlZnQgJiwgLm5hdmJhci1vbi1yaWdodCAme1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB9XG4gICAgLm5hdmJhciAmLCAucGFnZSAmIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgICAucGFnZSA+ICYge1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIG1hcmdpbi10b3A6IDA7XG4gICAgfVxuICAgID4gLmJ1dHRvbnMtcm93IHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuICAgIC5zZWFyY2hiYXIsICYuc2VhcmNoYmFyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgICAmLnNlYXJjaGJhciwgLnNlYXJjaGJhciB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB9XG4gICAgLnNlYXJjaGJhciB7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICB9XG4gICAgLmNlbnRlciB7XG5cbiAgICB9XG59XG4udG9vbGJhciB7XG4gICAgbGVmdDogMDtcbiAgICBib3R0b206IDA7XG4gICAgaGVpZ2h0OiBAdG9vbGJhclNpemU7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGEubGluayB7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiBAdG9vbGJhclNpemU7XG4gICAgICAgIGhlaWdodDogQHRvb2xiYXJTaXplO1xuICAgIH1cbiAgICBhIHtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDEpO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7XG4gICAgfVxufVxuXG4vLyBUYWJiYXJcbi50YWJiYXIge1xuICAgIHotaW5kZXg6IDUwMDE7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBib3R0b206IGF1dG87XG4gICAgdG9wOiAwO1xuICAgIC50b29sYmFyLWlubmVyIHtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICAgIH1cbiAgICBhLmxpbmsge1xuICAgICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgIH1cbiAgICBhLnRhYi1saW5rLCBhLmxpbmsge1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5qdXN0aWZ5LWNvbnRlbnQoY2VudGVyKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgICAgICAtbW96LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgfVxuICAgIGkuaWNvbiB7XG4gICAgICAgIGhlaWdodDogMjRweDtcbiAgICB9XG4gICAgYS50YWItbGluayB7XG4gICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgY29sb3I6IEB0YWJiYXJMaW5rc0NvbG9yO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICYuYWN0aXZlLCBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICAgICAgY29sb3I6IEB0YWJiYXJBY3RpdmVMaW5rc0NvbG9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC50YWItbGluay1oaWdobGlnaHQge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgaGVpZ2h0OiAzcHg7XG4gICAgICAgIGJhY2tncm91bmQ6IGRhcmtlbihAdGhlbWVDb2xvciwgMTUlKTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjUpO1xuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgfVxufVxuLnRhYmJhci1sYWJlbHMge1xuICAgIGhlaWdodDogQHRhYmJhckxhYmVsc1NpemU7XG4gICAgYS50YWItbGluaywgYS5saW5rIHtcbiAgICAgICAgcGFkZGluZy10b3A6IDEycHg7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAxMnB4O1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIC5qdXN0aWZ5LWNvbnRlbnQoc3BhY2UtYmV0d2Vlbik7XG4gICAgfVxuICAgIHNwYW4udGFiYmFyLWxhYmVsIHtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICB9XG59XG4udGFiYmFyLXNjcm9sbGFibGUge1xuICAgIC50b29sYmFyLWlubmVyIHtcbiAgICAgICAgLmp1c3RpZnktY29udGVudChmbGV4LXN0YXJ0KTtcbiAgICAgICAgLm5vLXNjcm9sbGJhcigpO1xuICAgICAgICBvdmVyZmxvdzogYXV0bztcbiAgICB9XG4gICAgYS50YWItbGluaywgYS5saW5rIHtcbiAgICAgICAgd2lkdGg6IGF1dG87XG4gICAgICAgIC5mbGV4LXNocmluaygwKTtcbiAgICAgICAgLW1zLWZsZXg6IDA7XG4gICAgICAgIHBhZGRpbmc6IDAgMTZweDtcbiAgICB9XG59XG4udG9vbGJhci1ib3R0b20ge1xuICAgIGJvdHRvbTogMDtcbiAgICB0b3A6IGF1dG87XG4gICAgLnRhYi1saW5rLWhpZ2hsaWdodCB7XG4gICAgICAgIGJvdHRvbTogYXV0bztcbiAgICAgICAgdG9wOiAwO1xuICAgIH1cbn1cbi5zdWJuYXZiYXIsIC5uYXZiYXIge1xuICAgIGlucHV0W3R5cGU9XCJ0ZXh0XCJdLCBpbnB1dFt0eXBlPVwicGFzc3dvcmRcIl0sIGlucHV0W3R5cGU9XCJzZWFyY2hcIl0sIGlucHV0W3R5cGU9XCJlbWFpbFwiXSwgaW5wdXRbdHlwZT1cInRlbFwiXSwgaW5wdXRbdHlwZT1cInVybFwiXSB7XG4gICAgICAgIC5iYXJzLWlucHV0KCk7XG4gICAgfVxufSIsIi8qID09PSBSZWxhdGlvbiBiZXR3ZWVuIHRvb2xiYXIvbmF2YmFyIHR5cGVzIGFuZCBwYWdlcyA9PT0gKi9cbi5wYWdlLCAudmlldywgLnZpZXdze1xuICAgID4ubmF2YmFyLCA+LnRvb2xiYXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxufVxuLnN1Ym5hdmJhciB+IC5wYWdlLWNvbnRlbnQge1xuICAgIHBhZGRpbmctdG9wOiBAdG9vbGJhclNpemU7XG59XG4udG9vbGJhci1maXhlZCwgLnRhYmJhci1maXhlZCB7XG4gICAgLnBhZ2UtY29udGVudCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiBAdG9vbGJhclNpemU7XG4gICAgfVxufVxuLnRhYmJhci1sYWJlbHMtZml4ZWQge1xuICAgIC5wYWdlLWNvbnRlbnQge1xuICAgICAgICBwYWRkaW5nLXRvcDogQHRhYmJhckxhYmVsc1NpemU7XG4gICAgfVxufVxuXG4udG9vbGJhciB+IC5wYWdlLWNvbnRlbnQge1xuICAgIHBhZGRpbmctdG9wOiBAdG9vbGJhclNpemU7XG59XG4udGFiYmFyLWxhYmVscyB+IC5wYWdlLWNvbnRlbnQge1xuICAgIHBhZGRpbmctdG9wOiBAdGFiYmFyTGFiZWxzU2l6ZTtcbn1cbi50b29sYmFyLWJvdHRvbSwgLm1lc3NhZ2ViYXIge1xuICAgIH4gLnBhZ2UtY29udGVudCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAwO1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogQHRvb2xiYXJTaXplO1xuICAgIH1cbn1cbi50YWJiYXItbGFiZWxzLnRvb2xiYXItYm90dG9tIH4gLnBhZ2UtY29udGVudCB7XG4gICAgcGFkZGluZy1ib3R0b206IEB0YWJiYXJMYWJlbHNTaXplO1xufVxuLm5hdmJhci1maXhlZCB7XG4gICAgLnBhZ2UtY29udGVudCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiBAbmF2YmFyU2l6ZTtcbiAgICB9XG5cbiAgICAmLnRvb2xiYXItZml4ZWQsICYudGFiYmFyLWZpeGVkLCAudG9vbGJhci1maXhlZCwgLnRhYmJhci1maXhlZCwgLnRvb2xiYXItZml4ZWQgJiwgLnRhYmJhci1maXhlZCAmIHtcbiAgICAgICAgLnBhZ2UtY29udGVudCB7XG4gICAgICAgICAgICBwYWRkaW5nLXRvcDogQG5hdmJhclNpemUgKyBAdG9vbGJhclNpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi50YWJiYXItbGFiZWxzLWZpeGVkLCAudGFiYmFyLWxhYmVscy1maXhlZCwgLnRhYmJhci1sYWJlbHMtZml4ZWQgJiB7XG4gICAgICAgIC5wYWdlLWNvbnRlbnQge1xuICAgICAgICAgICAgcGFkZGluZy10b3A6IEBuYXZiYXJTaXplICsgQHRhYmJhckxhYmVsc1NpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnRvb2xiYXIgfiAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy10b3A6IEBuYXZiYXJTaXplICsgQHRvb2xiYXJTaXplO1xuICAgIH1cbiAgICAubWVzc2FnZWJhciB+IC5wYWdlLWNvbnRlbnQsIC50b29sYmFyLWJvdHRvbSB+IC5wYWdlLWNvbnRlbnQge1xuICAgICAgICBwYWRkaW5nLXRvcDogQG5hdmJhclNpemU7XG4gICAgfVxuXG4gICAgLnRhYmJhci1sYWJlbHMgfiAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy10b3A6IEBuYXZiYXJTaXplICsgQHRhYmJhckxhYmVsc1NpemU7XG4gICAgfVxuICAgIC50YWJiYXItbGFiZWxzLnRvb2xiYXItYm90dG9tIH4gLnBhZ2UtY29udGVudCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiBAbmF2YmFyU2l6ZTtcbiAgICB9XG5cbiAgICAud2l0aC1zdWJuYXZiYXIgLnBhZ2UtY29udGVudCwgLnBhZ2UtY29udGVudC53aXRoLXN1Ym5hdmJhciwgLnN1Ym5hdmJhciB+IC5wYWdlLWNvbnRlbnQge1xuICAgICAgICBwYWRkaW5nLXRvcDogQG5hdmJhclNpemUgKyBAdG9vbGJhclNpemU7XG4gICAgfVxuXG4gICAgLnBhZ2UgLnN1Ym5hdmJhciwgJi5wYWdlIC5zdWJuYXZiYXIge1xuICAgICAgICB0b3A6IEBuYXZiYXJTaXplO1xuICAgIH1cblxuICAgIC50b29sYmFyIHtcbiAgICAgICAgdG9wOiBAbmF2YmFyU2l6ZTtcbiAgICB9XG4gICAgLm1lc3NhZ2ViYXIsIC50b29sYmFyLWJvdHRvbSB7XG4gICAgICAgIHRvcDogYXV0bztcbiAgICB9XG59XG4vLyBQYWdlIEhpZGRlbiBOYXZiYXJcbi5uYXZiYXIge1xuICAgICYubmF2YmFyLWhpZGluZyB7XG4gICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAgICAgJiB+IC5wYWdlLWNvbnRlbnQsICYgfiAucGFnZXMsICYgfiAucGFnZSB7XG4gICAgICAgICAgICAubGlzdC1ncm91cC10aXRsZSB7XG4gICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oNDAwbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLnN1Ym5hdmJhciB7XG4gICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oNDAwbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICYgfiAuc3VibmF2YmFyLCAmIH4gLnRvb2xiYXIge1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oNDAwbXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgICYubmF2YmFyLWhpZGRlbiB7XG4gICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7XG4gICAgICAgICYgfiAucGFnZS1jb250ZW50LCAmIH4gLnBhZ2VzLCAmIH4gLnBhZ2Uge1xuICAgICAgICAgICAgLmxpc3QtZ3JvdXAtdGl0bGUge1xuICAgICAgICAgICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAgICAgICAgICAgICB0b3A6LUBuYXZiYXJTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLnN1Ym5hdmJhciB7XG4gICAgICAgICAgICAgICAgLnRyYW5zbGF0ZTNkKDAsLUBuYXZiYXJTaXplLDApO1xuICAgICAgICAgICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAmIH4gLnN1Ym5hdmJhciwgJiB+IC50b29sYmFyOm5vdCgubWVzc2FnZWJhcik6bm90KC50b29sYmFyLWJvdHRvbSkge1xuICAgICAgICAgICAgLnRyYW5zbGF0ZTNkKDAsLUBuYXZiYXJTaXplLDApO1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oNDAwbXMpO1xuICAgICAgICB9XG4gICAgfVxufVxuLnBhZ2Uubm8tbmF2YmFyIHtcbiAgICAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy10b3A6IDA7XG4gICAgfVxuICAgICYud2l0aC1zdWJuYXZiYXIgLnBhZ2UtY29udGVudCwgLndpdGgtc3VibmF2YmFyICYgLnBhZ2UtY29udGVudCwgLnBhZ2UtY29udGVudC53aXRoLXN1Ym5hdmJhciB7XG4gICAgICAgIHBhZGRpbmctdG9wOiBAdG9vbGJhclNpemU7XG4gICAgfVxufVxuLy8gUGFnZSBIaWRkZW4gVG9vbGJhclxuLnRvb2xiYXIsIC50YWJiYXIge1xuICAgICYudG9vbGJhci1oaWRpbmcsICYudGFiYmFyLWhpZGluZyB7XG4gICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG4gICAgJi50b29sYmFyLWhpZGRlbiwgJi50YWJiYXItaGlkZGVuIHtcbiAgICAgICAgLnRyYW5zaXRpb24oNDAwbXMpO1xuICAgIH1cblxuICAgICYudG9vbGJhci1oaWRkZW4sICYudGFiYmFyLWhpZGRlbiB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLC0xMDAlLDApO1xuICAgIH1cbiAgICAubmF2YmFyIH4gJi50b29sYmFyLWhpZGRlbiwgLm5hdmJhciB+ICYudGFiYmFyLWhpZGRlbiB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLC0xMDRweCwwKTtcbiAgICB9XG4gICAgLm5hdmJhciB+ICYudGFiYmFyLWxhYmVscy50b29sYmFyLWhpZGRlbiB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLC0xMjhweCwwKTtcbiAgICB9XG4gICAgJi50b29sYmFyLWhpZGRlbi5tZXNzYWdlYmFyLCAmLnRvb2xiYXItaGlkZGVuLnRvb2xiYXItYm90dG9tIHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsIDEwMCUsMCk7XG4gICAgfVxufVxuLnBhZ2Uubm8tdG9vbGJhciAucGFnZS1jb250ZW50LCAucGFnZS5uby10YWJiYXIgLnBhZ2UtY29udGVudCB7XG4gICAgcGFkZGluZy1ib3R0b206IDA7XG59XG4iLCIvKiA9PT0gU2VhcmNoIEJhciA9PT0gKi9cbkBzZWFyY2hiYXJCb3JkZXJDb2xvcjogI2I0YjRiNDtcbkBzZWFyY2hiYXJTaXplOiBAdG9vbGJhclNpemU7XG4uc2VhcmNoYmFyIHtcbiAgICBoZWlnaHQ6IEBzZWFyY2hiYXJTaXplO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJhY2tncm91bmQ6IEB0aGVtZUNvbG9yO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgcGFkZGluZzogMCAxNnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgY29sb3I6I2ZmZjtcbiAgICBhIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBjb2xvcjojZmZmO1xuICAgICAgICAuYWN0aXZlLWhpZ2hsaWdodCgpO1xuICAgIH1cbiAgICAuc2VhcmNoYmFyLWlucHV0IHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMzJweDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAuZmxleC1zaHJpbmsoMSk7XG4gICAgfVxuICAgIGlucHV0W3R5cGU9XCJzZWFyY2hcIl0ge1xuICAgICAgICAuYmFycy1pbnB1dCgpO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHBhZGRpbmc6IDAgMzZweCAwIDI0cHg7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIGNlbnRlcjtcbiAgICAgICAgb3BhY2l0eTogMC42O1xuICAgICAgICAtd2Via2l0LWJhY2tncm91bmQtc2l6ZTogMjRweCAyNHB4O1xuICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDI0cHggMjRweDtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgZmlsbD0nI0ZGRkZGRicgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyB3aWR0aD0nMjQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PHBhdGggZD0nTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6Jy8+PHBhdGggZD0nTTAgMGgyNHYyNEgweicgZmlsbD0nbm9uZScvPjwvc3ZnPlwiKTtcbiAgICAgICAgJjo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbiB7XG4gICAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6bm9uZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAuc2VhcmNoYmFyLWNsZWFyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB3aWR0aDogNTZweDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICByaWdodDogLTE2cHg7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6bm9uZTtcbiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgZmlsbD0nI2ZmZicgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyB3aWR0aD0nMjQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PHBhdGggZD0nTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnonLz48cGF0aCBkPSdNMCAwaDI0djI0SDB6JyBmaWxsPSdub25lJy8+PC9zdmc+XCIpO1xuICAgICAgICAtd2Via2l0LWJhY2tncm91bmQtc2l6ZTogMjRweCAyNHB4O1xuICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDI0cHggMjRweDtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuICAgIC5zZWFyY2hiYXItY2FuY2VsIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgJi5zZWFyY2hiYXItYWN0aXZlIHtcbiAgICAgICAgaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gICAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB9XG4gICAgICAgIC5zZWFyY2hiYXItY2xlYXIge1xuICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB9XG4gICAgfVxuICAgICYuc2VhcmNoYmFyLW5vdC1lbXB0eSB7XG4gICAgICAgIC5zZWFyY2hiYXItY2xlYXIge1xuICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB9XG4gICAgfVxufVxuLnNlYXJjaGJhci1vdmVybGF5IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHotaW5kZXg6IDEwMDtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHBvaW50ZXItZXZlbnRzOm5vbmU7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjI1KTtcbiAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAmLnNlYXJjaGJhci1vdmVybGF5LWFjdGl2ZSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIH1cbn1cbi5zZWFyY2hiYXItbm90LWZvdW5kIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuLmhpZGRlbi1ieS1zZWFyY2hiYXIsIC5saXN0LWJsb2NrIC5oaWRkZW4tYnktc2VhcmNoYmFyLCAubGlzdC1ibG9jayBsaS5oaWRkZW4tYnktc2VhcmNoYmFyIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuLnBhZ2UgPiAuc2VhcmNoYmFyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgei1pbmRleDogMjAwO1xuICAgICYgfiAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy10b3A6IEBzZWFyY2hiYXJTaXplO1xuICAgIH1cbn1cbi5uYXZiYXItZml4ZWQsIC5uYXZiYXItdGhyb3VnaCB7XG4gICAgLnBhZ2UgPiAuc2VhcmNoYmFyLCA+IC5zZWFyY2hiYXIge1xuICAgICAgICB0b3A6IEBuYXZiYXJTaXplO1xuICAgICAgICAmIH4gLnBhZ2UtY29udGVudCB7XG4gICAgICAgICAgICBwYWRkaW5nLXRvcDogQHNlYXJjaGJhclNpemUgKyBAbmF2YmFyU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKiA9PT0gTWVzc2FnZSBCYXIgPT09ICovXG4udG9vbGJhci5tZXNzYWdlYmFyIHtcbiAgICAudHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgLmhhaXJsaW5lKHRvcCwgI2QxZDFkMSk7XG4gICAgaGVpZ2h0OiA0OHB4O1xuICAgIHRvcDogYXV0bztcbiAgICBib3R0b206IDA7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dGFyZWEge1xuICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwYWRkaW5nOiAzcHggOHB4IDNweDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAyOHB4O1xuICAgICAgICBjb2xvcjogIzMzMztcbiAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMjJweDtcbiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gICAgICAgIHJlc2l6ZTpub25lO1xuICAgICAgICAuZmxleC1zaHJpbmsoMSk7XG4gICAgfVxuICAgIGEubGluayB7XG4gICAgICAgIGNvbG9yOiAjMzMzO1xuICAgICAgICAuYWxpZ24tc2VsZihmbGV4LWVuZCk7XG4gICAgICAgIGhlaWdodDogQHRvb2xiYXJTaXplO1xuICAgICAgICBsaW5lLWhlaWdodDogQHRvb2xiYXJTaXplO1xuICAgICAgICAuYWN0aXZlLWhpZ2hsaWdodC1jb2xvcihyZ2JhKDAsMCwwLDAuMSkpO1xuXG4gICAgfVxuICAgIC5saW5rIHtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDApO1xuICAgIH1cbiAgICB+IC5wYWdlLWNvbnRlbnQge1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogQHRvb2xiYXJTaXplO1xuICAgIH1cbiAgICAucGFnZS5uby10b29sYmFyICYgfi5wYWdlLWNvbnRlbnQge1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogQHRvb2xiYXJTaXplO1xuICAgIH1cbiAgICAuaGlkZGVuLXRvb2xiYXIgJiB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgICAgIC50cmFuc2l0aW9uKDBtcyk7XG4gICAgfVxufVxuIiwiLyogPT09IEljb25zID09PSAqL1xuaS5pY29uIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgYXV0bztcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBmb250LXN0eWxlOiBub3JtYWw7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC8qIE1hdGVyaWFsIEljb25zIGh0dHA6Ly9nb29nbGUuZ2l0aHViLmlvL21hdGVyaWFsLWRlc2lnbi1pY29ucy8gKi9cbiAgICAmLmljb24tYmFjayB7XG4gICAgICAgIHdpZHRoOiAyNHB4O1xuICAgICAgICBoZWlnaHQ6IDI0cHg7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0Jz48cGF0aCBkPSdNMjAgMTFINy44M2w1LjU5LTUuNTlMMTIgNGwtOCA4IDggOCAxLjQxLTEuNDFMNy44MyAxM0gyMHYtMnonIGZpbGw9JyNmZmZmZmYnLz48L3N2Zz5cIilcbiAgICB9XG4gICAgJi5pY29uLWZvcndhcmQge1xuICAgICAgICB3aWR0aDogMjRweDtcbiAgICAgICAgaGVpZ2h0OiAyNHB4O1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCc+PHBhdGggZD0nTTEyIDRsLTEuNDEgMS40MUwxNi4xNyAxMUg0djJoMTIuMTdsLTUuNTggNS41OUwxMiAyMGw4LTh6JyBmaWxsPScjZmZmZmZmJy8+PC9zdmc+XCIpO1xuICAgIH1cbiAgICAmLmljb24tYmFycyB7XG4gICAgICAgIHdpZHRoOiAyNHB4O1xuICAgICAgICBoZWlnaHQ6IDI0cHg7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0Jz48cGF0aCBkPSdNMyAxOGgxOHYtMkgzdjJ6bTAtNWgxOHYtMkgzdjJ6bTAtN3YyaDE4VjZIM3onIGZpbGw9JyNmZmZmZmYnLz48L3N2Zz5cIik7XG4gICAgfVxuICAgICYuaWNvbi1jYW1lcmEge1xuICAgICAgICB3aWR0aDogMjRweDtcbiAgICAgICAgaGVpZ2h0OiAyNHB4O1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgZmlsbD0nIzMzMycgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyB3aWR0aD0nMjQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PGNpcmNsZSBjeD0nMTInIGN5PScxMicgcj0nMy4yJy8+PHBhdGggZD0nTTkgMkw3LjE3IDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yaC0zLjE3TDE1IDJIOXptMyAxNWMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6Jy8+PHBhdGggZD0nTTAgMGgyNHYyNEgweicgZmlsbD0nbm9uZScvPjwvc3ZnPlwiKTtcbiAgICB9XG4gICAgJi5pY29uLWY3IHtcbiAgICAgICAgd2lkdGg6IDI0cHg7XG4gICAgICAgIGhlaWdodDogMjRweDtcbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiQHtpbWdCYXNlVXJsfS9pLWY3LW1hdGVyaWFsLnBuZ1wiKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIH1cbiAgICAmLmljb24tbmV4dCwgJi5pY29uLXByZXYge1xuICAgICAgICB3aWR0aDogMjRweDtcbiAgICAgICAgaGVpZ2h0OiAyNHB4O1xuICAgIH1cbiAgICAmLmljb24tbmV4dCB7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9JyNmZmZmZmYnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0Jz48cGF0aCBkPSdNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6Jy8+PHBhdGggZD0nTTAgMGgyNHYyNEgweicgZmlsbD0nbm9uZScvPjwvc3ZnPlwiKTtcbiAgICB9XG4gICAgJi5pY29uLXByZXYge1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyBmaWxsPScjZmZmZmZmJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCc+PHBhdGggZD0nTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJ6Jy8+PHBhdGggZD0nTTAgMGgyNHYyNEgweicgZmlsbD0nbm9uZScvPjwvc3ZnPlwiKTtcbiAgICB9XG4gICAgJi5pY29uLXBsdXMge1xuICAgICAgICB3aWR0aDogMjRweDtcbiAgICAgICAgaGVpZ2h0OiAyNHB4O1xuICAgICAgICBmb250LXNpemU6IDA7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyBmaWxsPScjRkZGRkZGJyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIHdpZHRoPScyNCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJz48cGF0aCBkPSdNMTkgMTNoLTZ2NmgtMnYtNkg1di0yaDZWNWgydjZoNnYyeicvPjxwYXRoIGQ9J00wIDBoMjR2MjRIMHonIGZpbGw9J25vbmUnLz48L3N2Zz5cIik7XG4gICAgfVxuICAgICYuaWNvbi1jbG9zZSB7XG4gICAgICAgIHdpZHRoOiAyNHB4O1xuICAgICAgICBoZWlnaHQ6IDI0cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMDtcbiAgICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoXCI8c3ZnIGZpbGw9JyNGRkZGRkYnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgd2lkdGg9JzI0JyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPjxwYXRoIGQ9J00xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Jy8+PHBhdGggZD0nTTAgMGgyNHYyNEgweicgZmlsbD0nbm9uZScvPjwvc3ZnPlwiKTtcbiAgICB9XG59XG4iLCIuYmFkZ2Uge1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgY29sb3I6I2ZmZjtcbiAgICBiYWNrZ3JvdW5kOiAjOGU4ZTkzO1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICBwYWRkaW5nOiAxcHggNnB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cbi5pY29uIC5iYWRnZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDEwMCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0xMHB4O1xuICAgIHRvcDogLTJweDtcbiAgICBmb250LXNpemU6IDEwcHg7XG4gICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICBwYWRkaW5nOiAxcHggNXB4O1xufSIsIi8qID09PSBDb250ZW50IEJsb2NrID09PSAqL1xuQGNvbnRlbnRCbG9ja0JvcmRlckNvbG9yOiByZ2JhKDAsMCwwLDAuMTIpO1xuLmNvbnRlbnQtYmxvY2sge1xuICAgIG1hcmdpbjogMzJweCAwO1xuICAgIHBhZGRpbmc6IDAgMTZweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC5uby1oYWlybGluZXMoKTtcbn1cbi5jb250ZW50LWJsb2NrLXRpdGxlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBtYXJnaW46IDA7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgbWFyZ2luOiAxNnB4IDE2cHggMTZweDtcbiAgICBwYWRkaW5nLXRvcDogMTZweDtcbiAgICBsaW5lLWhlaWdodDogMTZweDtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICAgIGNvbG9yOiByZ2JhKDAsMCwwLDAuNTQpO1xuICAgICsgLmxpc3QtYmxvY2ssICsgLmNvbnRlbnQtYmxvY2ssICsuY2FyZCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDBweDtcbiAgICB9XG5cbn1cbi5jb250ZW50LWJsb2NrLWlubmVyIHtcbiAgICBwYWRkaW5nOiAxNnB4IDE2cHg7XG4gICAgbWFyZ2luLWxlZnQ6IC0xNnB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAuaGFpcmxpbmUodG9wLCBAY29udGVudEJsb2NrQm9yZGVyQ29sb3IpO1xuICAgIC5oYWlybGluZShib3R0b20sIEBjb250ZW50QmxvY2tCb3JkZXJDb2xvcik7XG4gICAgPnA6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgIH1cbiAgICA+cDpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB9XG59XG4uY29udGVudC1ibG9jay5pbnNldCB7XG4gICAgbWFyZ2luLWxlZnQ6IDE2cHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAxNnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDdweDtcbiAgICAuY29udGVudC1ibG9jay1pbm5lciB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUodG9wKTtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgfVxufVxuQG1lZGlhIGFsbCBhbmQgKG1pbi13aWR0aDo3NjhweCkge1xuICAgIC5jb250ZW50LWJsb2NrLnRhYmxldC1pbnNldCB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxNnB4O1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDE2cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweFxuICAgIH1cbiAgICBcbiAgICAuY29udGVudC1ibG9jay50YWJsZXQtaW5zZXQgLmNvbnRlbnQtYmxvY2staW5uZXIge1xuICAgIFx0LmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgXHRib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgfVxufVxuIiwiLyogPT09IExpc3RzID09PSAqL1xuQGxpc3RCbG9ja0JvcmRlckNvbG9yOiByZ2JhKDAsMCwwLDAuMTIpO1xuLmxpc3QtYmxvY2sge1xuICAgIG1hcmdpbjogMzJweCAwO1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICB1bCB7XG4gICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAuaGFpcmxpbmUodG9wLCBAbGlzdEJsb2NrQm9yZGVyQ29sb3IpO1xuICAgICAgICAuaGFpcmxpbmUoYm90dG9tLCBAbGlzdEJsb2NrQm9yZGVyQ29sb3IpO1xuICAgICAgICB1bCB7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDU2cHg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAuYWxpZ24tdG9wLCAuYWxpZ24tdG9wIC5pdGVtLWNvbnRlbnQsIC5hbGlnbi10b3AgLml0ZW0taW5uZXIge1xuICAgICAgICAuYWxpZ24taXRlbXMoZmxleC1zdGFydCk7XG4gICAgfVxuICAgIFxuICAgIC5pbnNldCgpIHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMTZweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgICAuY29udGVudC1ibG9jay10aXRsZSB7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICAgICAgfVxuICAgICAgICB1bCB7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgbGk6Zmlyc3QtY2hpbGQgPiBhe1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGk6bGFzdC1jaGlsZCA+IGF7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgNHB4IDRweDtcbiAgICAgICAgfVxuICAgICAgICBsaTpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkID4gYSB7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5pbnNldCB7XG4gICAgICAgIC5pbnNldCgpXG4gICAgfVxuICAgICYudGFibGV0LWluc2V0IHtcbiAgICAgICAgQG1lZGlhIGFsbCBhbmQgKG1pbi13aWR0aDo3NjhweCkge1xuICAgICAgICAgICAgLmluc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMaXN0IGl0ZW1zXG4gICAgbGkge1xuICAgICAgICBib3gtc2l6aW5nOmJvcmRlci1ib3g7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG4gICAgXG4gICAgLml0ZW0tbWVkaWEge1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAuZmxleC1zaHJpbmsoMCk7XG4gICAgICAgIC5mbGV4LXdyYXAobm93cmFwKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgIGJveC1zaXppbmc6Ym9yZGVyLWJveDtcbiAgICAgICAgcGFkZGluZy10b3A6IDhweDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgICAgICAgbWluLXdpZHRoOiA0MHB4O1xuICAgICAgICBpICsgaSB7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgICAgICB9XG4gICAgICAgIGkgKyBpbWcge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAuaXRlbS1tZWRpYSArIC5pdGVtLWlubmVyIHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7XG4gICAgfVxuICAgIC5pdGVtLWlubmVyIHtcbiAgICAgICAgcGFkZGluZy1yaWdodDogMTZweDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAuaGFpcmxpbmUoYm90dG9tLCBAbGlzdEJsb2NrQm9yZGVyQ29sb3IpO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgcGFkZGluZy10b3A6IDhweDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgICAgICAgbWluLWhlaWdodDogNDhweDtcbiAgICAgICAgYm94LXNpemluZzpib3JkZXItYm94O1xuICAgICAgICAtd2Via2l0LWJveC1mbGV4OjE7XG4gICAgICAgIC1tcy1mbGV4OjE7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgICAgLmZsZXhib3goKTtcbiAgICAgICAgLmp1c3RpZnktY29udGVudChzcGFjZS1iZXR3ZWVuKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgIC5hbGlnbi1zZWxmKHN0cmV0Y2gpO1xuICAgIH1cbiAgICAuaXRlbS10aXRsZSB7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDEpO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLml0ZW0tYWZ0ZXIge1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICBjb2xvcjogIzc1NzU3NTtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDApO1xuICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICBtYXgtaGVpZ2h0OiAyOHB4O1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgfVxuICAgIC5zbWFydC1zZWxlY3QgLml0ZW0tYWZ0ZXIsIC5hdXRvY29tcGxldGUtb3BlbmVyIC5pdGVtLWFmdGVyIHtcbiAgICAgICAgbWF4LXdpZHRoOiA3MCU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAuaXRlbS1saW5rIHtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgei1pbmRleDogMDtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgcGFkZGluZy1yaWdodDogNDJweDtcbiAgICAgICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB2aWV3Qm94PScwIDAgNjAgMTIwJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPjxwYXRoIGQ9J202MCA2MS41LTM4LjI1IDM4LjI1LTkuNzUtOS43NSAyOS4yNS0yOC41LTI5LjI1LTI4LjUgOS43NS05Ljc1eicgZmlsbD0nI2M3YzdjYycvPjwvc3ZnPlwiKTtcbiAgICAgICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTBweCAyMHB4O1xuICAgICAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDk1JSBjZW50ZXI7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtd2Via2l0LWNhbGMoflwiMTAwJSAtIDE2cHhcIikgY2VudGVyO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2FsYyh+XCIxMDAlIC0gMTZweFwiKSBjZW50ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbDpub3QoLndhdGNoLWFjdGl2ZS1zdGF0ZSkgJjphY3RpdmUsICYuYWN0aXZlLXN0YXRlIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsMC4xKTtcbiAgICAgICAgfVxuICAgICAgICAmLmxpc3QtYnV0dG9uIHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDAgMTZweDtcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDQ4cHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tY29udGVudCB7XG4gICAgICAgIGJveC1zaXppbmc6Ym9yZGVyLWJveDtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAxNnB4O1xuICAgICAgICBtaW4taGVpZ2h0OiA0OHB4O1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAuanVzdGlmeS1jb250ZW50KHNwYWNlLWJldHdlZW4pO1xuICAgICAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICB9XG4gICAgLy8gTGFiZWwgYWZ0ZXIgTGlzdCBibG9ja1xuICAgIC5saXN0LWJsb2NrLWxhYmVsIHtcbiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMzVweDtcbiAgICAgICAgcGFkZGluZzogMCAxNnB4O1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgIGNvbG9yOiByZ2JhKDAsMCwwLDAuNTQpO1xuICAgIH1cblxuICAgIC8vIFN3aXBlIG91dHNcbiAgICAuc3dpcGVvdXQge1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgICAgIHRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgfVxuICAgIC5zd2lwZW91dC5kZWxldGluZyB7XG4gICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgLnN3aXBlb3V0LWNvbnRlbnQge1xuICAgICAgICAgICAgLnRyYW5zZm9ybSh0cmFuc2xhdGVYKC0xMDAlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnN3aXBlb3V0LnRyYW5zaXRpb25pbmcge1xuICAgICAgICAuc3dpcGVvdXQtY29udGVudCwgLnN3aXBlb3V0LWFjdGlvbnMtcmlnaHQgYSwgLnN3aXBlb3V0LWFjdGlvbnMtbGVmdCBhLCAuc3dpcGVvdXQtb3ZlcnN3aXBlIHtcbiAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogMzAwbXM7XG4gICAgICAgICAgICB0cmFuc2l0aW9uOiAzMDBtcztcbiAgICAgICAgfSAgICBcbiAgICB9XG4gICAgLnN3aXBlb3V0LWNvbnRlbnQge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgIH1cbiAgICAuc3dpcGVvdXQtb3ZlcnN3aXBlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAyMDBtcyBsZWZ0O1xuICAgICAgICB0cmFuc2l0aW9uOiAyMDBtcyBsZWZ0O1xuICAgIH1cbiAgICAuc3dpcGVvdXQtYWN0aW9ucy1sZWZ0LCAuc3dpcGVvdXQtYWN0aW9ucy1yaWdodCB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIGEge1xuICAgICAgICAgICAgcGFkZGluZzogMCAyNHB4O1xuICAgICAgICAgICAgY29sb3I6I2ZmZjtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNjN2M3Y2M7XG4gICAgICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgICAgJjphZnRlciB7XG4gICAgICAgICAgICAgICAgY29udGVudDonJztcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgdG9wOiAwO1xuICAgICAgICAgICAgICAgIHdpZHRoOiA2MDAlO1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBpbmhlcml0O1xuICAgICAgICAgICAgICAgIHotaW5kZXg6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGEuc3dpcGVvdXQtZGVsZXRlIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IEByZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnN3aXBlb3V0LWFjdGlvbnMtcmlnaHQge1xuICAgICAgICByaWdodDogMCU7XG4gICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlWCgxMDAlKSk7XG4gICAgICAgIGE6YWZ0ZXIge1xuICAgICAgICAgICAgbGVmdDogMTAwJTtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC5zd2lwZW91dC1hY3Rpb25zLWxlZnQge1xuICAgICAgICBsZWZ0OiAwJTtcbiAgICAgICAgLnRyYW5zZm9ybSh0cmFuc2xhdGVYKC0xMDAlKSk7XG4gICAgICAgIGE6YWZ0ZXIge1xuICAgICAgICAgICAgcmlnaHQ6IDEwMCU7XG4gICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IC0xcHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tc3VidGl0bGUge1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO1xuICAgIH1cbiAgICAuaXRlbS10ZXh0IHtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBjb2xvcjogIzc1NzU3NTtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgbWF4LWhlaWdodDogNDBweDtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzplbGxpcHNpcztcbiAgICAgICAgLXdlYmtpdC1saW5lLWNsYW1wOiAyO1xuICAgICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgICB9XG4gICAgJi5tZWRpYS1saXN0LCBsaS5tZWRpYS1pdGVtIHtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICBwYWRkaW5nLXRvcDogMTRweDtcbiAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAxNHB4O1xuICAgICAgICAgICAgLmFsaWduLXNlbGYoc3RyZXRjaCk7XG4gICAgICAgIH1cbiAgICAgICAgLml0ZW0tbGluayAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMTZweDtcbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1saW5rIC5pdGVtLXRpdGxlLXJvdyB7XG4gICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyNnB4O1xuICAgICAgICAgICAgYmFja2dyb3VuZDogbm8tcmVwZWF0IHJpZ2h0IHRvcDtcbiAgICAgICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB2aWV3Qm94PScwIDAgNjAgMTIwJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPjxwYXRoIGQ9J202MCA2MS41LTM4LjI1IDM4LjI1LTkuNzUtOS43NSAyOS4yNS0yOC41LTI5LjI1LTI4LjUgOS43NS05Ljc1eicgZmlsbD0nI2M3YzdjYycvPjwvc3ZnPlwiKTtcbiAgICAgICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTBweCAyMHB4O1xuICAgICAgICB9XG4gICAgICAgIC5pdGVtLW1lZGlhIHtcbiAgICAgICAgICAgIHBhZGRpbmctdG9wOiAxNHB4O1xuICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDE0cHg7XG4gICAgICAgICAgICAuYWxpZ24tc2VsZihmbGV4LXN0YXJ0KTtcbiAgICAgICAgICAgIGltZyB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLml0ZW0tdGl0bGUtcm93IHtcbiAgICAgICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgICAgICAuanVzdGlmeS1jb250ZW50KHNwYWNlLWJldHdlZW4pO1xuICAgICAgICB9XG4gICAgICAgIC5pdGVtLWNvbnRlbnQgPiAuaXRlbS1hZnRlciB7XG4gICAgICAgICAgICBwYWRkaW5nLXRvcDogMTRweDtcbiAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAxNHB4O1xuICAgICAgICAgICAgLmFsaWduLXNlbGYoZmxleC1zdGFydCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmxpc3QtZ3JvdXAge1xuICAgICAgICB1bCB7XG4gICAgICAgICAgICAmOmFmdGVyLCAmOmJlZm9yZSB7XG4gICAgICAgICAgICAgICAgei1pbmRleDogMTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgKyAubGlzdC1ncm91cCB1bCB7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7ICAgXG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tZGl2aWRlciwgLmxpc3QtZ3JvdXAtdGl0bGUge1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZjRmNGY0O1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgICAgIHBhZGRpbmc6IDBweCAxNnB4O1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIGNvbG9yOiByZ2JhKDAsMCwwLDAuNTQpO1xuICAgICAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiA0OHB4O1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgfVxuICAgIC5saXN0LWdyb3VwLXRpdGxlIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7XG4gICAgICAgIHBvc2l0aW9uOiAtbW96LXN0aWNreTtcbiAgICAgICAgcG9zaXRpb246IHN0aWNreTtcbiAgICAgICAgdG9wOiAwcHg7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgIH1cbiAgICAvLyBTb3J0YWJsZVxuICAgIC5zb3J0YWJsZS1oYW5kbGVyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBib3R0b206IDFweDtcbiAgICAgICAgei1pbmRleDogMTA7XG4gICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICAgIGJhY2tncm91bmQtc2l6ZTogMThweCAxMnB4O1xuICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgICAgIHdpZHRoOiA1MHB4O1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMTggMTInIGZpbGw9JyNjN2M3Y2MnPjxwYXRoIGQ9J00wLDJWMGgyMnYySDB6Jy8+PHBhdGggZD0nTTAsN1Y1aDIydjJIMHonLz48cGF0aCBkPSdNMCwxMnYtMmgyMnYySDB6Jy8+PC9zdmc+XCIpO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgIH1cbiAgICAmLnNvcnRhYmxlIHtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpOyAgICAgICBcbiAgICAgICAgfVxuICAgIH1cbiAgICAmLnNvcnRhYmxlLW9wZW5lZCB7XG4gICAgICAgIC5zb3J0YWJsZS1oYW5kbGVyIHtcbiAgICAgICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB9XG4gICAgICAgIC5pdGVtLWlubmVyLCAuaXRlbS1saW5rIC5pdGVtLWlubmVyIHtcbiAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHggKyAxOHB4ICsgMTZweDtcbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1saW5rIC5pdGVtLWlubmVyLCAuaXRlbS1saW5rIC5pdGVtLXRpdGxlLXJvdyB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgICAgICB9XG4gICAgfVxuICAgICYuc29ydGFibGUtc29ydGluZyB7XG4gICAgICAgIGxpIHtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsaS5zb3J0aW5nIHtcbiAgICAgICAgei1pbmRleDogNTA7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC44KTtcbiAgICAgICAgLmRlcHRoKDIpO1xuICAgICAgICAudHJhbnNpdGlvbigwbXMpO1xuICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMYXN0LWNoaWxkc1xuICAgIGxpIHtcbiAgICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgICAgIC5saXN0LWJ1dHRvbiB7XG4gICAgICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICY6bGFzdC1jaGlsZCwgJjpsYXN0LWNoaWxkIGxpOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsaTpsYXN0LWNoaWxkLCAmOmxhc3QtY2hpbGQgbGkge1xuICAgICAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgICAgIC5oYWlybGluZShib3R0b20sIEBsaXN0QmxvY2tCb3JkZXJDb2xvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAubm8taGFpcmxpbmVzKCk7XG4gICAgLm5vLWhhaXJsaW5lcy1iZXR3ZWVuKClcbn1cbiIsIi8qID09PSBGb3JtcyA9PT0gKi9cbi8vIElucHV0c1xuLmxpc3QtYmxvY2sge1xuICAgIGlucHV0W3R5cGU9XCJ0ZXh0XCJdLCBpbnB1dFt0eXBlPVwicGFzc3dvcmRcIl0sIGlucHV0W3R5cGU9XCJzZWFyY2hcIl0sIGlucHV0W3R5cGU9XCJlbWFpbFwiXSwgaW5wdXRbdHlwZT1cInRlbFwiXSwgaW5wdXRbdHlwZT1cInVybFwiXSwgaW5wdXRbdHlwZT1cImRhdGVcIl0sIGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSwgaW5wdXRbdHlwZT1cInRpbWVcIl0sIGlucHV0W3R5cGU9XCJudW1iZXJcIl0sIHNlbGVjdCwgdGV4dGFyZWEge1xuICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGJveC1zaXppbmc6Ym9yZGVyLWJveDtcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgMCAwO1xuICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAzNnB4O1xuICAgICAgICBjb2xvcjogIzIxMjEyMTtcbiAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICAgICAgJjo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgICAgICAgIGNvbG9yOiByZ2JhKDAsMCwwLDAuMzUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5sYWJlbCwgLmZsb2F0aW5nLWxhYmVsIHtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgICAgY29sb3I6cmdiYSgwLDAsMCwwLjY1KTtcbiAgICAgICAgLnRyYW5zaXRpb24oMjAwbXMpO1xuICAgICAgICB3aWR0aDogMzUlO1xuICAgICAgICAuZmxleC1zaHJpbmsoMCk7XG4gICAgfVxuICAgIFxuICAgIGlucHV0W3R5cGU9XCJkYXRlXCJdLCBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0ge1xuICAgICAgICBsaW5lLWhlaWdodDogNDRweDtcbiAgICB9XG4gICAgc2VsZWN0IHtcbiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tcy1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgIH1cbiAgICB0ZXh0YXJlYSB7XG4gICAgICAgIHJlc2l6ZTpub25lO1xuICAgICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgICAgICBwYWRkaW5nLXRvcDogOHB4O1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogN3B4O1xuICAgICAgICBoZWlnaHQ6IDEwMHB4O1xuICAgICAgICAmLnJlc2l6YWJsZSB7XG4gICAgICAgICAgICBoZWlnaHQ6IDM2cHg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAuaXRlbS1pbnB1dCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAtbXMtZmxleDoxO1xuICAgICAgICAuZmxleC1zaHJpbmsoMSk7XG4gICAgICAgIGZvbnQtc2l6ZTogMDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDM2cHg7XG4gICAgfVxuXG4gICAgLy8gSW5wdXRzIExpc3RcbiAgICAuaW5wdXQtaXRlbSwgJi5pbnB1dHMtbGlzdCB7XG4gICAgICAgIHVsIHtcbiAgICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1tZWRpYSB7XG4gICAgICAgICAgICAuYWxpZ24tc2VsZihmbGV4LWVuZCk7XG4gICAgICAgICAgICBtaW4taGVpZ2h0OiAzNnB4O1xuICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAwO1xuICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICB9XG4gICAgICAgIC5sYWJlbCwgLmZsb2F0aW5nLWxhYmVsIHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICB9XG4gICAgICAgIC5mbG9hdGluZy1sYWJlbCB7XG4gICAgICAgICAgICAudHJhbnNmb3JtLW9yaWdpbihsZWZ0KTtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGUoMTYvMTIpIHRyYW5zbGF0ZVkoMjFweCkpO1xuICAgICAgICAgICAgY29sb3I6IHJnYmEoMCwwLDAsMC4zNSk7XG4gICAgICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgICAgICAgIG1heC13aWR0aDogNzUlO1xuICAgICAgICAgICAgfi5pdGVtLWlucHV0IGlucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgICAgICAgICAgICAgIGNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAuZm9jdXMtc3RhdGUsIC5ub3QtZW1wdHktc3RhdGUge1xuICAgICAgICAuZmxvYXRpbmctbGFiZWwge1xuICAgICAgICAgICAgY29sb3I6cmdiYSgwLDAsMCwwLjY1KTtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGUoMSkgdHJhbnNsYXRlWSgwKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmZvY3VzLXN0YXRlIHtcbiAgICAgICAgLmxhYmVsLCAuZmxvYXRpbmctbGFiZWwge1xuICAgICAgICAgICAgY29sb3I6IEB0aGVtZUNvbG9yO1xuICAgICAgICB9XG4gICAgfVxufVxuLml0ZW0taW5wdXQtZmllbGQsIC5pbnB1dC1maWVsZCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC5oYWlybGluZShib3R0b20sIHJnYmEoMCwgMCwgMCwgMC4xMikpO1xuICAgICY6YWZ0ZXIge1xuICAgICAgICAudHJhbnNpdGlvbigyMDBtcyk7XG4gICAgfVxuICAgICYuZm9jdXMtc3RhdGU6YWZ0ZXIsICYubm90LWVtcHR5LXN0YXRlOmFmdGVyLCAuZm9jdXMtc3RhdGUgJjphZnRlciwgLm5vdC1lbXB0eS1zdGF0ZSAmOmFmdGVye1xuICAgICAgICBiYWNrZ3JvdW5kOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgLnRyYW5zZm9ybShzY2FsZVkoMikpICFpbXBvcnRhbnQ7XG4gICAgfVxufVxudGV4dGFyZWEucmVzaXphYmxlIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLy9Td2l0Y2hcbi5sYWJlbC1zd2l0Y2gge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIHdpZHRoOiAzNnB4O1xuICAgIGhlaWdodDogMTRweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIC5hbGlnbi1zZWxmKGNlbnRlcik7XG4gICAgLmNoZWNrYm94IHtcbiAgICAgICAgd2lkdGg6IDM2cHg7IFxuICAgICAgICBib3JkZXItcmFkaXVzOiAzNnB4O1xuICAgICAgICBib3gtc2l6aW5nOmJvcmRlci1ib3g7XG4gICAgICAgIGhlaWdodDogMTRweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2IwYWZhZjtcbiAgICAgICAgei1pbmRleDogMDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGJvcmRlcjpub25lO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICAmOmFmdGVyIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6JyAnO1xuICAgICAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAyMHB4O1xuICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIHotaW5kZXg6IDI7XG4gICAgICAgICAgICB0b3A6IC0zcHg7XG4gICAgICAgICAgICBsZWZ0OiAwcHg7XG4gICAgICAgICAgICBib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLDAsMCwwLjQpO1xuICAgICAgICAgICAgLnRyYW5zZm9ybSh0cmFuc2xhdGVYKDBweCkpO1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgICY6Y2hlY2tlZCB7XG4gICAgICAgICAgICAmKyAuY2hlY2tib3gge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEocmVkKEB0aGVtZUNvbG9yKSwgZ3JlZW4oQHRoZW1lQ29sb3IpLCBibHVlKEB0aGVtZUNvbG9yKSwgMC41KTtcbiAgICAgICAgICAgICAgICAmOmFmdGVyIHtcbiAgICAgICAgICAgICAgICAgICAgLnRyYW5zZm9ybSh0cmFuc2xhdGVYKDE2cHgpKTtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogQHRoZW1lQ29sb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC5pdGVtLWlucHV0ICYge1xuICAgICAgICB0b3A6ICgzNnB4IC0gMTRweCkgLyAyO1xuICAgIH1cbn1cblxuLy9CdXR0b25zXG4uYnV0dG9uIHtcbiAgICBjb2xvcjpAdGhlbWVDb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBsaW5lLWhlaWdodDogMzZweDtcbiAgICBib3gtc2l6aW5nOmJvcmRlci1ib3g7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTtcbiAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgcGFkZGluZzogMCAxMHB4O1xuICAgIG1hcmdpbjogMDtcbiAgICBoZWlnaHQ6IDM2cHg7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBtaW4td2lkdGg6IDY0cHg7XG4gICAgcGFkZGluZzogMCA4cHg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgb3V0bGluZTogMDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSYsIGlucHV0W3R5cGU9XCJidXR0b25cIl0me1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gICAgaHRtbDpub3QoLndhdGNoLWFjdGl2ZS1zdGF0ZSkgJjphY3RpdmUsICYuYWN0aXZlLXN0YXRlIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjEpO1xuICAgIH1cbiAgICAmLmJ1dHRvbi1maWxsIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHRoZW1lQ29sb3I7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICAgICAgYmFja2dyb3VuZDogZGFya2VuKEB0aGVtZUNvbG9yLCA4JSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5idXR0b24tYmlnIHtcbiAgICAgICAgaGVpZ2h0OiA0OHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogNDhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIH1cblxuICAgIGkuaWNvbiArIHNwYW4sXG4gICAgc3Bhbjpub3QoLnJpcHBsZS13YXZlKSArIHNwYW4sXG4gICAgc3Bhbjpub3QoLnJpcHBsZS13YXZlKSArIGkuaWNvbixcbiAgICBpLmljb24gKyBpLmljb24ge1xuICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgIH1cblxuICAgIC5uYXZiYXIgJiwgLnRvb2xiYXIgJiwgLnN1Ym5hdmJhciAmLCAubm90aWZpY2F0aW9ucyAmIHtcbiAgICAgICAgJjpub3QoLmJ1dHRvbi1maWxsKSB7XG4gICAgICAgICAgICBjb2xvcjojZmZmO1xuICAgICAgICAgICAgaHRtbDpub3QoLndhdGNoLWFjdGl2ZS1zdGF0ZSkgJjphY3RpdmUsICYuYWN0aXZlLXN0YXRlIHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMTUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLmJ1dHRvbi1yYWlzZWQge1xuICAgIC5kZXB0aCgxKTtcbiAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICAuZGVwdGgoMik7XG4gICAgfVxufVxuLmJ1dHRvbnMtcm93IHtcbiAgICAuYWxpZ24tc2VsZihjZW50ZXIpO1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmZsZXgtd3JhcChub3dyYXApO1xuICAgIC5idXR0b24ge1xuICAgICAgICBtYXJnaW4tbGVmdDogMTZweDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIC13ZWJraXQtYm94LWZsZXg6MTtcbiAgICAgICAgLW1zLWZsZXg6MTtcbiAgICB9XG4gICAgLmJ1dHRvbjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIH1cbn1cblxuXG4vLyBTbGlkZXJcbi5yYW5nZS1zbGlkZXIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC5hbGlnbi1zZWxmKGNlbnRlcik7XG4gICAgaW5wdXRbdHlwZT1cInJhbmdlXCJdIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDUwJSAwLCA1MCUgMTAwJSwgY29sb3Itc3RvcCgwLCAjYjliOWI5KSwgY29sb3Itc3RvcCgxMDAlLCAjYjliOWI5KSk7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgI2I5YjliOSAwLCAjYjliOWI5IDEwMCUpO1xuICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAycHg7XG4gICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICAgIG91dGxpbmU6IDA7XG4gICAgICAgIC1tcy1iYWNrZ3JvdW5kLXBvc2l0aW9uLXk6IDUwMHB4O1xuICAgICAgICAmOmZvY3VzLCAmOmFjdGl2ZSB7XG4gICAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgICAgICBvdXRsaW5lOiAwIG5vbmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gUmFuZ2UgdGh1bWIgbWl4aW5cbiAgICAucmFuZ2UtdGh1bWIoKSB7XG4gICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBvdXRsaW5lOiAwO1xuICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgIHdpZHRoOiAyMHB4O1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGJhY2tncm91bmQ6IEB0aGVtZUNvbG9yO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAyMHB4O1xuICAgIH1cblxuICAgIC8vID09PT09PT0gV2Via2l0ID09PT09PT09XG4gICAgaW5wdXRbdHlwZT1cInJhbmdlXCJdOjotd2Via2l0LXNsaWRlci10aHVtYiB7XG4gICAgICAgIC5yYW5nZS10aHVtYigpO1xuICAgIH1cblxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LXdlYmtpdC1zbGlkZXItdGh1bWI6YmVmb3JlIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDUwJTtcbiAgICAgICAgcmlnaHQ6IDEwMCU7XG4gICAgICAgIHdpZHRoOiAyMDAwcHg7XG4gICAgICAgIGhlaWdodDogMnB4O1xuICAgICAgICBtYXJnaW4tdG9wOiAtMXB4O1xuICAgICAgICB6LWluZGV4OiAxO1xuICAgICAgICBiYWNrZ3JvdW5kOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgY29udGVudDogJyAnO1xuICAgIH1cblxuICAgIC8vID09PT09PT0gRmlyZUZveCA9PT09PT09PVxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LW1vei1yYW5nZS10cmFjayB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDJweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2I3YjhiNztcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBvdXRsaW5lOiAwO1xuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwicmFuZ2VcIl06Oi1tb3otcmFuZ2UtdGh1bWIge1xuICAgICAgICAucmFuZ2UtdGh1bWIoKTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09IElFID09PT09PT09XG4gICAgaW5wdXRbdHlwZT1cInJhbmdlXCJdOjotbXMtdHJhY2sge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAycHg7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICB9XG4gICAgaW5wdXRbdHlwZT1cInJhbmdlXCJdOjotbXMtdGh1bWIge1xuICAgICAgICAucmFuZ2UtdGh1bWIoKTtcbiAgICB9XG5cbiAgICBpbnB1dFt0eXBlPVwicmFuZ2VcIl06Oi1tcy1maWxsLWxvd2VyIHtcbiAgICAgICAgYmFja2dyb3VuZDogQHRoZW1lQ29sb3I7XG4gICAgfVxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LW1zLWZpbGwtdXBwZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiAjYjdiOGI3O1xuICAgIH1cblxuICAgIC5pdGVtLWlucHV0ICYge1xuICAgICAgICB0b3A6ICgzNnB4IC0gMjBweCkgLyAyO1xuICAgIH1cbn1cblxuLy8gQ2hlY2tib3hlc1xubGFiZWwubGFiZWwtY2hlY2tib3gge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBpLmljb24tZm9ybS1jaGVja2JveCB7XG4gICAgICAgIHdpZHRoOiAxOHB4O1xuICAgICAgICBoZWlnaHQ6IDE4cHg7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAjNmQ2ZDZkO1xuICAgICAgICBib3gtc2l6aW5nOmJvcmRlci1ib3g7XG4gICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgICY6YWZ0ZXIge1xuICAgICAgICAgICAgY29udGVudDonICc7XG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICB3aWR0aDogMThweDtcbiAgICAgICAgICAgIGhlaWdodDogMThweDtcbiAgICAgICAgICAgIGxlZnQ6IC0ycHg7XG4gICAgICAgICAgICB0b3A6IC0ycHg7XG4gICAgICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAgICAgYmFja2dyb3VuZDogbm8tcmVwZWF0IGNlbnRlcjtcbiAgICAgICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9JyNmZmZmZmYnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0Jz48cGF0aCBkPSdNOSAxNi4xN0w0LjgzIDEybC0xLjQyIDEuNDFMOSAxOSAyMSA3bC0xLjQxLTEuNDF6Jy8+PC9zdmc+XCIpO1xuICAgICAgICAgICAgLXdlYmtpdC1iYWNrZ3JvdW5kLXNpemU6IDEwMCUgYXV0bztcbiAgICAgICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSBhdXRvO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSwgaW5wdXRbdHlwZT1cInJhZGlvXCJdIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgJjpjaGVja2VkICsgLml0ZW0tbWVkaWEsICY6Y2hlY2tlZCB+IC5pdGVtLWFmdGVyLCAmOmNoZWNrZWQgfiAuaXRlbS1pbm5lcntcbiAgICAgICAgICAgIGkuaWNvbi1mb3JtLWNoZWNrYm94IHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IEB0aGVtZUNvbG9yO1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB0aGVtZUNvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaS5pY29uLWZvcm0tY2hlY2tib3g6YWZ0ZXIge1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5sYWJlbC5sYWJlbC1yYWRpbyB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGkuaWNvbi1mb3JtLXJhZGlvIHtcbiAgICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICAgIGhlaWdodDogMjBweDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAyMHB4O1xuICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAjNmQ2ZDZkO1xuICAgICAgICBib3gtc2l6aW5nOmJvcmRlci1ib3g7XG4gICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgJjphZnRlciB7XG4gICAgICAgICAgICBjb250ZW50OicgJztcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIHdpZHRoOiAxMHB4O1xuICAgICAgICAgICAgaGVpZ2h0OiAxMHB4O1xuICAgICAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogLTVweDtcbiAgICAgICAgICAgIG1hcmdpbi10b3A6IC01cHg7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlKDApKTtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0sIGlucHV0W3R5cGU9XCJyYWRpb1wiXSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgICY6Y2hlY2tlZCArIC5pdGVtLW1lZGlhLCAmOmNoZWNrZWQgfiAuaXRlbS1hZnRlciwgJjpjaGVja2VkIH4gLml0ZW0taW5uZXJ7XG4gICAgICAgICAgICBpLmljb24tZm9ybS1yYWRpbyB7XG4gICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkuaWNvbi1mb3JtLXJhZGlvOmFmdGVyIHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlKDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmxhYmVsLmxhYmVsLWNoZWNrYm94LCBsYWJlbC5sYWJlbC1yYWRpbyB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgei1pbmRleDogMDtcbiAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgLml0ZW0tYWZ0ZXIge1xuICAgICAgICBpLmljb24tZm9ybS1jaGVja2JveCwgaS5pY29uLWZvcm0tcmFkaW8ge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMTZweDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAubWVkaWEtbGlzdCAmLCAubWVkaWEtaXRlbSAmIHtcbiAgICAgICAgLml0ZW0tbWVkaWEge1xuICAgICAgICAgICAgaS5pY29uLWZvcm0tY2hlY2tib3gsIGkuaWNvbi1mb3JtLXJhZGlvIHtcbiAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICAgICAgICB9ICAgICAgIFxuICAgICAgICB9XG4gICAgfVxuICAgIGh0bWw6bm90KC53YXRjaC1hY3RpdmUtc3RhdGUpICY6YWN0aXZlLCAmLmFjdGl2ZS1zdGF0ZSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsMC4xKTtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgLmhhaXJsaW5lLWNvbG9yKGJvdHRvbSwgdHJhbnNwYXJlbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBTbWFydCBzZWxlY3RzXG4uc21hcnQtc2VsZWN0IHtcbiAgICBzZWxlY3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cbiIsIi8qID09PSBGbG9hdGluZyBBY3Rpb24gQnV0dG9uID09PSAqL1xuLmZsb2F0aW5nLWJ1dHRvbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAxNnB4O1xuICAgIGJvdHRvbTogMTZweDtcbiAgICB3aWR0aDogNTZweDtcbiAgICBoZWlnaHQ6IDU2cHg7XG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgIHotaW5kZXg6IDE1MDA7XG4gICAgLmRlcHRoKDMpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IEB0aGVtZUNvbG9yO1xuICAgIGNvbG9yOiNmZmY7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgLmZsZXhib3goKTtcbiAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAuanVzdGlmeS1jb250ZW50KGNlbnRlcik7XG4gICAgaHRtbDpub3QoLndhdGNoLWFjdGl2ZS1zdGF0ZSkgJjphY3RpdmUsICYuYWN0aXZlLXN0YXRlIHtcbiAgICAgICAgYmFja2dyb3VuZDogZGFya2VuKEB0aGVtZUNvbG9yLCA4JSk7XG4gICAgfVxufVxuLmZsb2F0aW5nLWJ1dHRvbi10b29sYmFyLCAuc3BlZWQtZGlhbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAxNnB4O1xuICAgIGJvdHRvbTogMTZweDtcbiAgICB6LWluZGV4OiAxNTAwO1xuICAgIC5mbG9hdGluZy1idXR0b24ge1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxufVxuLy8gU3BlZWQgRGlhbFxuLnNwZWVkLWRpYWwge1xuICAgIC5mbG9hdGluZy1idXR0b24ge1xuICAgICAgICBpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgICAgIHRvcDogNTAlO1xuICAgICAgICAgICAgLnRyYW5zZm9ybSh0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKSByb3RhdGUoMGRlZykgc2NhbGUoMSkpO1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICB9XG4gICAgICAgIGkgKyBpIHtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgcm90YXRlKC05MGRlZykgc2NhbGUoMC41KSk7XG4gICAgICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgICYuc3BlZWQtZGlhbC1vcGVuZWQge1xuICAgICAgICAuZmxvYXRpbmctYnV0dG9uIHtcbiAgICAgICAgICAgIGkge1xuICAgICAgICAgICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgcm90YXRlKDkwZGVnKSBzY2FsZSgwLjUpKTtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSArIGkge1xuICAgICAgICAgICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgcm90YXRlKDBkZWcpIHNjYWxlKDEpKTtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLnNwZWVkLWRpYWwtYnV0dG9ucyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiA0MHB4O1xuICAgIGxlZnQ6IDUwJTtcbiAgICBtYXJnaW4tbGVmdDogLTIwcHg7XG4gICAgYm90dG9tOiAxMDAlO1xuICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgLmZsZXhib3goKTtcbiAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgIC13ZWJraXQtYm94LWRpcmVjdGlvbjogcmV2ZXJzZTtcbiAgICAtbW96LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgIC1tb3otYm94LWRpcmVjdGlvbjogcmV2ZXJzZTtcbiAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgYSB7XG4gICAgICAgIHdpZHRoOiA0MHB4O1xuICAgICAgICBoZWlnaHQ6IDQwcHg7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgei1pbmRleDogMTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHRoZW1lQ29sb3I7XG4gICAgICAgIGh0bWw6bm90KC53YXRjaC1hY3RpdmUtc3RhdGUpICY6YWN0aXZlLCAmLmFjdGl2ZS1zdGF0ZSB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBkYXJrZW4oQHRoZW1lQ29sb3IsIDglKTtcbiAgICAgICAgfVxuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5hbGlnbi1pdGVtcyhjZW50ZXIpO1xuICAgICAgICAuanVzdGlmeS1jb250ZW50KGNlbnRlcik7XG4gICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwgOHB4LCAwKSBzY2FsZSgwLjMpKTtcbiAgICAgICAgLnRyYW5zZm9ybS1vcmlnaW4oY2VudGVyIGJvdHRvbSk7XG4gICAgICAgICsgYSB7XG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC5zcGVlZC1kaWFsLW9wZW5lZCAmIHtcbiAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICAgIGEge1xuICAgICAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwgMCwgMCkgc2NhbGVZKDEpKTtcbiAgICAgICAgICAgIC5kZXB0aCgzKTtcbiAgICAgICAgICAgICY6bnRoLWNoaWxkKDIpIHtcbiAgICAgICAgICAgICAgICAuZGVsYXkoNTBtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmOm50aC1jaGlsZCgzKSB7XG4gICAgICAgICAgICAgICAgLmRlbGF5KDEwMG1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICY6bnRoLWNoaWxkKDQpIHtcbiAgICAgICAgICAgICAgICAuZGVsYXkoMTUwbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJjpudGgtY2hpbGQoNSkge1xuICAgICAgICAgICAgICAgIC5kZWxheSgyMDBtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmOm50aC1jaGlsZCg2KSB7XG4gICAgICAgICAgICAgICAgLmRlbGF5KDI1MG1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gUG9wb3ZlIE1vcnBoXG4uZmxvYXRpbmctYnV0dG9uLXRvLXBvcG92ZXIge1xuICAgICYuZmxvYXRpbmctYnV0dG9uLXRvLXBvcG92ZXIge1xuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgfVxuICAgICYuZmxvYXRpbmctYnV0dG9uLXRvLXBvcG92ZXItaW4ge1xuICAgICAgICAudHJhbnNpdGlvbigxMDBtcyk7XG4gICAgICAgIGkge1xuICAgICAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDEwMG1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAmLmZsb2F0aW5nLWJ1dHRvbi10by1wb3BvdmVyLXNjYWxlIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgIH1cbiAgICAmLmZsb2F0aW5nLWJ1dHRvbi10by1wb3BvdmVyLW91dCB7XG4gICAgICAgIC5kZWxheSgwbXMpO1xuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgICAgIGkge1xuICAgICAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDEwMG1zKTtcbiAgICAgICAgICAgIC5kZWxheSgyMDBtcyk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyogPT09IE1vZGFscyA9PT0gKi9cbkBtb2RhbEJnQ29sb3I6I2ZmZjtcbkBtb2RhbEJ1dG9uQ29sb3IgOiAjNDI4NWY0O1xuQG1vZGFsQnV0b25CZzogQG1vZGFsQmdDb2xvcjtcbkBtb2RhbER1cmF0aW9uOjQwMG1zO1xuQGFjdGlvbnNNb2RhbER1cmF0aW9uOjMwMG1zO1xuQHBvcG92ZXJEdXJhdGlvbjogMzAwbXM7XG5AcG9wdXBEdXJhdGlvbjogNDAwbXM7XG4ubW9kYWwtb3ZlcmxheSwgLnByZWxvYWRlci1pbmRpY2F0b3Itb3ZlcmxheSwgLnBvcHVwLW92ZXJsYXksIC5waWNrZXItbW9kYWwtb3ZlcmxheSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNCk7XG4gICAgei1pbmRleDogMTMwMDA7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgLnRyYW5zaXRpb24oQG1vZGFsRHVyYXRpb24pO1xuICAgICYubW9kYWwtb3ZlcmxheS12aXNpYmxlIHtcbiAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG59XG4ucG9wdXAtb3ZlcmxheSB7XG4gICAgei1pbmRleDogMTA1MDA7XG59XG4ucGlja2VyLW1vZGFsLW92ZXJsYXkge1xuICAgIHotaW5kZXg6IDEyMDAwO1xufVxuLm1vZGFsIHtcbiAgICB3aWR0aDogMjgwcHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6IDEzNTAwO1xuICAgIGxlZnQ6IDUwJTtcbiAgICBtYXJnaW4tbGVmdDogLTE0MHB4O1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgdG9wOiA1MCU7XG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIG9wYWNpdHk6IDA7XG4gICAgLnRyYW5zZm9ybSh0cmFuc2xhdGUzZCgwLDAsMCkgc2NhbGUoMS4xODUpKTtcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IC13ZWJraXQtdHJhbnNmb3JtLCBvcGFjaXR5O1xuICAgIC1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTogLW1vei10cmFuc2Zvcm0sIG9wYWNpdHk7XG4gICAgLW1zLXRyYW5zaXRpb24tcHJvcGVydHk6IC1tcy10cmFuc2Zvcm0sIG9wYWNpdHk7XG4gICAgLW8tdHJhbnNpdGlvbi1wcm9wZXJ0eTogLW8tdHJhbnNmb3JtLCBvcGFjaXR5O1xuICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgICBjb2xvcjojNzU3NTc1O1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgLmRlcHRoKDUpO1xuICAgICYubW9kYWwtaW4ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAudHJhbnNpdGlvbihAbW9kYWxEdXJhdGlvbik7XG4gICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwwLDApIHNjYWxlKDEpKTtcbiAgICB9XG4gICAgJi5tb2RhbC1vdXQge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB6LWluZGV4OiAxMzUwMC0xO1xuICAgICAgICAudHJhbnNpdGlvbihAbW9kYWxEdXJhdGlvbik7XG4gICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwwLDApIHNjYWxlKDAuODE1KSk7XG4gICAgfVxufVxuLm1vZGFsLWlubmVyIHtcbiAgICBwYWRkaW5nOiAyNHB4IDI0cHggMjBweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4ubW9kYWwtdGl0bGUge1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICAgIGNvbG9yOiMyMTIxMjE7XG4gICAgbGluZS1oZWlnaHQ6IDEuMztcbiAgICArLm1vZGFsLXRleHQge1xuICAgICAgICBtYXJnaW4tdG9wOiAyMHB4O1xuICAgIH1cbn1cbi5tb2RhbC10ZXh0IHtcbiAgICBsaW5lLWhlaWdodDogMS41O1xufVxuLm1vZGFsLWJ1dHRvbnMge1xuICAgIGhlaWdodDogNDhweDtcbiAgICBwYWRkaW5nOiA2cHggOHB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm94LXNpemluZzpib3JkZXItYm94O1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmp1c3RpZnktY29udGVudChmbGV4LWVuZCk7XG4gICAgJi5tb2RhbC1idXR0b25zLXZlcnRpY2FsIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgcGFkZGluZzogMCAwIDhweCAwO1xuICAgICAgICAubW9kYWwtYnV0dG9uIHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICAgICAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgICAgICAgICBsaW5lLWhlaWdodDogNDhweDtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7XG4gICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4O1xuICAgICAgICB9XG4gICAgfVxufVxuLm1vZGFsLWJ1dHRvbiwgLm1vZGFsLWJ1dHRvbnMgLmJ1dHRvbiB7XG4gICAgLmJ1dHRvbjtcbiAgICAmLm1vZGFsLWJ1dHRvbi1ib2xkIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICB9XG4gICAgKyAubW9kYWwtYnV0dG9uIHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDRweDtcbiAgICB9XG59XG4ubW9kYWwtbm8tYnV0dG9ucyB7XG4gICAgLm1vZGFsLWJ1dHRvbnMge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cbi8vIEFjdGlvbiBzaGVldFxuLmFjdGlvbnMtbW9kYWwge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICB6LWluZGV4OiAxMzUwMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwxMDAlLDApKTtcbiAgICBtYXgtaGVpZ2h0OiAxMDAlO1xuICAgIC5zY3JvbGxhYmxlKCk7XG4gICAgJi5tb2RhbC1pbiB7XG4gICAgICAgIC50cmFuc2l0aW9uKEBhY3Rpb25zTW9kYWxEdXJhdGlvbik7XG4gICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwwLDApKTtcbiAgICB9XG4gICAgJi5tb2RhbC1vdXQge1xuICAgICAgICB6LWluZGV4OiAxMzUwMC0xO1xuICAgICAgICAudHJhbnNpdGlvbihAYWN0aW9uc01vZGFsRHVyYXRpb24pO1xuICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZTNkKDAsMTAwJSwwKSk7XG4gICAgfVxufVxuLmFjdGlvbnMtbW9kYWwtZ3JvdXAge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAuaGFpcmxpbmUoYm90dG9tLCAjZDJkMmQ2KTtcbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgfVxufVxuLmFjdGlvbnMtbW9kYWwtYnV0dG9uLCAuYWN0aW9ucy1tb2RhbC1sYWJlbCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICBtYXJnaW46IDA7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgcGFkZGluZzogMCAxNnB4O1xuICAgIGEge1xuICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICAgIGNvbG9yOiBpbmhlcml0O1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgYiB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgfVxuICAgICYuYWN0aW9ucy1tb2RhbC1idXR0b24tYm9sZCB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgfVxuICAgICYuYWN0aW9ucy1tb2RhbC1idXR0b24tcmVkIHtcbiAgICAgICAgY29sb3I6IEByZWQ7XG4gICAgfVxuICAgICYuZGlzYWJsZWQge1xuICAgICAgICBvcGFjaXR5OiAwLjk1O1xuICAgICAgICBjb2xvcjpAZ3JheTtcbiAgICB9XG59XG4uYWN0aW9ucy1tb2RhbC1idXR0b24ge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBsaW5lLWhlaWdodDogNDhweDtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgY29sb3I6IHJnYmEoMCwwLDAsMC44Nyk7XG4gICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgIGEsICYge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyAgICBcbiAgICB9XG4gICAgaHRtbDpub3QoLndhdGNoLWFjdGl2ZS1zdGF0ZSkgJjphY3RpdmUsICYuYWN0aXZlLXN0YXRlIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjEpO1xuICAgIH1cbn1cbi5hY3Rpb25zLW1vZGFsLWxhYmVsIHtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgY29sb3I6IHJnYmEoMCwwLDAsMC41NCk7XG4gICAgbWluLWhlaWdodDogNTZweDtcbiAgICBsaW5lLWhlaWdodDogMS4zO1xuICAgIHBhZGRpbmctdG9wOiAxMnB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAxMnB4O1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmp1c3RpZnktY29udGVudChmbGV4LXN0YXJ0KTtcbiAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbn1cbi8vIFByb21wdFxuaW5wdXQubW9kYWwtdGV4dC1pbnB1dCB7XG4gICAgYm94LXNpemluZzpib3JkZXItYm94O1xuICAgIGhlaWdodDogMzZweDtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIG1hcmdpbjogMDtcbiAgICBtYXJnaW4tdG9wOiAxNXB4O1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICAudHJhbnNpdGlvbigyMDBtcyk7XG4gICAgJjo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgICAgY29sb3I6IHJnYmEoMCwwLDAsMC4zNSk7XG4gICAgfVxuICAgICsgaW5wdXQubW9kYWwtdGV4dC1pbnB1dCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDE2cHg7XG4gICAgfVxufVxuLy8gUG9wb3ZlclxuLnBvcG92ZXIge1xuICAgIHdpZHRoOiAzMjBweDtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIHotaW5kZXg6IDEzNTAwO1xuICAgIG1hcmdpbjogMDtcbiAgICB0b3A6IDA7XG4gICAgb3BhY2l0eTogMDtcbiAgICBsZWZ0OiAwO1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICAuZGVwdGgoMik7XG4gICAgLnRyYW5zZm9ybShzY2FsZSgwLjg1LCAwLjYpKTtcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHksIC13ZWJraXQtdHJhbnNmb3JtLCBib3JkZXItcmFkaXVzO1xuICAgIC1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgLW1vei10cmFuc2Zvcm0sIGJvcmRlci1yYWRpdXM7XG4gICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgdHJhbnNmb3JtLCBib3JkZXItcmFkaXVzO1xuICAgICYucG9wb3Zlci1vbi10b3Age1xuICAgICAgICAudHJhbnNmb3JtLW9yaWdpbihjZW50ZXIgYm90dG9tKTtcbiAgICB9XG4gICAgJi5wb3BvdmVyLW9uLWJvdHRvbSB7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKGNlbnRlciB0b3ApO1xuICAgIH1cbiAgICAmLm1vZGFsLWluIHtcbiAgICAgICAgLnRyYW5zZm9ybShzY2FsZSgxKSk7XG4gICAgICAgIC50cmFuc2l0aW9uKEBwb3BvdmVyRHVyYXRpb24pO1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgICAmLm1vZGFsLW91dCB7XG4gICAgICAgIC50cmFuc2Zvcm0oc2NhbGUoMSkpO1xuICAgICAgICAudHJhbnNpdGlvbihAcG9wb3ZlckR1cmF0aW9uKTtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gICAgLmxpc3QtYmxvY2sge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICY6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB1bCB7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgdWwge1xuICAgICAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUodG9wKTtcbiAgICAgICAgfVxuICAgICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgIHVsIHtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpOmZpcnN0LWNoaWxkIGEge1xuICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgICB1bCB7XG4gICAgICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCAzcHggM3B4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGk6bGFzdC1jaGlsZCBhIHtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgM3B4IDNweDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAmOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgbGk6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCBhLCB1bDpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkIHtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5wb3BvdmVyLWZsb2F0aW5nLWJ1dHRvbiB7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKGNlbnRlciBjZW50ZXIpO1xuICAgICAgICAudHJhbnNmb3JtKHNjYWxlKDAuNykpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICAgIC5kZXB0aCgzKTtcbiAgICAgICAgJi5tb2RhbC1pbiB7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwJTtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGUoMSkpO1xuICAgICAgICAgICAgLmRlbGF5KDIwMG1zKTtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDIwMG1zKTtcbiAgICAgICAgfVxuICAgICAgICAmLm1vZGFsLW91dCB7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlKDAuNykpO1xuICAgICAgICAgICAgLmRlbGF5KDBtcyk7XG4gICAgICAgICAgICAudHJhbnNpdGlvbigxMDBtcyk7XG4gICAgICAgIH1cbiAgICAgICAgLmxpc3QtYmxvY2sge1xuICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgICAgICAgICAgdWwge1xuICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaTpmaXJzdC1jaGlsZCBhIHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgICAgIHVsIHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGk6bGFzdC1jaGlsZCBhIHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgICAgIGxpOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQgYSwgdWw6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLnBvcG92ZXItaW5uZXIge1xuICAgIC5zY3JvbGxhYmxlKCk7XG59XG4uYWN0aW9ucy1wb3BvdmVyIHtcbiAgICAubGlzdC1ibG9jayB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICB9XG59XG4uYWN0aW9ucy1wb3BvdmVyLWxhYmVsIHtcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcbiAgICBjb2xvcjpyZ2JhKDAsMCwwLDAuNTQpO1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBsaW5lLWhlaWdodDogMS4zO1xuICAgIHBhZGRpbmctdG9wOiAxMnB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAxMnB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAuaGFpcmxpbmUoYm90dG9tLCAjZDJkMmQ2KTtcbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgfVxufVxuLy8gUG9wdXBcbi5wb3B1cCwgLmxvZ2luLXNjcmVlbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB6LWluZGV4OiAxMTAwMDtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIGJveC1zaXppbmc6Ym9yZGVyLWJveDtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIC5zY3JvbGxhYmxlKCk7XG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTtcbiAgICAtbW96LXRyYW5zaXRpb24tcHJvcGVydHk6IC1tb3otdHJhbnNmb3JtO1xuICAgIC1tcy10cmFuc2l0aW9uLXByb3BlcnR5OiAtbXMtdHJhbnNmb3JtO1xuICAgIC1vLXRyYW5zaXRpb24tcHJvcGVydHk6IC1vLXRyYW5zZm9ybTtcbiAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm07XG4gICAgLnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTtcbiAgICAmLm1vZGFsLWluLCAmLm1vZGFsLW91dCB7XG4gICAgICAgIC50cmFuc2l0aW9uKEBwb3B1cER1cmF0aW9uKTtcbiAgICB9XG4gICAgJi5tb2RhbC1pbiB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxuICAgICYubW9kYWwtb3V0IHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTtcbiAgICB9XG59XG4ubG9naW4tc2NyZWVuLm1vZGFsLWluLCAubG9naW4tc2NyZWVuLm1vZGFsLW91dCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG4vLyBpUGFkIFBvcHVwXG5AbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOjYzMHB4KSBhbmQgKG1pbi1oZWlnaHQ6NjMwcHgpIHtcbiAgICAucG9wdXA6bm90KC50YWJsZXQtZnVsbHNjcmVlbikge1xuICAgICAgICB3aWR0aDogNjMwcHg7XG4gICAgICAgIGhlaWdodDogNjMwcHg7XG4gICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAtMzE1cHg7XG4gICAgICAgIG1hcmdpbi10b3A6IC0zMTVweDtcbiAgICAgICAgYm94LXNoYWRvdzogMHB4IDIwcHggNDRweCByZ2JhKDAsMCwwLDAuNSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMTAyNHB4LDApO1xuICAgICAgICAmLm1vZGFsLWluIHtcbiAgICAgICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgICAgIH1cbiAgICAgICAgJi5tb2RhbC1vdXQge1xuICAgICAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMTAyNHB4LDApO1xuICAgICAgICB9XG4gICAgfVxufVxuaHRtbC53aXRoLXN0YXR1c2Jhci1vdmVybGF5IHtcbiAgICAvLyBpUGhvbmUgd2l0aCBzdGF0dXNiYXIgb3ZlcmxheVxuICAgIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6NjI5cHgpLCAobWF4LWhlaWdodDo2MjlweCkge1xuICAgICAgICAucG9wdXAge1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCItd2Via2l0LWNhbGMoMTAwJSAtIDIwcHgpXCI7XG4gICAgICAgICAgICBoZWlnaHQ6IH5cImNhbGMoMTAwJSAtIDIwcHgpXCI7XG4gICAgICAgICAgICB0b3A6IDIwcHg7XG4gICAgICAgIH1cbiAgICAgICAgLnBvcHVwLW92ZXJsYXkge1xuICAgICAgICAgICAgei1pbmRleDogOTUwMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAubG9naW4tc2NyZWVuLCAucG9wdXAudGFibGV0LWZ1bGxzY3JlZW4ge1xuICAgICAgICBoZWlnaHQ6IH5cIi13ZWJraXQtY2FsYygxMDAlIC0gMjBweClcIjtcbiAgICAgICAgaGVpZ2h0OiB+XCJjYWxjKDEwMCUgLSAyMHB4KVwiO1xuICAgICAgICB0b3A6IDIwcHg7XG4gICAgfVxufVxuXG4vL1ByZWxvYWRlcnMgbW9kYWxzXG4ubW9kYWwtcHJlbG9hZGVyIHtcbiAgICAubW9kYWwtdGl0bGUsIC5tb2RhbC1pbm5lciB7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICB9XG59XG4ucHJlbG9hZGVyLWluZGljYXRvci1vdmVybGF5IHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbn1cbi5wcmVsb2FkZXItaW5kaWNhdG9yLW1vZGFsIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogNTAlO1xuICAgIHRvcDogNTAlO1xuICAgIHBhZGRpbmc6IDhweDtcbiAgICBtYXJnaW4tbGVmdDogLTI0cHg7XG4gICAgbWFyZ2luLXRvcDogLTI0cHg7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjgpO1xuICAgIHotaW5kZXg6IDEzNTAwO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAucHJlbG9hZGVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxufVxuXG4vLyBQaWNrZXIgTW9kYWxcbi5waWNrZXItbW9kYWwge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDI2MHB4O1xuICAgIHotaW5kZXg6IDEyMDAwO1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTtcbiAgICAtbW96LXRyYW5zaXRpb24tcHJvcGVydHk6IC1tb3otdHJhbnNmb3JtO1xuICAgIC1tcy10cmFuc2l0aW9uLXByb3BlcnR5OiAtbXMtdHJhbnNmb3JtO1xuICAgIC1vLXRyYW5zaXRpb24tcHJvcGVydHk6IC1vLXRyYW5zZm9ybTtcbiAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm07XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICAudHJhbnNsYXRlM2QoMCwxMDAlLDApO1xuICAgICYubW9kYWwtaW4sICYubW9kYWwtb3V0IHtcbiAgICAgICAgLnRyYW5zaXRpb24oNDAwbXMpO1xuICAgIH1cbiAgICAmLm1vZGFsLWluIHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG4gICAgJi5tb2RhbC1vdXQge1xuICAgICAgICAudHJhbnNsYXRlM2QoMCwxMDAlLDApO1xuICAgIH1cbiAgICAucGlja2VyLW1vZGFsLWlubmVyIHtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuICAgIC50b29sYmFyIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICArIC5waWNrZXItbW9kYWwtaW5uZXIge1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCItd2Via2l0LWNhbGMoMTAwJSAtIEB7dG9vbGJhclNpemV9KVwiO1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCItbW96LWNhbGMoMTAwJSAtIEB7dG9vbGJhclNpemV9KVwiO1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCJjYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSlcIjsgICAgXG4gICAgICAgIH1cbiAgICAgICAgYS5saW5rIHtcbiAgICAgICAgICAgIC5mbGV4LXNocmluaygwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAucGlja2VyLWhlYWRlciwgLnBpY2tlci1mb290ZXIge1xuICAgICAgICBoZWlnaHQ6IEB0b29sYmFyU2l6ZTtcbiAgICB9XG4gICAgLnBpY2tlci1oZWFkZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgKyAudG9vbGJhciAudG9vbGJhci1pbm5lciB7XG4gICAgICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICAgICAgfVxuICAgICAgICArIC5waWNrZXItZm9vdGVyICsgLnRvb2xiYXIgKyAucGlja2VyLW1vZGFsLWlubmVyIHtcbiAgICAgICAgICAgIGhlaWdodDogflwiLXdlYmtpdC1jYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSAqIDMpXCI7XG4gICAgICAgICAgICBoZWlnaHQ6IH5cIi1tb3otY2FsYygxMDAlIC0gQHt0b29sYmFyU2l6ZX0gKiAzKVwiO1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCJjYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSAqIDMpXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnBpY2tlci1mb290ZXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIC5tb2RhbC1idXR0b25zO1xuICAgICAgICBcbiAgICB9XG4gICAgLnBpY2tlci1oZWFkZXIsIC5waWNrZXItZm9vdGVyIHtcbiAgICAgICAgKyAucGlja2VyLW1vZGFsLWlubmVyIHtcbiAgICAgICAgICAgIGhlaWdodDogflwiLXdlYmtpdC1jYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSlcIjtcbiAgICAgICAgICAgIGhlaWdodDogflwiLW1vei1jYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSlcIjtcbiAgICAgICAgICAgIGhlaWdodDogflwiY2FsYygxMDAlIC0gQHt0b29sYmFyU2l6ZX0pXCI7ICAgIFxuICAgICAgICB9XG4gICAgICAgICsgLnRvb2xiYXIgKyAucGlja2VyLW1vZGFsLWlubmVyIHtcbiAgICAgICAgICAgIGhlaWdodDogflwiLXdlYmtpdC1jYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSAqIDIpXCI7XG4gICAgICAgICAgICBoZWlnaHQ6IH5cIi1tb3otY2FsYygxMDAlIC0gQHt0b29sYmFyU2l6ZX0gKiAyKVwiO1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCJjYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSAqIDIpXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5waWNrZXItbW9kYWwtaW5saW5lLCAucG9wb3ZlciAmIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgei1pbmRleDogaW5oZXJpdDtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAgICAgLnRvb2xiYXIge1xuICAgICAgICAgICAgdG9wOiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5wb3BvdmVyICYge1xuICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgICAgLnRvb2xiYXI6Zmlyc3QtY2hpbGQsIC5waWNrZXItaGVhZGVyOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDJweCAycHggMCAwO1xuICAgICAgICB9XG4gICAgfVxuICAgICYuc21hcnQtc2VsZWN0LXBpY2tlciB7XG4gICAgICAgIC5saXN0LWJsb2NrIHtcbiAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgIHVsIHtcbiAgICAgICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qID09PSBUb3VjaCByaXBwbGUgPT09ICovXG4vLyBSaXBwbGUgRWxlbWVudHNcbi5yaXBwbGUsIGEuZmxvYXRpbmctYnV0dG9uLCAuZmxvYXRpbmctYnV0dG9uID4gYSwgYS5saW5rLCBhLml0ZW0tbGluaywgLmJ1dHRvbiwgLm1vZGFsLWJ1dHRvbiwgLnRhYi1saW5rLCAubGFiZWwtcmFkaW8sIC5sYWJlbC1jaGVja2JveCwgLmFjdGlvbnMtbW9kYWwtYnV0dG9uLCAuc3BlZWQtZGlhbC1idXR0b25zIGEge1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG4vLyBSaXBwbGVcbi5yaXBwbGUtd2F2ZSB7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIHotaW5kZXg6LTE7XG4gICAgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuMSk7XG4gICAgcGFkZGluZzogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgZm9udC1zaXplOiAwO1xuICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMHB4LCAwcHgsIDApIHNjYWxlKDApKTtcbiAgICAudHJhbnNpdGlvbigxNDAwbXMpO1xuICAgICYucmlwcGxlLXdhdmUtZmlsbCB7XG4gICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgb3BhY2l0eTogMC4zNTtcbiAgICB9XG4gICAgJi5yaXBwbGUtd2F2ZS1vdXQge1xuICAgICAgICAudHJhbnNpdGlvbig2MDBtcyk7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxuICAgIC5idXR0b24tZmlsbCAmLCAgLnBpY2tlci1jYWxlbmRhci1kYXkgJntcbiAgICAgICAgei1pbmRleDogMTtcbiAgICB9XG59XG4uYnV0dG9uLWZpbGwsIC5uYXZiYXIsIC50b29sYmFyLCAuc3VibmF2YmFyLCAuc2VhcmNoYmFyLCAubm90aWZpY2F0aW9ucywgLmZsb2F0aW5nLWJ1dHRvbiwgLnNwZWVkLWRpYWwtYnV0dG9ucyBhIHtcbiAgICAucmlwcGxlLXdhdmUge1xuICAgICAgICBiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC4zKTtcbiAgICB9XG59XG4ubWVzc2FnZWJhciB7XG4gICAgLnJpcHBsZS13YXZlIHtcbiAgICAgICAgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuMSk7XG4gICAgfVxufVxuIiwiLy8gQWN0aXZlIGJ1dHRvbiBpY29uIGNvbG9yXG5cbi5idXR0b24ge1xuICAmLmFjdGl2ZSB7XG4gICAgaS5pY29uIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgfVxuICB9XG59XG4iLCIvKiA9PT0gUGFuZWxzID09PSAqL1xuQHBhbmVsV2lkdGg6MjYwcHg7XG5AcGFuZWxzRHVyYXRpb246IDMwMG1zO1xuLnBhbmVsLW92ZXJsYXkge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjIpO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgei1pbmRleDogNTk5OTtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwwLDApKTtcbiAgICAudHJhbnNpdGlvbihAcGFuZWxzRHVyYXRpb24pO1xufVxuLnBhbmVsIHtcbiAgICB6LWluZGV4OiAxMDAwO1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC5zY3JvbGxhYmxlKCk7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiBAcGFuZWxXaWR0aDtcbiAgICB0b3A6IDA7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIC50cmFuc2xhdGUzZCgwKTtcbiAgICAudHJhbnNpdGlvbihAcGFuZWxzRHVyYXRpb24pO1xuXG4gICAgJi5wYW5lbC1sZWZ0IHtcblxuICAgICAgICAmLnBhbmVsLWNvdmVyIHtcbiAgICAgICAgICAgIHotaW5kZXg6IDYwMDA7XG4gICAgICAgICAgICBsZWZ0OiAtQHBhbmVsV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgJi5wYW5lbC1yZXZlYWwge1xuICAgICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAmLnBhbmVsLXJpZ2h0IHtcbiAgICAgICAgJi5wYW5lbC1jb3ZlciB7XG4gICAgICAgICAgICB6LWluZGV4OiA2MDAwO1xuICAgICAgICAgICAgcmlnaHQ6IC1AcGFuZWxXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICAmLnBhbmVsLXJldmVhbCB7XG4gICAgICAgICAgICByaWdodDogMDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmJvZHkud2l0aC1wYW5lbC1sZWZ0LWNvdmVyLCBib2R5LndpdGgtcGFuZWwtcmlnaHQtY292ZXIge1xuICAgIC5wYW5lbCB7XG4gICAgICAgIGJveC1zaGFkb3c6IDBweCAwcHggMjBweCByZ2JhKDAsMCwwLDAuNSk7XG4gICAgfVxuICAgIC52aWV3cyB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwKTtcbiAgICB9XG4gICAgLnBhbmVsLW92ZXJsYXkge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG59XG5ib2R5LndpdGgtcGFuZWwtbGVmdC1yZXZlYWwsIGJvZHkud2l0aC1wYW5lbC1yaWdodC1yZXZlYWwge1xuICAgIC52aWV3cyB7XG4gICAgICAgIGJveC1zaGFkb3c6IDBweCAwcHggMjBweCByZ2JhKDAsMCwwLDAuNSk7XG4gICAgICAgIC50cmFuc2l0aW9uKEBwYW5lbHNEdXJhdGlvbik7XG4gICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm0sIGJveC1zaGFkb3c7XG4gICAgICAgIC1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTogLW1vei10cmFuc2Zvcm0sIGJveC1zaGFkb3c7XG4gICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgYm94LXNoYWRvdztcbiAgICB9XG4gICAgLnBhbmVsLW92ZXJsYXkge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDApO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG59XG5ib2R5LndpdGgtcGFuZWwtbGVmdC1yZXZlYWwge1xuICAgIC52aWV3cyB7XG4gICAgICAgIC50cmFuc2xhdGUzZChAcGFuZWxXaWR0aCk7XG4gICAgfVxuICAgIC5wYW5lbC1vdmVybGF5IHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKEBwYW5lbFdpZHRoKTtcbiAgICB9XG59XG5ib2R5LndpdGgtcGFuZWwtbGVmdC1jb3ZlciB7XG4gICAgLnBhbmVsLWxlZnQge1xuICAgICAgICAudHJhbnNsYXRlM2QoQHBhbmVsV2lkdGgpO1xuICAgIH1cbn1cbmJvZHkud2l0aC1wYW5lbC1yaWdodC1yZXZlYWwge1xuICAgIC52aWV3cyB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgtQHBhbmVsV2lkdGgpO1xuICAgIH1cbiAgICAucGFuZWwtb3ZlcmxheSB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgtQHBhbmVsV2lkdGgpO1xuICAgIH1cbn1cbmJvZHkud2l0aC1wYW5lbC1yaWdodC1jb3ZlciB7XG4gICAgLnBhbmVsLXJpZ2h0IHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKC1AcGFuZWxXaWR0aCk7XG4gICAgfVxufVxuYm9keS5wYW5lbC1jbG9zaW5nIHtcbiAgICAucGFuZWwtb3ZlcmxheSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAudmlld3Mge1xuICAgICAgICAudHJhbnNpdGlvbihAcGFuZWxzRHVyYXRpb24pO1xuICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IC13ZWJraXQtdHJhbnNmb3JtLCBib3gtc2hhZG93O1xuICAgICAgICAtbW96LXRyYW5zaXRpb24tcHJvcGVydHk6IC1tb3otdHJhbnNmb3JtLCBib3gtc2hhZG93O1xuICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIGJveC1zaGFkb3c7XG4gICAgfVxufSIsIi8qID09PSBUYWJzID09PSAqL1xuLnRhYnMge1xuICAgIC50YWIge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgICAudGFiLmFjdGl2ZSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbn1cbi50YWJzLWFuaW1hdGVkLXdyYXAge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICA+LnRhYnMge1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgPi50YWIge1xuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgIC5mbGV4LXNocmluaygwKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi50YWJzLXN3aXBlYWJsZS13cmFwIHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgPiAudGFicyA+IC50YWIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG59IiwiLyogPT09IE1lc3NhZ2VzID09PSAqL1xuQG1lc3NhZ2VzQXZhdGFyU2l6ZTogNDhweDtcbi5tZXNzYWdlcy1jb250ZW50IHtcbiAgICBiYWNrZ3JvdW5kOiAjZWVlO1xufVxuLm1lc3NhZ2VzIHtcbiAgICAuZmxleGJveCgpO1xuICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XG4gICAgLW1vei1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cbi5tZXNzYWdlcy1kYXRlIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgbWFyZ2luOiAxMHB4IDE1cHg7XG4gICAgc3BhbiB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgfVxufVxuLm1lc3NhZ2Uge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgbWFyZ2luOiAwcHggOHB4IDhweCA4cHg7XG4gICAgbWF4LXdpZHRoOiA4MCU7XG4gICAgLmZsZXhib3goKTtcbiAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgIC1tb3otYm94LW9yaWVudDogdmVydGljYWw7XG4gICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDhweDtcbiAgICB9XG4gICAgJi5tZXNzYWdlLXBpYyB7XG4gICAgICAgIGltZyB7XG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuICAgIH1cbn1cbi5tZXNzYWdlLW5hbWUsIC5tZXNzYWdlLWxhYmVsLCAubWVzc2FnZS1kYXRlLCAubWVzc2FnZXMtZGF0ZSB7XG4gICAgY29sb3I6cmdiYSgwLDAsMCwwLjUxKTtcbn1cbi5tZXNzYWdlLW5hbWUge1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgICBtYXJnaW4tYm90dG9tOiAycHg7XG4gICAgbWFyZ2luLXRvcDogN3B4O1xuICAgIC5tZXNzYWdlLWhpZGUtbmFtZSAmIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG59XG4ubWVzc2FnZS1sYWJlbCB7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICAubWVzc2FnZS1oaWRlLWxhYmVsICYge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cbi5tZXNzYWdlLWF2YXRhciB7XG4gICAgd2lkdGg6IEBtZXNzYWdlc0F2YXRhclNpemU7XG4gICAgaGVpZ2h0OiBAbWVzc2FnZXNBdmF0YXJTaXplO1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgbWFyZ2luLXRvcDogLUBtZXNzYWdlc0F2YXRhclNpemU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogMXB4O1xuICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7XG4gICAgb3BhY2l0eTogMTtcbiAgICAudHJhbnNpdGlvbig0MDBtcyk7XG4gICAgLm1lc3NhZ2UtaGlkZS1hdmF0YXIgJiB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxufVxuLm1lc3NhZ2UtdGV4dCB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgcGFkZGluZzogNnB4IDhweDtcbiAgICBtaW4td2lkdGg6IDQ4cHg7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxLjI7XG4gICAgd29yZC1icmVhazogYnJlYWstd29yZDtcbiAgICBjb2xvcjojMzMzO1xuICAgIG1pbi1oZWlnaHQ6IEBtZXNzYWdlc0F2YXRhclNpemU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgaW1nIHtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IGF1dG87XG4gICAgfVxuICAgIC5tZXNzYWdlLXBpYyAmIHtcbiAgICAgICAgcGFkZGluZzogOHB4O1xuICAgIH1cbn1cbi5tZXNzYWdlLWRhdGUge1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgLm1lc3NhZ2UtcGljIGltZyArICYge1xuICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XG4gICAgfVxufVxuLm1lc3NhZ2Utc2VudCB7XG4gICAgLW1zLWZsZXgtaXRlbS1hbGlnbjogZW5kO1xuICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1lbmQ7XG4gICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XG4gICAgLmFsaWduLWl0ZW1zKGZsZXgtZW5kKTtcbiAgICAubWVzc2FnZS1uYW1lLCAubWVzc2FnZS1sYWJlbCB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogOHB4O1xuICAgIH1cbiAgICAubWVzc2FnZS10ZXh0IHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0M4RTZDOTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDJweCAycHggMCAycHg7XG4gICAgICAgIG1hcmdpbi1yaWdodDogOHB4O1xuICAgICAgICAmOmJlZm9yZSB7XG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgICAgIGJvcmRlci1sZWZ0OiAwcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgICBib3JkZXItcmlnaHQ6IDhweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDhweCBzb2xpZCAjQzhFNkM5O1xuICAgICAgICAgICAgbGVmdDogMTAwJTtcbiAgICAgICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgICAgIHdpZHRoOiAwO1xuICAgICAgICAgICAgaGVpZ2h0OiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgICYubWVzc2FnZS13aXRoLWF2YXRhciB7XG4gICAgICAgIC5tZXNzYWdlLXRleHQsIC5tZXNzYWdlLW5hbWUsIC5tZXNzYWdlLWxhYmVsIHtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogQG1lc3NhZ2VzQXZhdGFyU2l6ZSArIDhweDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi5tZXNzYWdlLXJlY2VpdmVkIHtcbiAgICAtbXMtZmxleC1pdGVtLWFsaWduOiBzdGFydDtcbiAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG4gICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDtcbiAgICAuYWxpZ24taXRlbXMoZmxleC1zdGFydCk7XG4gICAgLm1lc3NhZ2UtdGV4dCB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDJweCAycHggMnB4IDBweDtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgICAgJjpiZWZvcmUge1xuICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgICAgICBib3JkZXItbGVmdDogOHB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAwcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgICBib3JkZXItYm90dG9tOiA4cHggc29saWQgI2ZmZjtcbiAgICAgICAgICAgIHJpZ2h0OiAxMDAlO1xuICAgICAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICAgICAgd2lkdGg6IDA7XG4gICAgICAgICAgICBoZWlnaHQ6IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLm1lc3NhZ2UtbmFtZSwgLm1lc3NhZ2UtbGFiZWwge1xuICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgIH1cbiAgICAmLm1lc3NhZ2Utd2l0aC1hdmF0YXIge1xuICAgICAgICAubWVzc2FnZS10ZXh0LCAubWVzc2FnZS1uYW1lLCAubWVzc2FnZS1sYWJlbCB7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogQG1lc3NhZ2VzQXZhdGFyU2l6ZSArIDhweDtcbiAgICAgICAgfVxuICAgIH0gICAgXG59XG5cbi5tZXNzYWdlLWFwcGVhci1mcm9tLWJvdHRvbSB7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IG1lc3NhZ2VBcHBlYXJGcm9tQm90dG9tIDQwMG1zO1xuICAgIGFuaW1hdGlvbjogbWVzc2FnZUFwcGVhckZyb21Cb3R0b20gNDAwbXM7XG59XG4ubWVzc2FnZS1hcHBlYXItZnJvbS10b3Age1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBtZXNzYWdlQXBwZWFyRnJvbVRvcCA0MDBtcztcbiAgICBhbmltYXRpb246IG1lc3NhZ2VBcHBlYXJGcm9tVG9wIDQwMG1zOyAgIFxufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWVzc2FnZUFwcGVhckZyb21Cb3R0b20ge1xuICAgIGZyb20ge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwxMDAlLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBtZXNzYWdlQXBwZWFyRnJvbUJvdHRvbSB7XG4gICAgZnJvbSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwxMDAlLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBtZXNzYWdlQXBwZWFyRnJvbVRvcCB7XG4gICAgZnJvbSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLC0xMDAlLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBtZXNzYWdlQXBwZWFyRnJvbVRvcCB7XG4gICAgZnJvbSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwtMTAwJSwwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59XG4iLCIvKiA9PT0gU3RhdHVzYmFyIG92ZXJsYXkgPT09ICovXG5odG1sLndpdGgtc3RhdHVzYmFyLW92ZXJsYXkgYm9keXtcbiAgICBwYWRkaW5nLXRvcDogMjBweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC5zdGF0dXNiYXItb3ZlcmxheSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAucGFuZWwge1xuICAgICAgICBwYWRkaW5nLXRvcDogMjBweDtcbiAgICB9XG59XG4uc3RhdHVzYmFyLW92ZXJsYXkge1xuICAgIGJhY2tncm91bmQ6IEB0aGVtZUNvbG9yO1xuICAgIHotaW5kZXg6IDEwMDAwOyAvLyBBIGJpdCBsb3dlciB0aGFuIC5tb2RhbHMtb3ZlcmxheVxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICAudHJhbnNpdGlvbihAcGFuZWxzRHVyYXRpb24pO1xufSIsIi8qID09PVxuICAgIFByZWxvYWRlclxuICAgIEJ5IFJ1ZGkgVGhldW5pc3NlbiAoaHR0cHM6Ly9naXRodWIuY29tL3J0aGV1bmlzc2VuL21kLXByZWxvYWRlcilcbj09PSAqL1xuLnByZWxvYWRlciB7XG4gICAgQGVhc2luZzogICAgICBjdWJpYy1iZXppZXIoLjgsLjAsLjQsLjgpO1xuXG4gICAgQHNwZWVkOiAgICAgIDEzMjBtczsgICAgICAgLy8gYW5pbWF0aW9uIHRpbWUgZm9yIGVhY2ggbG9vcFxuICAgIEBjb2xvcjogICAgICAjNzU3NTc1OyAgICAgIC8vIEJsdWUgQTIwMCBpbiB0aGUgTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGVcbiAgICBAbGluZWNhcDogICAgc3F1YXJlOyAgICAgICAvLyBjb3VsZCBiZSAncm91bmQnLCBidXQgdGhlIG9mZmljaWFsIG9uZSBpcyBzcXVhcmVcbiAgICBAbG9vcHM6ICAgICAgNTsgICAgICAgICAgICAvLyBudW1iZXIgb2YgcG9pbnRzIHdoZXJlIHRoZSBhcmMgbWVldHNcbiAgICBAYXJjOiAgICAgICAgMC43MjsgICAgICAgICAvLyBmcmFjdGlvbiBvZiB0aGUgY2lyY3VtZmVyZW5jZSB0aGF0IHRoZSBhcmMgZ3Jvd3MgdG9cbiAgICBAcGVyaW1ldGVyOiAgNjdweCAqIHBpKCk7ICAvLyBjaXJjdW1mZXJlbmNlIG9mIHRoZSByYXcgc3ZnIGlubmVyIGNyaWNsZVxuXG4gICAgZm9udC1zaXplOiAwO1xuXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAzMnB4O1xuICAgIGhlaWdodDogMzJweDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogcHJlbG9hZGVyLW91dGVyIEBzcGVlZCAqIEBsb29wcyAvIDIgbGluZWFyIGluZmluaXRlO1xuICAgIGFuaW1hdGlvbjogcHJlbG9hZGVyLW91dGVyIEBzcGVlZCAqIEBsb29wcyAvIDIgbGluZWFyIGluZmluaXRlO1xuXG4gICAgc3ZnIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IHByZWxvYWRlci1pbm5lciBAc3BlZWQgbGluZWFyIGluZmluaXRlO1xuICAgICAgICBhbmltYXRpb246IHByZWxvYWRlci1pbm5lciBAc3BlZWQgbGluZWFyIGluZmluaXRlO1xuXG4gICAgICAgIGNpcmNsZSB7XG4gICAgICAgICAgICBmaWxsOiBub25lO1xuICAgICAgICAgICAgc3Ryb2tlOiBAY29sb3I7XG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcDogQGxpbmVjYXA7XG4gICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogcHJlbG9hZGVyLWFyYyBAc3BlZWQgQGVhc2luZyBpbmZpbml0ZTtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogcHJlbG9hZGVyLWFyYyBAc3BlZWQgQGVhc2luZyBpbmZpbml0ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBALXdlYmtpdC1rZXlmcmFtZXMgcHJlbG9hZGVyLW91dGVyIHtcbiAgICAgICAgMCUge1xuICAgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgwKTtcbiAgICAgICAgfVxuICAgICAgICAxMDAlIHtcbiAgICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBAa2V5ZnJhbWVzIHByZWxvYWRlci1vdXRlciB7XG4gICAgICAgIDAlIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDApO1xuICAgICAgICB9XG4gICAgICAgIDEwMCUge1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEAtd2Via2l0LWtleWZyYW1lcyBwcmVsb2FkZXItaW5uZXIge1xuICAgICAgICAwJSB7XG4gICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC0zNjBkZWcgKiAoMSAtIEBhcmMpKTtcbiAgICAgICAgfVxuICAgICAgICAxMDAlIHtcbiAgICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQGtleWZyYW1lcyBwcmVsb2FkZXItaW5uZXIge1xuICAgICAgICAwJSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMzYwZGVnICogKDEgLSBAYXJjKSk7XG4gICAgICAgIH1cbiAgICAgICAgMTAwJSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBALXdlYmtpdC1rZXlmcmFtZXMgcHJlbG9hZGVyLWFyYyB7XG4gICAgICAgIDAlIHtcbiAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDEgQHBlcmltZXRlcjtcbiAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAwO1xuICAgICAgICB9XG4gICAgICAgIDQwJSB7XG4gICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBAYXJjICogQHBlcmltZXRlciwgQHBlcmltZXRlcjtcbiAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAwO1xuICAgICAgICB9XG4gICAgICAgIDEwMCUge1xuICAgICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSBAcGVyaW1ldGVyO1xuICAgICAgICAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IC1AYXJjICogQHBlcmltZXRlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBAa2V5ZnJhbWVzIHByZWxvYWRlci1hcmMge1xuICAgICAgICAwJSB7XG4gICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAxIEBwZXJpbWV0ZXI7XG4gICAgICAgICAgICBzdHJva2UtZGFzaG9mZnNldDogMDtcbiAgICAgICAgfVxuICAgICAgICA0MCUge1xuICAgICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogQGFyYyAqIEBwZXJpbWV0ZXIsIEBwZXJpbWV0ZXI7XG4gICAgICAgICAgICBzdHJva2UtZGFzaG9mZnNldDogMDtcbiAgICAgICAgfVxuICAgICAgICAxMDAlIHtcbiAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDEgQHBlcmltZXRlcjtcbiAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAtQGFyYyAqIEBwZXJpbWV0ZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG4ucHJlbG9hZGVyLWlubmVyIHtcbiAgICBAcHJlbG9hZGVyLWlubmVyLWVhc2U6IGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKTtcbiAgICBAcHJlbG9hZGVyLWlubmVyLWR1cmF0aW9uOiA1LjI1cztcbiAgICBAcHJlbG9hZGVyLWlubmVyLWNpcmNsZS1kdXJhdGlvbjogQHByZWxvYWRlci1pbm5lci1kdXJhdGlvbiAqIDAuMjU7XG4gICAgQHByZWxvYWRlci1pbm5lci1vdXRlci1kdXJhdGlvbjogQHByZWxvYWRlci1pbm5lci1kdXJhdGlvbiAqICg1LzkpO1xuXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogcHJlbG9hZGVyLWlubmVyLXJvdGF0ZSBAcHJlbG9hZGVyLWlubmVyLWR1cmF0aW9uIEBwcmVsb2FkZXItaW5uZXItZWFzZSBpbmZpbml0ZTtcbiAgICBhbmltYXRpb246IHByZWxvYWRlci1pbm5lci1yb3RhdGUgQHByZWxvYWRlci1pbm5lci1kdXJhdGlvbiBAcHJlbG9hZGVyLWlubmVyLWVhc2UgaW5maW5pdGU7XG4gICAgLnByZWxvYWRlci1pbm5lci1nYXAge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHdpZHRoOiAycHg7XG4gICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBib3JkZXItdG9wOiA0cHggc29saWQgIzc1NzU3NTtcbiAgICB9XG4gICAgLnByZWxvYWRlci1pbm5lci1sZWZ0LCAucHJlbG9hZGVyLWlubmVyLXJpZ2h0IHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgd2lkdGg6IDUwJTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG4gICAgLnByZWxvYWRlci1pbm5lci1oYWxmLWNpcmNsZSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHdpZHRoOiAyMDAlO1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBib3JkZXI6IDRweCBzb2xpZCAjNzU3NTc1O1xuICAgICAgICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAoQHByZWxvYWRlci1pbm5lci1kdXJhdGlvbiAqIDAuMjUpO1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IEBwcmVsb2FkZXItaW5uZXItZWFzZTtcbiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogKEBwcmVsb2FkZXItaW5uZXItZHVyYXRpb24gKiAwLjI1KTtcbiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogQHByZWxvYWRlci1pbm5lci1lYXNlO1xuICAgIH1cbiAgICAucHJlbG9hZGVyLXdoaXRlICYge1xuICAgICAgICAucHJlbG9hZGVyLWlubmVyLWdhcCwgLnByZWxvYWRlci1pbm5lci1oYWxmLWNpcmNsZSB7XG4gICAgICAgICAgICBib3JkZXItY29sb3I6ICNmZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnByZWxvYWRlci1pbm5lci1sZWZ0IHtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgLnByZWxvYWRlci1pbm5lci1oYWxmLWNpcmNsZSB7XG4gICAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogcHJlbG9hZGVyLWxlZnQtcm90YXRlO1xuICAgICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHByZWxvYWRlci1sZWZ0LXJvdGF0ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAucHJlbG9hZGVyLWlubmVyLXJpZ2h0IHtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIC5wcmVsb2FkZXItaW5uZXItaGFsZi1jaXJjbGUge1xuICAgICAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgICAgICBib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHByZWxvYWRlci1yaWdodC1yb3RhdGU7XG4gICAgICAgICAgICBhbmltYXRpb24tbmFtZTogcHJlbG9hZGVyLXJpZ2h0LXJvdGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLmNvbG9yLW11bHRpICYge1xuICAgICAgICAucHJlbG9hZGVyLWlubmVyLWxlZnQge1xuICAgICAgICAgICAgLnByZWxvYWRlci1pbm5lci1oYWxmLWNpcmNsZSB7XG4gICAgICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogcHJlbG9hZGVyLWxlZnQtcm90YXRlLW11bHRpY29sb3I7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHByZWxvYWRlci1sZWZ0LXJvdGF0ZS1tdWx0aWNvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC5wcmVsb2FkZXItaW5uZXItcmlnaHQge1xuICAgICAgICAgICAgLnByZWxvYWRlci1pbm5lci1oYWxmLWNpcmNsZSB7XG4gICAgICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogcHJlbG9hZGVyLXJpZ2h0LXJvdGF0ZS1tdWx0aWNvbG9yO1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1uYW1lOiBwcmVsb2FkZXItcmlnaHQtcm90YXRlLW11bHRpY29sb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByZWxvYWRlci1sZWZ0LXJvdGF0ZSB7XG4gICAgMCUsIDEwMCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzMGRlZyk7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJlbG9hZGVyLWxlZnQtcm90YXRlIHtcbiAgICAwJSwgMTAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDEzMGRlZyk7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKTtcbiAgICB9XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgcHJlbG9hZGVyLXJpZ2h0LXJvdGF0ZSB7XG4gICAgMCUsIDEwMCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC0xMzBkZWcpO1xuICAgIH1cbiAgICA1MCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDVkZWcpO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJlbG9hZGVyLXJpZ2h0LXJvdGF0ZSB7XG4gICAgMCUsIDEwMCUge1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKTtcbiAgICB9XG4gICAgNTAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoNWRlZyk7XG4gICAgfVxufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgcHJlbG9hZGVyLWlubmVyLXJvdGF0ZSB7XG4gICAgMTIuNSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZyk7XG4gICAgfVxuICAgIDI1JSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTtcbiAgICB9XG4gICAgMzcuNSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQwNWRlZyk7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNTQwZGVnKTtcbiAgICB9XG4gICAgNjIuNSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDY3NWRlZyk7XG4gICAgfVxuICAgIDc1JSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoODEwZGVnKTtcbiAgICB9XG4gICAgODcuNSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDk0NWRlZyk7XG4gICAgfVxuICAgIDEwMCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJlbG9hZGVyLWlubmVyLXJvdGF0ZSB7XG4gICAgMTIuNSUge1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpO1xuICAgIH1cbiAgICAyNSUge1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xuICAgIH1cbiAgICAzNy41JSB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDQwNWRlZyk7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDU0MGRlZyk7XG4gICAgfVxuICAgIDYyLjUlIHtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoNjc1ZGVnKTtcbiAgICB9XG4gICAgNzUlIHtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoODEwZGVnKTtcbiAgICB9XG4gICAgODcuNSUge1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpO1xuICAgIH1cbiAgICAxMDAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTA4MGRlZyk7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByZWxvYWRlci1sZWZ0LXJvdGF0ZS1tdWx0aWNvbG9yIHtcbiAgICAwJSxcbiAgICAxMDAlIHtcbiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6ICM0Mjg1RjQ7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKTtcbiAgICB9XG4gICAgNzUlIHtcbiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6ICMxQjlBNTk7XG4gICAgICAgIGJvcmRlci10b3AtY29sb3I6ICMxQjlBNTk7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiAjRjdDMjIzO1xuICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAjRjdDMjIzO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC01ZGVnKTtcbiAgICB9XG4gICAgMjUlIHtcbiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6ICNERTNFMzU7XG4gICAgICAgIGJvcmRlci10b3AtY29sb3I6ICNERTNFMzU7XG4gICAgfVxufVxuQGtleWZyYW1lcyBwcmVsb2FkZXItbGVmdC1yb3RhdGUtbXVsdGljb2xvciB7XG4gICAgMCUsXG4gICAgMTAwJSB7XG4gICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiAjNDI4NUY0O1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpO1xuICAgIH1cbiAgICA3NSUge1xuICAgICAgICBib3JkZXItbGVmdC1jb2xvcjogIzFCOUE1OTtcbiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogIzFCOUE1OTtcbiAgICB9XG4gICAgNTAlIHtcbiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6ICNGN0MyMjM7XG4gICAgICAgIGJvcmRlci10b3AtY29sb3I6ICNGN0MyMjM7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKTtcbiAgICB9XG4gICAgMjUlIHtcbiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6ICNERTNFMzU7XG4gICAgICAgIGJvcmRlci10b3AtY29sb3I6ICNERTNFMzU7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByZWxvYWRlci1yaWdodC1yb3RhdGUtbXVsdGljb2xvciB7XG4gICAgMCUsXG4gICAgMTAwJSB7XG4gICAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogIzQyODVGNDtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKTtcbiAgICB9XG4gICAgNzUlIHtcbiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjMUI5QTU5O1xuICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAjMUI5QTU5O1xuICAgIH1cbiAgICA1MCUge1xuICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6ICNGN0MyMjM7XG4gICAgICAgIGJvcmRlci10b3AtY29sb3I6ICNGN0MyMjM7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNWRlZyk7XG4gICAgfVxuICAgIDI1JSB7XG4gICAgICAgIGJvcmRlci10b3AtY29sb3I6ICNERTNFMzU7XG4gICAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogI0RFM0UzNTtcbiAgICB9XG59XG5Aa2V5ZnJhbWVzIHByZWxvYWRlci1yaWdodC1yb3RhdGUtbXVsdGljb2xvciB7XG4gICAgMCUsXG4gICAgMTAwJSB7XG4gICAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogIzQyODVGNDtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZyk7XG4gICAgfVxuICAgIDc1JSB7XG4gICAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogIzFCOUE1OTtcbiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogIzFCOUE1OTtcbiAgICB9XG4gICAgNTAlIHtcbiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjRjdDMjIzO1xuICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAjRjdDMjIzO1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg1ZGVnKTtcbiAgICB9XG4gICAgMjUlIHtcbiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogI0RFM0UzNTtcbiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjREUzRTM1O1xuICAgIH1cbn0iLCIvKiA9PT0gUHJvZ3Jlc3MgQmFyID09PSAqL1xuLnByb2dyZXNzYmFyLCAucHJvZ3Jlc3NiYXItaW5maW5pdGUge1xuICAgIGhlaWdodDogNHB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC50cmFuc2Zvcm0tb3JpZ2luKGNlbnRlciBib3R0b20pO1xuICAgIGJhY2tncm91bmQ6IHJnYmEocmVkKEB0aGVtZUNvbG9yKSwgZ3JlZW4oQHRoZW1lQ29sb3IpLCBibHVlKEB0aGVtZUNvbG9yKSwgMC41KTtcbn1cbi8vIERldGVybWluZWRcbi5wcm9ncmVzc2JhciB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDtcbiAgICBzcGFuIHtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKTtcbiAgICAgICAgLnRyYW5zaXRpb24oMTUwbXMpO1xuICAgIH1cbn1cbi8vIEluZmluaXRlXG4ucHJvZ3Jlc3NiYXItaW5maW5pdGUge1xuICAgIHotaW5kZXg6IDE1MDAwO1xuICAgICY6YmVmb3JlLCAmOmFmdGVyIHtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgLnRyYW5zZm9ybS1vcmlnaW4obGVmdCBjZW50ZXIpO1xuICAgIH1cbiAgICAmOmJlZm9yZSB7XG4gICAgICAgIC5hbmltYXRpb24ocHJvZ3Jlc3NiYXItaW5maW5pdGUtMSAycyBsaW5lYXIgaW5maW5pdGUpO1xuICAgIH1cbiAgICAmOmFmdGVyIHtcbiAgICAgICAgLmFuaW1hdGlvbihwcm9ncmVzc2Jhci1pbmZpbml0ZS0yIDJzIGxpbmVhciBpbmZpbml0ZSk7XG4gICAgfVxuICAgIGh0bWwud2l0aC1zdGF0dXNiYXItb3ZlcmxheSBib2R5ID4gJiwgaHRtbC53aXRoLXN0YXR1c2Jhci1vdmVybGF5IC5mcmFtZXdvcms3LXJvb3QgPiAmIHtcbiAgICAgICAgdG9wOiAyMHB4O1xuICAgIH1cbn1cblxuXG4vLyBNdWx0aWNvbG9yXG4ucHJvZ3Jlc3NiYXItaW5maW5pdGUuY29sb3ItbXVsdGkge1xuICAgIGJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDtcbiAgICAmOmJlZm9yZSwgJjphZnRlciB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBhbmltYXRpb246IG5vbmU7XG4gICAgfVxuICAgICY6YmVmb3JlIHtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgLmFuaW1hdGlvbihwcm9ncmVzc2Jhci1pbmZpbml0ZS1tdWx0aWNvbG9yLWJnIDNzIHN0ZXAtZW5kIGluZmluaXRlKTtcbiAgICB9XG4gICAgJjphZnRlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIC5hbmltYXRpb24ocHJvZ3Jlc3NiYXItaW5maW5pdGUtbXVsdGljb2xvci1maWxsIDNzIGxpbmVhciBpbmZpbml0ZSk7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKGNlbnRlciBjZW50ZXIpO1xuICAgIH1cbn1cblxuYm9keSwgLnZpZXcsIC52aWV3cywgLnBhZ2UsIC5wYW5lbCwgLnBvcHVwLCAuZnJhbWV3b3JrNy1yb290IHtcbiAgICA+IC5wcm9ncmVzc2JhciwgPiAucHJvZ3Jlc3NiYXItaW5maW5pdGUge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgei1pbmRleDogMTUwMDA7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKGNlbnRlciB0b3ApO1xuICAgIH1cbn1cbi8vIEFuaW1hdGlvbnNcbi5wcm9ncmVzc2Jhci1pbiB7XG4gICAgLmFuaW1hdGlvbihwcm9ncmVzc2Jhci1pbiAzMDBtcyBmb3J3YXJkcyk7XG59XG4ucHJvZ3Jlc3NiYXItb3V0IHtcbiAgICAuYW5pbWF0aW9uKHByb2dyZXNzYmFyLW91dCAzMDBtcyBmb3J3YXJkcyk7XG59XG5cbmh0bWwud2l0aC1zdGF0dXNiYXItb3ZlcmxheSBib2R5ID4gLnByb2dyZXNzYmFyLCBodG1sLndpdGgtc3RhdHVzYmFyLW92ZXJsYXkgLmZyYW1ld29yazctcm9vdCA+IC5wcm9ncmVzc2JhciB7XG4gICAgdG9wOiAyMHB4O1xufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzYmFyLWluIHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWSgwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVZKDEpO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJvZ3Jlc3NiYXItaW4ge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWSgwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWSgxKTtcbiAgICB9XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgcHJvZ3Jlc3NiYXItb3V0IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWSgxKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVZKDApO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJvZ3Jlc3NiYXItb3V0IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMSk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMCk7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzYmFyLWluZmluaXRlLTEge1xuICAgIDAlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwJSkgc2NhbGVYKDAuMSk7XG4gICAgfVxuICAgIDI1JSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDMwJSkgc2NhbGVYKDAuNik7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpIHNjYWxlWCgxKTtcbiAgICB9XG4gICAgMTAwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpIHNjYWxlWCgxKTtcbiAgICB9XG59XG5Aa2V5ZnJhbWVzIHByb2dyZXNzYmFyLWluZmluaXRlLTEge1xuICAgIDAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMCUpIHNjYWxlWCgwLjEpO1xuICAgIH1cbiAgICAyNSUge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMzAlKSBzY2FsZVgoMC42KTtcbiAgICB9XG4gICAgNTAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpIHNjYWxlWCgxKTtcbiAgICB9XG4gICAgMTAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKSBzY2FsZVgoMSk7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzYmFyLWluZmluaXRlLTIge1xuICAgIDAlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpIHNjYWxlWCgxKTtcbiAgICB9XG4gICAgNDAlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpIHNjYWxlWCgxKTtcbiAgICB9XG4gICAgNzUlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNjAlKSBzY2FsZVgoMC4zNSk7XG4gICAgfVxuICAgIDkwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpIHNjYWxlWCgwLjEpO1xuICAgIH1cbiAgICAxMDAlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSkgc2NhbGVYKDAuMSk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBwcm9ncmVzc2Jhci1pbmZpbml0ZS0yIHtcbiAgICAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSkgc2NhbGVYKDEpO1xuICAgIH1cbiAgICA0MCUge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpIHNjYWxlWCgxKTtcbiAgICB9XG4gICAgNzUlIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDYwJSkgc2NhbGVYKDAuMzUpO1xuICAgIH1cbiAgICA5MCUge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSkgc2NhbGVYKDAuMSk7XG4gICAgfVxuICAgIDEwMCUge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSkgc2NhbGVYKDAuMSk7XG4gICAgfVxufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgcHJvZ3Jlc3NiYXItaW5maW5pdGUtbXVsdGljb2xvci1iZyB7XG4gICAgMCUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JlZW47XG4gICAgfVxuICAgIDI1JSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEByZWQ7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBibHVlO1xuICAgIH1cbiAgICA3NSUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAeWVsbG93O1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJvZ3Jlc3NiYXItaW5maW5pdGUtbXVsdGljb2xvci1iZyB7XG4gICAgMCUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JlZW47XG4gICAgfVxuICAgIDI1JSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEByZWQ7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBibHVlO1xuICAgIH1cbiAgICA3NSUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAeWVsbG93O1xuICAgIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBwcm9ncmVzc2Jhci1pbmZpbml0ZS1tdWx0aWNvbG9yLWZpbGwge1xuICAgIDAlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgwKTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHJlZDtcbiAgICB9XG4gICAgMjQuOSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAcmVkO1xuICAgIH1cbiAgICAyNSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmx1ZTtcbiAgICB9XG4gICAgNDkuOSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmx1ZTtcbiAgICB9XG4gICAgNTAlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgwKTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHllbGxvdztcbiAgICB9XG4gICAgNzQuOSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAeWVsbG93O1xuICAgIH1cbiAgICA3NSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JlZW47XG4gICAgfVxuICAgIDEwMCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JlZW47XG4gICAgfVxufVxuQGtleWZyYW1lcyBwcm9ncmVzc2Jhci1pbmZpbml0ZS1tdWx0aWNvbG9yLWZpbGwge1xuICAgIDAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCk7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEByZWQ7XG4gICAgfVxuICAgIDI0LjklIHtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSk7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEByZWQ7XG4gICAgfVxuICAgIDI1JSB7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmx1ZTtcbiAgICB9XG4gICAgNDkuOSUge1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGJsdWU7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAeWVsbG93O1xuICAgIH1cbiAgICA3NC45JSB7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAeWVsbG93O1xuICAgIH1cbiAgICA3NSUge1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgwKTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGdyZWVuO1xuICAgIH1cbiAgICAxMDAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSk7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBncmVlbjtcbiAgICB9XG59IiwiLyogPT09IENvbHVtbnMgUGlja2VyID09PSAqL1xuLnBpY2tlci1jb2x1bW5zIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDI2MHB4O1xuICAgIHotaW5kZXg6IDExNTAwO1xuICAgICYucGlja2VyLW1vZGFsLWlubGluZSB7XG4gICAgICAgIGhlaWdodDogMjAwcHg7XG4gICAgfVxuICAgIEBtZWRpYSAob3JpZW50YXRpb246IGxhbmRzY2FwZSkgYW5kIChtYXgtaGVpZ2h0OiA0MTVweCkge1xuICAgICAgICAmOm5vdCgucGlja2VyLW1vZGFsLWlubGluZSkge1xuICAgICAgICAgICAgaGVpZ2h0OiAyMDBweDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi5wb3BvdmVyLnBvcG92ZXItcGlja2VyLWNvbHVtbnMge1xuICAgIHdpZHRoOiAyODBweDtcbiAgICAudG9vbGJhciB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDJweCAycHggMCAwO1xuICAgIH1cbn1cbi5waWNrZXItaXRlbXMge1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmp1c3RpZnktY29udGVudChjZW50ZXIpO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICAgIC13ZWJraXQtbWFzay1ib3gtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGJvdHRvbSwgdHJhbnNwYXJlbnQsIHRyYW5zcGFyZW50IDUlLCB3aGl0ZSAyMCUsIHdoaXRlIDgwJSwgdHJhbnNwYXJlbnQgOTUlLCB0cmFuc3BhcmVudCk7XG4gICAgLXdlYmtpdC1tYXNrLWJveC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHRvcCwgdHJhbnNwYXJlbnQsIHRyYW5zcGFyZW50IDUlLCB3aGl0ZSAyMCUsIHdoaXRlIDgwJSwgdHJhbnNwYXJlbnQgOTUlLCB0cmFuc3BhcmVudCk7XG59XG4ucGlja2VyLWl0ZW1zLWNvbCB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWF4LWhlaWdodDogMTAwJTtcblxuICAgICYucGlja2VyLWl0ZW1zLWNvbC1sZWZ0IHtcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICB9XG4gICAgJi5waWNrZXItaXRlbXMtY29sLWNlbnRlciB7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICB9XG4gICAgJi5waWNrZXItaXRlbXMtY29sLXJpZ2h0IHtcbiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgfVxuICAgICYucGlja2VyLWl0ZW1zLWNvbC1kaXZpZGVyIHtcbiAgICAgICAgY29sb3I6IHJnYmEoMCwwLDAsMC44Nyk7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5hbGlnbi1pdGVtcyhjZW50ZXIpO1xuICAgIH1cbn1cbi5waWNrZXItaXRlbXMtY29sLXdyYXBwZXIge1xuICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICBcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7XG59XG4ucGlja2VyLWl0ZW0ge1xuICAgIGhlaWdodDogMzZweDtcbiAgICBsaW5lLWhlaWdodDogMzZweDtcbiAgICBwYWRkaW5nOiAwIDEwcHg7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBjb2xvcjogcmdiYSgwLDAsMCwwLjU0KTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAucGlja2VyLWl0ZW1zLWNvbC1hYnNvbHV0ZSAme1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICAgICYucGlja2VyLWl0ZW0tZmFyIHtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgfVxuICAgICYucGlja2VyLXNlbGVjdGVkIHtcbiAgICAgICAgY29sb3I6IHJnYmEoMCwwLDAsMC44Nyk7XG4gICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwwLDApIHJvdGF0ZVgoMGRlZykpO1xuICAgIH1cbn1cbi5waWNrZXItY2VudGVyLWhpZ2hsaWdodCB7XG4gICAgaGVpZ2h0OiAzNnB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgdG9wOiA1MCU7XG4gICAgbWFyZ2luLXRvcDogLTE4cHg7XG4gICAgLmhhaXJsaW5lKHRvcCwgcmdiYSgwLDAsMCwwLjE1KSk7XG4gICAgLmhhaXJsaW5lKGJvdHRvbSwgcmdiYSgwLDAsMCwwLjE1KSk7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG4vLyAzRCBQaWNrZXJcbi5waWNrZXItM2Qge1xuICAgIC5waWNrZXItaXRlbXMge1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAtd2Via2l0LXBlcnNwZWN0aXZlOiAxMjAwcHg7XG4gICAgICAgIHBlcnNwZWN0aXZlOiAxMjAwcHg7XG4gICAgfVxuICAgIC5waWNrZXItaXRlbXMtY29sLCAucGlja2VyLWl0ZW1zLWNvbC13cmFwcGVyLCAucGlja2VyLWl0ZW0ge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgICAgIHRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgfVxuICAgIC5waWNrZXItaXRlbXMtY29sIHtcbiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgfVxuICAgIC5waWNrZXItaXRlbSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlciAtMTEwcHg7XG4gICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXIgLTExMHB4O1xuICAgICAgICAtd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xuICAgIH1cbn0iLCIvKiA9PT0gTm90aWZpY2F0aW9ucyA9PT0gKi9cbkBub3RpZmljYXRpb25zRHVyYXRpb246IDQ1MG1zO1xuLm5vdGlmaWNhdGlvbnMge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICB6LWluZGV4OiAxMDkwMDtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbWFyZ2luOiAwO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgbWF4LWhlaWdodDogMTAwJTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDtcbiAgICAudHJhbnNpdGlvbihAbm90aWZpY2F0aW9uc0R1cmF0aW9uKTtcbiAgICAtd2Via2l0LXBlcnNwZWN0aXZlOjEyMDBweDtcbiAgICBwZXJzcGVjdGl2ZToxMjAwcHg7XG5cbiAgICAmLmxpc3QtYmxvY2sgPiB1bCB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUodG9wKTtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICBtYXgtd2lkdGg6IDU2OHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiAjMzIzMjMyO1xuICAgICAgICBtYXJnaW46IDAgYXV0bztcbiAgICB9XG4gICAgLml0ZW0tY29udGVudCB7XG4gICAgICAgIC5hbGlnbi1pdGVtcyhmbGV4LXN0YXJ0KTtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAyNHB4O1xuICAgIH1cbiAgICAuaXRlbS10aXRsZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgICAgICAgcGFkZGluZy10b3A6IDE0cHg7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAxNHB4O1xuICAgIH1cbiAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDI0cHg7XG4gICAgICAgIHBhZGRpbmctdG9wOiAwO1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgIH1cbiAgICAuaXRlbS1hZnRlciB7XG4gICAgICAgIG1heC1oZWlnaHQ6IG5vbmU7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxNnB4O1xuICAgIH1cbiAgICAuYnV0dG9uLmNsb3NlLW5vdGlmaWNhdGlvbiB7XG4gICAgICAgIGNvbG9yOiBsaWdodGVuKHNhdHVyYXRlKEB0aGVtZUNvbG9yLCAxMCUpLCAxMCUpO1xuICAgIH1cbiAgICAubm90aWZpY2F0aW9uLWl0ZW0ge1xuICAgICAgICBtYXJnaW46IDAgYXV0bztcbiAgICAgICAgLnRyYW5zaXRpb24oQG5vdGlmaWNhdGlvbnNEdXJhdGlvbik7XG4gICAgICAgIC5kZWxheSgxMDBtcyk7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxuICAgIC5ub3RpZmljYXRpb24taGlkZGVuIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgLmRlbGF5KDBtcyk7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxuICAgIC5ub3RpZmljYXRpb24taXRlbS1yZW1vdmluZyB7XG4gICAgICAgIC5kZWxheSgwbXMpO1xuICAgIH1cbiAgICBAbWVkaWEgKG1pbi13aWR0aDogNTY5cHgpIHtcbiAgICAgICAgJi5saXN0LWJsb2NrID4gdWwge1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgICAgICAgICAgd2lkdGg6IGF1dG87XG4gICAgICAgICAgICBtaW4td2lkdGg6IDI4OHB4O1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qID09PSBEaXNhYmxlZCBlbGVtZW50cyA9PT0gKi9cbi5kaXNhYmxlZCwgW2Rpc2FibGVkXSB7XG4gICAgb3BhY2l0eTogMC41NTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAuZGlzYWJsZWQgJiwgW2Rpc2FibGVkXSAmIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG59IiwiLy8gQ29udGFpbmVyXG5cbi5waG9uZS5hbmRyb2lkIHtcbiAgLmNvbnRhaW5lci1lZGl0IHtcblxuICAgIC5wYWdlLWNvbnRlbnQge1xuICAgICAgLmxpc3QtYmxvY2s6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAtMXB4O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4uY29udGFpbmVyLWVkaXQsXG4uY29udGFpbmVyLWFkZCxcbi5jb250YWluZXItc2V0dGluZ3Mge1xuICAmLnBvcG92ZXIge1xuICAgIHdpZHRoOiAzNjBweDtcbiAgfVxufVxuXG4uc2V0dGluZ3Mge1xuICAmLnBvcHVwLFxuICAmLnBvcG92ZXIge1xuICAgIC5saXN0LWJsb2NrIHtcbiAgICAgIG1hcmdpbjogMzJweCAwO1xuXG4gICAgICB1bCB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgICB9XG5cbiAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuXG4gICAgICAgIGxpOmZpcnN0LWNoaWxkIGEge1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLFxuICAgIC5wb3BvdmVyLWlubmVyIHtcbiAgICAgID4gLmNvbnRlbnQtYmxvY2sge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLnBvcG92ZXItdmlldyB7XG4gICAgICBib3JkZXItcmFkaXVzOiAzcHg7XG5cbiAgICAgID4gLnBhZ2VzIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5jYXRlZ29yaWVzIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG5cbiAgICA+IC50b29sYmFyIHtcbiAgICAgIHRvcDogMDtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG4gIH1cbiAgLnBvcG92ZXItaW5uZXIge1xuICAgIGhlaWdodDogNDAwcHg7XG4gIH1cbn0iLCIvLyBEYXRhIHZpZXdcblxuLmRhdGF2aWV3IHtcbiAgLnJvdyB7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XG4gIH1cblxuICB1bCB7XG4gICAgcGFkZGluZzogMCAxMHB4O1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XG5cbiAgICBsaSB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICB9XG5cbiAgLmFjdGl2ZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDE7XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBjb250ZW50OiAnJztcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgcmlnaHQ6IC01cHg7XG4gICAgICBib3R0b206IC01cHg7XG4gICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxjaXJjbGUgZmlsbD1cIiNmZmZcIiBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCIxMVwiLz48cGF0aCBkPVwiTTExLDIxQTEwLDEwLDAsMSwxLDIxLDExLDEwLDEwLDAsMCwxLDExLDIxaDBaTTE3LjQsNy4zMkwxNy4wNiw3YTAuNDgsMC40OCwwLDAsMC0uNjcsMGwtNyw2Ljg0TDYuOTUsMTEuMjRhMC41MSwwLjUxLDAsMCwwLS41OS4wOEw2LDExLjY2YTAuNTgsMC41OCwwLDAsMCwwLC42NWwzLjE5LDMuMzVhMC4zOCwwLjM4LDAsMCwwLC4zOSwwTDE3LjQsOGEwLjQ4LDAuNDgsMCwwLDAsMC0uNjdoMFpcIi8+PC9nPjwvc3ZnPicpO1xuICAgIH1cbiAgfVxufSIsIi8vIExpc3QgZXh0ZW5kXG5cbi5pdGVtLWNvbnRlbnR7XG4gIC5pdGVtLWFmdGVyIHtcbiAgICAmLnNwbGl0dGVyIHtcbiAgICAgIGxhYmVsIHtcbiAgICAgICAgY29sb3I6ICMwMDA7XG4gICAgICAgIG1hcmdpbjowIDVweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gICAgICB9XG5cbiAgICAgIC5idXR0b24ge1xuICAgICAgICBtaW4td2lkdGg6IDQwcHg7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgICYudmFsdWUge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBtaW4td2lkdGg6IDUwcHg7XG4gICAgICBjb2xvcjogQGJsYWNrO1xuICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICB9XG4gIH1cblxuICAmLmJ1dHRvbnMge1xuICAgIC5pdGVtLWlubmVyIHtcbiAgICAgIHBhZGRpbmctdG9wOiAwO1xuICAgICAgcGFkZGluZy1ib3R0b206IDA7XG5cbiAgICAgID4gLnJvdyB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuXG4gICAgICAgIC5idXR0b24ge1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xuICAgICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7XG5cbiAgICAgICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICYuYWN0aXZlIHtcbiAgICAgICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHRoZW1lQ29sb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLmNvbG9yLXByZXZpZXcge1xuICAgIHdpZHRoOiAzMHB4O1xuICAgIGhlaWdodDogMzBweDtcbiAgICBib3JkZXItcmFkaXVzOiAxNnB4O1xuICAgIG1hcmdpbi10b3A6IC0zcHg7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwwLDAsMC4xNSkgaW5zZXQ7XG4gIH1cbn1cblxuLml0ZW0tbGluayB7XG4gICYubm8taW5kaWNhdG9yIHtcbiAgICAuaXRlbS1pbm5lciB7XG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgICAgcGFkZGluZy1yaWdodDogMTZweDtcbiAgICB9XG4gIH1cbn1cblxuLnBvcG92ZXIgLmxpc3QtYmxvY2s6bGFzdC1jaGlsZCBsaTpsYXN0LWNoaWxkIC5idXR0b25zIGEge1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59IiwiLy8gQ29udGV4dCBtZW51XG5cbi5kb2N1bWVudC1tZW51IHtcbiAgd2lkdGg6IGF1dG87XG4gIGxpbmUtaGVpZ2h0OiAxICFpbXBvcnRhbnQ7XG4gIHotaW5kZXg6IDEyNTAwO1xuXG4gIC5wb3BvdmVyLWlubmVyIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG5cbiAgLmxpc3QtYmxvY2sge1xuICAgIHdoaXRlLXNwYWNlOiBwcmU7XG5cbiAgICB1bCB7XG4gICAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgfVxuXG4gICAgbGkge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIH1cblxuICAgIC5pdGVtLWxpbmsge1xuICAgICAgaHRtbC5waG9uZSAmIHtcbiAgICAgICAgcGFkZGluZzogMCAxMHB4O1xuICAgICAgfVxuICAgIH1cbiAgfVxufSIsIi8vIENvbG9yIHBhbGV0dGVcblxuLmNvbG9yLXBhbGV0dGUge1xuICBhIHtcbiAgICBmbGV4LWdyb3c6IDE7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1pbi13aWR0aDogMTBweDtcbiAgICBtaW4taGVpZ2h0OiAyNnB4O1xuICAgIG1hcmdpbjogMXB4IDFweCAwIDA7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwwLDAsMC4xNSkgaW5zZXQ7XG5cbiAgICAmLmFjdGl2ZSB7XG4gICAgICAmOmFmdGVyIHtcbiAgICAgICAgY29udGVudDonICc7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHdoaXRlLCAwIDAgMCA0cHggQHRoZW1lQ29sb3I7XG4gICAgICAgIHotaW5kZXg6IDE7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDFweDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLnRyYW5zcGFyZW50IHtcbiAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTtcbiAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHg9JzBweCcgeT0nMHB4JyB2aWV3Qm94PScwIDAgMjIgMjInIHhtbDpzcGFjZT0ncHJlc2VydmUnPjxsaW5lIHN0cm9rZT0nI2ZmMDAwMCcgc3Ryb2tlLWxpbmVjYXA9J3VuZGVmaW5lZCcgc3Ryb2tlLWxpbmVqb2luPSd1bmRlZmluZWQnIGlkPSdzdmdfMScgeTI9JzAnIHgyPScyMicgeTE9JzIyJyB4MT0nMCcgc3Ryb2tlLXdpZHRoPScyJyBmaWxsPSdub25lJy8+PC9zdmc+XCIpO1xuICAgIH1cbiAgfVxuXG4gIC50aGVtZS1jb2xvcnMge1xuICAgIC5pdGVtLWlubmVyIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIH1cbiAgfVxuXG4gIC5zdGFuZGFydC1jb2xvcnMge1xuICAgIC5pdGVtLWlubmVyIHtcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIH1cbiAgfVxuXG4gICYubGlzdC1ibG9jazpsYXN0LWNoaWxkIGxpOmxhc3QtY2hpbGQgYSB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxufSIsIi8vIEFib3V0XG5cbi5hYm91dCB7XG4gIC5wYWdlLWNvbnRlbnQge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxuXG4gIC5jb250ZW50LWJsb2NrOmZpcnN0LWNoaWxkIHtcbiAgICBtYXJnaW46IDE1cHggMDtcbiAgfVxuXG4gIC5jb250ZW50LWJsb2NrIHtcbiAgICBtYXJnaW46IDAgYXV0byAxNXB4O1xuXG4gICAgYSB7XG4gICAgICBjb2xvcjogIzAwMDtcbiAgICB9XG4gIH1cblxuICBoMyB7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICBtYXJnaW46IDA7XG5cbiAgICAmLnZlbmRvciB7XG4gICAgICBjb2xvcjogIzAwMDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgICAgbWFyZ2luLXRvcDogMTVweDtcbiAgICB9XG4gIH1cblxuICBwID4gbGFiZWwge1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICB9XG5cbiAgLmxvZ28ge1xuICAgIGJhY2tncm91bmQ6IHVybCgnLi4vLi4vLi4vLi4vY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvaW1nL2Fib3V0L29ubHlvZmZpY2Uuc3ZnJykgbm8tcmVwZWF0IGNlbnRlcjtcbiAgfVxufSIsIi8vIFNlYXJjaFxuXG4udGFibGV0IHtcbiAgLnNlYXJjaGJhci5kb2N1bWVudCB7XG4gICAgLmxlZnQge1xuICAgICAgbWluLXdpZHRoOiAxNXB4O1xuICAgIH1cblxuICAgIC5jZW50ZXIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XG5cbiAgICAgIC5zZWFyY2hiYXIge1xuICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcblxuICAgICAgICAmLnNlYXJjaCB7XG4gICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5AcGhvbmVTZWFyY2hIZWlnaHQ6IDQ4cHg7XG5cbi5waG9uZSB7XG4gIC5zZWFyY2hiYXIuZG9jdW1lbnQge1xuICAgIC5sZWZ0LFxuICAgIC5jZW50ZXIsXG4gICAgLnJpZ2h0IHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgLmxlZnQge1xuICAgICAgbWluLXdpZHRoOiAxNXB4O1xuICAgIH1cblxuICAgIC5jZW50ZXIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBvdmVyZmxvdzogdmlzaWJsZTtcblxuICAgICAgLnNlYXJjaGJhciB7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLnJpZ2h0IHtcbiAgICAgID4gcCB7XG4gICAgICAgIG1hcmdpbjogMDtcblxuICAgICAgICBhLmxpbmsge1xuICAgICAgICAgIGhlaWdodDogQHBob25lU2VhcmNoSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59IiwiLy8gSWNvbnNcbmkuaWNvbiB7XG4gICYuaWNvbi1leHBhbmQtdXAge1xuICAgIHdpZHRoOiAxN3B4O1xuICAgIGhlaWdodDogMTdweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe2JsYWNrfVwiPjxnPjxwb2x5Z29uIHBvaW50cz1cIjEwLjksNS4xIDIsMTMuOSA0LjEsMTYgMTEuMSw5LjIgMTcuOSwxNiAyMCwxMy45IDExLjIsNS4xIDExLjEsNSBcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1leHBhbmQtZG93biB7XG4gICAgd2lkdGg6IDE3cHg7XG4gICAgaGVpZ2h0OiAxN3B4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7YmxhY2t9XCI+PGc+PHBvbHlnb24gcG9pbnRzPVwiMTAuOSwxNi45IDIsOC4xIDQuMSw2IDExLjEsMTIuOCAxNy45LDYgMjAsOC4xIDExLjIsMTYuOSAxMS4xLDE3IFwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXNlYXJjaCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTE5LjUsMTYuOEwxNiwxMy4zYzAuNy0xLjEsMS4xLTIuNCwxLjEtMy44QzE3LDUuNCwxMy42LDIsOS41LDJTMiw1LjQsMiw5LjVTNS40LDE3LDkuNSwxN2MxLjQsMCwyLjctMC40LDMuOC0xLjFsMy41LDMuNWMwLjcsMC43LDEuOSwwLjcsMi42LDBDMjAuMiwxOC43LDIwLjIsMTcuNiwxOS41LDE2Ljh6IE05LjUsMTUuM2MtMy4yLDAtNS44LTIuNi01LjgtNS44czIuNi01LjgsNS44LTUuOHM1LjgsMi42LDUuOCw1LjhTMTIuNywxNS4zLDkuNSwxNS4zelwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWVkaXQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0wLDIwaDIydjFIMFYyMHpcIi8+PHBvbHlnb24gcG9pbnRzPVwiMTcuMSwzLjEgMy41LDE2LjcgMywyMCA2LjMsMTkuNSAxOS45LDUuOSBcdFwiLz48cGF0aCBkPVwiTTIwLjUsNS4zTDIyLDMuOGMwLDAtMC4yLTEuMi0wLjktMS45QzIwLjQsMS4xLDE5LjIsMSwxOS4yLDFsLTEuNSwxLjVMMjAuNSw1LjN6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tcGxheSB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTQuMDQ2NDM2MywyLjk4ODQ1NTNjMC4wMDY1MjYsMC4wMDI5NiwwLjAxNDIzNDUsMC4wMDY4MzUsMC4wMjMxNDM4LDAuMDExOTAyMSBjMC41OTA4NjA0LDAuMzM1NzYzNywxMi43MTE4Mzk3LDcuMjkyNDQzMywxMy44OTc3NDg5LDguMDI2ODQwMmMtMC41ODMxNTg1LDAuMzQxNzc1OS0xMy4wMTM3NTg3LDcuNDg3OTI3NC0xMy45MzQ2NTksNy45ODI2NzI3IEw0LjA0NjQzNjMsMi45ODg0NTUzIE0zLjk4ODkzNTcsMkMzLjQ0Mjc3OTUsMi4wMDAwNTc3LDMuMDAwNTI1LDIuNDUzMzU3NSwzLjAwMDUyNSwzLjAxNTM0OFx0YzAsMC41NzM0ODcsMCwxNS4xNjMyOTU3LDAsMTUuOTk0NTIyMUMzLjAwMDUyNSwxOS42MjI5NjMsMy40Nzk2MTA0LDIwLDMuOTk0MDU4OCwyMCBjMC4xNzI5MzcyLDAsMC4zNDk5MTkxLTAuMDQyNjMxMSwwLjUxMzk3NjMtMC4xMzMyMjI2YzAuODkwNTYwMi0wLjQ5MTA0NSwxMy4xODgwODk0LTcuNTU4MzM3MiwxMy45NDA3Mzg3LTcuOTk5NDQ1OSBjMC42NzUxMjEzLTAuMzk1NTIwMiwwLjY4NjczMTMtMS4zMzc1MTIsMC0xLjczMjY2MDNDMTcuNDAzMTc1NCw5LjUzMzMyNzEsNS4xNTIzODUyLDIuNTAxODUyLDQuNTM5Mzk1MywyLjE1MzUxNjUgQzQuMzUyNjIwMSwyLjA0NzI3OTQsNC4xNjU0MDEsMS45OTk5ODEzLDMuOTg4OTM1NywyTDMuOTg4OTM1NywyelwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXJlYWRlciB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTE3LDIxSDFWOWg2VjJsMCwwaDEwdjVoMVYxSDYuMkwwLDcuNlYyMmgxOHYtM2gtMVYyMXogTTYsMi44VjhIMS4xTDYsMi44eiBNMTMsOGMtNS4xLDAtOSw1LTksNXM0LjEsNSw5LDVjNSwwLDktNSw5LTVTMTgsOCwxMyw4eiBNOC43LDE1LjVDNi44LDE0LjQsNi40LDEzLDYuNCwxM3MwLjQtMS41LDIuNC0yLjZDOC4zLDExLjIsOCwxMiw4LDEzQzgsMTMuOSw4LjMsMTQuOCw4LjcsMTUuNXogTTEzLDE2LjdjLTIuMSwwLTMuNy0xLjctMy43LTMuN2MwLTIuMSwxLjctMy43LDMuNy0zLjdjMi4xLDAsMy43LDEuNywzLjcsMy43QzE2LjcsMTUuMSwxNS4xLDE2LjcsMTMsMTYuN3ogTTE3LjMsMTUuNWMwLjQtMC43LDAuNy0xLjYsMC43LTIuNWMwLTEtMC4zLTEuOC0wLjctMi42YzIsMS4xLDMuNCwyLjYsMy40LDIuNlMxOS4yLDE0LjQsMTcuMywxNS41eiBNMTMsMTEuN2MtMC43LDAtMS4zLDAuNi0xLjMsMS4zczAuNiwxLjMsMS4zLDEuM3MxLjMtMC42LDEuMy0xLjNTMTMuNywxMS43LDEzLDExLjd6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tZG93bmxvYWQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIi0xIDMgMjIgMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwb2x5Z29uIGlkPVwiWE1MSURfM19cIiBwb2ludHM9XCIxMCw1LjYgMTAsMjEuMiAxMSwyMS4yIDExLDUuNiAxNC42LDkuMyAxNS4zLDguNSAxMC41LDMuNiA1LjcsOC41IDYuNCw5LjMgXHRcIi8+PHBvbHlnb24gaWQ9XCJYTUxJRF82X1wiIHBvaW50cz1cIjEzLDEyIDEzLDEzIDE5LDEzIDE5LDMwIDIsMzAgMiwxMyA4LDEzIDgsMTIgMSwxMiAxLDEzIDEsMzAgMSwzMSAyMCwzMSAyMCwzMCAyMCwxMyAyMCwxMiBcdFwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWluZm8ge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xMCwxN2gyVjhoLTJWMTd6IE0xMSwxQzUuNSwxLDEsNS41LDEsMTFzNC41LDEwLDEwLDEwczEwLTQuNSwxMC0xMFMxNi41LDEsMTEsMXogTTExLDIwYy01LDAtOS00LTktOXM0LTksOS05czksNCw5LDlTMTYsMjAsMTEsMjB6IE0xMCw3aDJWNWgtMlY3elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWFib3V0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCItMSA3IDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTIxLDE4LjVjMC0wLjMtMC4xLTAuNi0wLjctMC45bC0yLjYtMS4ybDIuNi0xLjJjMC42LTAuMywwLjctMC42LDAuNy0wLjljMC0wLjMtMC4xLTAuNi0wLjctMC45bC04LjktNC4xYy0wLjctMC40LTEuOS0wLjQtMi44LDBsLTguOSw0LjFDLTAuOSwxMy44LTEsMTQuMS0xLDE0LjNzMC4xLDAuNiwwLjcsMC45bDIuNiwxLjJsLTIuNiwxLjJDLTAuOSwxOC0xLDE4LjQtMSwxOC41YzAsMC4yLDAuMSwwLjYsMC43LDAuOWwyLjUsMS4ybC0yLjUsMS4yQy0wLjksMjIuMS0xLDIyLjUtMSwyMi43YzAsMC4zLDAuMSwwLjYsMC43LDAuOWw4LjksNC4xYzAuNSwwLjIsMC44LDAuMywxLjQsMC4zczEtMC4xLDEuNC0wLjNsOC45LTQuMWMwLjYtMC40LDAuNy0wLjYsMC43LTAuOWMwLTAuMy0wLjEtMC42LTAuNy0wLjlsLTIuNS0xLjJsMi41LTEuMkMyMC45LDE5LjIsMjEsMTguOCwyMSwxOC41eiBNLTAuMiwxNC4zTC0wLjIsMTQuM2MwLDAsMC4xLTAuMSwwLjMtMC4yTDksMTBjMC42LTAuMywxLjUtMC4zLDIsMGw4LjksNC4xYzAuMiwwLjEsMC4zLDAuMiwwLjMsMC4ybDAsMGMwLDAtMC4xLDAuMS0wLjMsMC4yTDExLDE4LjZjLTAuNiwwLjMtMS41LDAuMy0yLDBsLTguOS00LjFDLTAuMSwxNC40LTAuMiwxNC4zLTAuMiwxNC4zeiBNMjAuMiwyMi43TDIwLjIsMjIuN2MwLDAtMC4xLDAuMS0wLjMsMC4yTDExLDI3LjFjLTAuNiwwLjMtMS41LDAuMy0yLDBsLTguOS00LjFjLTAuMi0wLjEtMC4zLTAuMi0wLjMtMC4ybDAsMGMwLDAsMC4xLTAuMSwwLjMtMC4ybDMtMS41bDUuNSwyLjZjMC43LDAuNCwxLjksMC40LDIuOCwwbDUuNS0yLjZsMywxLjVDMjAuMSwyMi43LDIwLjIsMjIuNywyMC4yLDIyLjd6IE0xOS45LDE4LjdMMTEsMjIuOGMtMC42LDAuMy0xLjUsMC4zLTIsMGwtOC45LTQuMWMtMC4yLTAuMS0wLjMtMC4yLTAuMy0wLjJsMCwwYzAsMCwwLjEtMC4xLDAuMy0wLjJsMy0xLjVsNS41LDIuNmMwLjcsMC40LDEuOSwwLjQsMi44LDBsNS41LTIuNmwzLDEuNWMwLjIsMC4xLDAuMywwLjIsMC4zLDAuMmwwLDBDMjAuMiwxOC41LDIwLjEsMTguNiwxOS45LDE4Ljd6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24taGVscCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTExLjYsMS4zYy0zLjMsMC02LDIuOC02LDYuMmMwLjMsMCwwLjcsMCwwLjksMGMwLTIuOSwyLjMtNS4yLDUuMS01LjJzNS4xLDIuMyw1LjEsNS4yYzAsMS43LTEuOSwzLjItMyw0LjNDMTIuOSwxMi42LDExLDE0LjIsMTEsMTZjMCwxLjIsMCwyLjIsMCwyLjdjMC4zLDAsMC42LDAsMC45LDBjMC0wLjYsMC0xLjYsMC0yLjVjMC0xLjQsMS4xLTIuNCwyLjItMy41YzEuNy0xLjUsMy41LTMuMSwzLjUtNS4yQzE3LjYsNC4xLDE0LjksMS4zLDExLjYsMS4zeiBNMTEuNSwyMC4yYy0wLjMsMC0wLjUsMC4yLTAuNSwwLjV2MC44YzAsMC4zLDAuMiwwLjUsMC41LDAuNXMwLjUtMC4yLDAuNS0wLjV2LTAuOEMxMS45LDIwLjQsMTEuNywyMC4yLDExLjUsMjAuMnpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1zZXR1cCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTAsM3YxNmgyMlYzSDB6IE0yMSwxN0gxVjVoMjBWMTd6IE0xNi41LDUuOWwtNy4yLDcuMkw4LjgsMTVINHYxYzAsMCwzLjIsMCw1LDBjMC40LDAsMC4yLDAsMC4yLTAuMmwyLjItMC42TDE4LjcsOEwxNi41LDUuOXogTTkuOSwxMy4xbDYuNS02LjRMMTgsOGwtNi41LDYuNEw5LjksMTMuMXpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi12ZXJzaW9ucyB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiLTEgNyAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xOSwxMmMwLTEuMS0wLjktMi0yLTJjMC0xLjEtMC45LTItMi0ySDVjLTEuMSwwLTIsMC45LTIsMmMtMS4xLDAtMiwwLjktMiwyYy0xLjEsMC0yLDAuOS0yLDJ2MTJjMCwxLjEsMC45LDIsMiwyaDE4YzEuMSwwLDItMC45LDItMlYxNEMyMSwxMi45LDIwLjEsMTIsMTksMTJ6IE01LDloMTBjMC42LDAsMSwwLjQsMSwxSDRDNCw5LjQsNC40LDksNSw5eiBNMywxMWgxNGMwLjYsMCwxLDAuNCwxLDFIMkMyLDExLjQsMi40LDExLDMsMTF6IE0yMCwyNmMwLDAuNi0wLjQsMS0xLDFIMWMtMC42LDAtMS0wLjQtMS0xVjE0YzAtMC42LDAuNC0xLDEtMWgxOGMwLjYsMCwxLDAuNCwxLDFWMjZ6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAvLyYuaWNvbi10ZXh0LWFkZGl0aW9uYWwge1xuICAvLyAgd2lkdGg6IDIycHg7XG4gIC8vICBoZWlnaHQ6IDIycHg7XG4gIC8vICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xOC41LDE1LjVjLTEuMSwwLTIsMC45LTIsMnMwLjksMiwyLDJzMi0wLjksMi0yUzE5LjYsMTUuNSwxOC41LDE1LjV6IE0xOC41LDE4LjVjLTAuNiwwLTEtMC40LTEtMWMwLTAuNiwwLjQtMSwxLTFzMSwwLjQsMSwxQzE5LjUsMTguMSwxOS4xLDE4LjUsMTguNSwxOC41eiBNMTguNSw3LjVjMS4xLDAsMi0wLjksMi0yYzAtMS4xLTAuOS0yLTItMnMtMiwwLjktMiwyQzE2LjUsNi42LDE3LjQsNy41LDE4LjUsNy41eiBNMTguNSw0LjVjMC42LDAsMSwwLjQsMSwxcy0wLjQsMS0xLDFzLTEtMC40LTEtMVMxNy45LDQuNSwxOC41LDQuNXogTTE4LjUsOS41Yy0xLjEsMC0yLDAuOS0yLDJzMC45LDIsMiwyczItMC45LDItMlMxOS42LDkuNSwxOC41LDkuNXogTTE4LjUsMTIuNWMtMC42LDAtMS0wLjQtMS0xYzAtMC42LDAuNC0xLDEtMXMxLDAuNCwxLDFDMTkuNSwxMi4xLDE5LjEsMTIuNSwxOC41LDEyLjV6IE02LjksMy44TDEsMTguOWgxLjVsMS44LTQuN2g2LjlsMS43LDQuN2gxLjVMOC42LDMuOEg2Ljl6IE00LjcsMTIuOWwzLTcuOWwzLDcuOUg0Ljd6XCIvPjwvZz48L3N2Zz4nKTtcbiAgLy99XG4gIC8vJi5pY29uLXRleHQtY29sb3Ige1xuICAvLyAgd2lkdGg6IDIycHg7XG4gIC8vICBoZWlnaHQ6IDIycHg7XG4gIC8vICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk04LjksMTJsMi4zLTYuM2wyLjIsNi4zSDguOXogTTQuNywxNy44aDJsMS42LTQuM2g1LjZsMS41LDQuM2gyLjFMMTIuMywzLjVoLTIuMkw0LjcsMTcuOHpcIi8+PC9nPjwvc3ZnPicpO1xuICAvL31cbiAgLy8mLmljb24tdGV4dC1zZWxlY3Rpb24ge1xuICAvLyAgd2lkdGg6IDIycHg7XG4gIC8vICBoZWlnaHQ6IDIycHg7XG4gIC8vICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk03LjYsMTAuM2MwLjIsMC4zLDAuNCwwLjQsMC41LDAuNWMwLjMsMC4yLDAuNiwwLjMsMSwwLjNjMC43LDAsMS4zLTAuMywxLjctMC44YzAuNC0wLjUsMC42LTEuMiwwLjYtMi4xYzAtMC45LTAuMi0xLjUtMC42LTJjLTAuNC0wLjQtMC45LTAuNy0xLjYtMC43Yy0wLjMsMC0wLjYsMC4xLTAuOSwwLjJDOCw2LDcuOCw2LjIsNy42LDYuNFYzLjhINi44VjExaDAuOFYxMC4zeiBNOCw2LjljMC4zLTAuMywwLjctMC40LDEuMS0wLjRjMC41LDAsMC44LDAuMiwxLDAuNWMwLjIsMC40LDAuNCwwLjgsMC40LDEuNGMwLDAuNi0wLjEsMS4xLTAuNCwxLjVjLTAuMiwwLjQtMC42LDAuNi0xLjEsMC42Yy0wLjYsMC0xLjEtMC4zLTEuMy0wLjlDNy42LDkuMiw3LjYsOC44LDcuNiw4LjNDNy42LDcuNyw3LjcsNy4yLDgsNi45eiBNNS43LDEwLjRjLTAuMSwwLTAuMiwwLTAuMi0wLjFjMC0wLjEtMC4xLTAuMS0wLjEtMC4ydi0zYzAtMC41LTAuMi0wLjktMC42LTEuMUM0LjQsNS44LDQsNS42LDMuMyw1LjZjLTAuNSwwLTEsMC4xLTEuNCwwLjRDMS41LDYuMywxLjMsNi43LDEuMyw3LjRoMC44YzAtMC4zLDAuMS0wLjUsMC4yLTAuNmMwLjItMC4yLDAuNS0wLjQsMS0wLjRjMC40LDAsMC43LDAuMSwwLjksMC4yYzAuMiwwLjEsMC4zLDAuNCwwLjMsMC43YzAsMC4xLDAsMC4zLTAuMSwwLjNDNC40LDcuNyw0LjMsNy44LDQuMSw3LjhMMi43LDhDMi4yLDguMSwxLjgsOC4yLDEuNSw4LjVDMS4yLDguOCwxLDkuMSwxLDkuNmMwLDAuNCwwLjIsMC44LDAuNSwxLjFjMC4zLDAuMywwLjcsMC40LDEuMiwwLjRjMC40LDAsMC44LTAuMSwxLjEtMC4zYzAuMy0wLjIsMC42LTAuNCwwLjgtMC42YzAsMC4yLDAuMSwwLjQsMC4yLDAuNWMwLjEsMC4yLDAuNCwwLjMsMC43LDAuM2MwLjEsMCwwLjIsMCwwLjMsMGMwLjEsMCwwLjIsMCwwLjMtMC4xdi0wLjZjLTAuMSwwLTAuMSwwLTAuMiwwQzUuOCwxMC40LDUuNywxMC40LDUuNywxMC40eiBNNC41LDkuMWMwLDAuNS0wLjIsMC45LTAuNywxLjJjLTAuMywwLjEtMC42LDAuMi0wLjksMC4yYy0wLjMsMC0wLjUtMC4xLTAuNy0wLjJDMiwxMC4xLDIsOS45LDIsOS42QzIsOS4zLDIuMSw5LDIuNCw4LjljMC4yLTAuMSwwLjQtMC4yLDAuNy0wLjJsMC41LTAuMWMwLjIsMCwwLjMtMC4xLDAuNS0wLjFjMC4yLDAsMC4zLTAuMSwwLjQtMC4yVjkuMXogTTE4LjUsNUw4LjMsMTUuM2wtMC41LDJjLTAuNiwwLjQtMS4zLDAuMy0xLjUsMC42Yy0wLjMsMC40LDAuOSwwLjQsMS41LDAuM2MwLjQsMCwwLjUsMCwwLjUtMC4ybDIuMi0wLjZMMjAuNyw3LjFMMTguNSw1eiBNOSwxNS4zbDkuNS05LjVMMjAsNy4xbC05LjUsOS41TDksMTUuM3pcIi8+PC9nPjwvc3ZnPicpO1xuICAvL31cbiAgLy8mLmljb24tYnVsbGV0cyB7XG4gIC8vICB3aWR0aDogMjJweDtcbiAgLy8gIGhlaWdodDogMjJweDtcbiAgLy8gIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTcsNHYxaDE1VjRIN3ogTTEsNmgzVjNIMVY2eiBNNywxMmgxNXYtMUg3VjEyeiBNMSwxM2gzdi0zSDFWMTN6IE03LDE5aDE1di0xSDdWMTl6IE0xLDIwaDN2LTNIMVYyMHpcIi8+PC9nPjwvc3ZnPicpO1xuICAvL31cbiAgLy8mLmljb24tbnVtYmVycyB7XG4gIC8vICB3aWR0aDogMjJweDtcbiAgLy8gIGhlaWdodDogMjJweDtcbiAgLy8gIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTcsMy44djFoMTV2LTFIN3ogTTcsMTEuOGgxNXYtMUg3VjExLjh6IE03LDE4LjhoMTV2LTFIN1YxOC44eiBNMy4xLDYuOWgwLjdWMkgzLjNDMy4yLDIuNCwzLjEsMi42LDIuOSwyLjdDMi43LDIuOCwyLjQsMi45LDIsMi45djAuNWgxLjJWNi45eiBNMy4zLDlDMi42LDksMi4xLDkuMiwxLjksOS43Yy0wLjIsMC4zLTAuMiwwLjYtMC4yLDFoMC42YzAtMC4zLDAuMS0wLjUsMC4xLTAuN2MwLjItMC4zLDAuNS0wLjUsMC45LTAuNWMwLjMsMCwwLjUsMC4xLDAuNywwLjNzMC4zLDAuNCwwLjMsMC43YzAsMC4yLTAuMSwwLjUtMC4zLDAuN2MtMC4xLDAuMS0wLjMsMC4zLTAuNiwwLjRsLTAuNywwLjRjLTAuNCwwLjMtMC43LDAuNS0wLjksMC45Yy0wLjIsMC4zLTAuMiwwLjctMC4zLDEuMWgzLjR2LTAuNkgyLjJjMC4xLTAuMiwwLjItMC41LDAuNC0wLjdjMC4xLTAuMSwwLjMtMC4yLDAuNS0wLjRMMy42LDEyYzAuNC0wLjIsMC43LTAuNCwwLjktMC42YzAuMy0wLjMsMC40LTAuNiwwLjQtMWMwLTAuNC0wLjEtMC43LTAuNC0xQzQuMyw5LjEsMy45LDksMy4zLDl6IE00LjEsMTguM2MwLjItMC4xLDAuMy0wLjIsMC40LTAuM2MwLjItMC4yLDAuMi0wLjQsMC4yLTAuN2MwLTAuNC0wLjEtMC43LTAuNC0xQzQsMTYuMSwzLjYsMTYsMy4xLDE2Yy0wLjYsMC0xLjEsMC4yLTEuMywwLjdjLTAuMSwwLjMtMC4yLDAuNi0wLjIsMC45aDAuNmMwLTAuMywwLjEtMC41LDAuMS0wLjZjMC4yLTAuMywwLjQtMC40LDAuOS0wLjRjMC4yLDAsMC40LDAuMSwwLjYsMC4yQzQsMTYuOSw0LjEsMTcsNC4xLDE3LjNjMCwwLjMtMC4xLDAuNi0wLjQsMC43Yy0wLjEsMC4xLTAuMywwLjEtMC42LDAuMWMtMC4xLDAtMC4xLDAtMC4xLDBjMCwwLTAuMSwwLTAuMiwwdjAuNWMwLDAsMC4xLDAsMC4xLDBjMCwwLDAuMSwwLDAuMSwwYzAuNCwwLDAuNywwLjEsMC45LDAuMmMwLjIsMC4xLDAuMywwLjQsMC4zLDAuN2MwLDAuMy0wLjEsMC41LTAuMywwLjdjLTAuMiwwLjItMC41LDAuMy0wLjgsMC4zYy0wLjQsMC0wLjctMC4xLTAuOS0wLjRjLTAuMS0wLjEtMC4yLTAuNC0wLjItMC43SDEuNWMwLDAuNSwwLjEsMC44LDAuNCwxLjJDMi4xLDIwLjgsMi41LDIxLDMuMSwyMWMwLjYsMCwxLTAuMSwxLjMtMC40YzAuMy0wLjMsMC41LTAuNywwLjUtMS4xYzAtMC4zLTAuMS0wLjUtMC4yLTAuN0M0LjUsMTguNSw0LjMsMTguMyw0LjEsMTguM3pcIi8+PC9nPjwvc3ZnPicpO1xuICAvL31cbiAgLy8mLmljb24tbGluZXNwYWNpbmcge1xuICAvLyAgd2lkdGg6IDIycHg7XG4gIC8vICBoZWlnaHQ6IDIycHg7XG4gIC8vICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBvbHlnb24gaWQ9XCJYTUxJRF83X1wiIHBvaW50cz1cIjIyLDQgMjIsMyAxMiwzIDExLDMgMSwzIDEsNCAxMSw0IDExLDQuMyA4LDcuNCA4LjcsOC4xIDExLDUuNyAxMSwxNy4zIDguNywxNC45IDgsMTUuNiAxMSwxOC43IDExLDE5IDEsMTkgMSwyMCAxMSwyMCAxMiwyMCAyMiwyMCAyMiwxOSAxMiwxOSAxMiwxOC42IDE1LDE1LjYgMTQuMywxNC45IDEyLDE3LjIgMTIsNS44IDE0LjMsOC4xIDE1LDcuNCAxMiw0LjQgMTIsNCBcdFwiLz48L2c+PC9zdmc+Jyk7XG4gIC8vfVxuICAmLmljb24tdGV4dC1hbGlnbi1jZW50ZXIge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctbWFzaygnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xLDN2MWgyMVYzSDF6IE00LDd2MWgxNFY3SDR6IE0xLDEyaDIxdi0xSDFWMTJ6IE00LDE1djFoMTR2LTFINHogTTEsMjBoMjF2LTFIMVYyMHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10ZXh0LWFsaWduLWphc3Qge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctbWFzaygnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xLDN2MWgyMVYzSDF6IE0xLDhoMjFWN0gxVjh6IE0xLDEyaDIxdi0xSDFWMTJ6IE0xLDE2aDIxdi0xSDFWMTZ6IE0xLDIwaDIxdi0xSDFWMjB6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGV4dC1hbGlnbi1sZWZ0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLW1hc2soJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMSwzdjFoMjFWM0gxeiBNMTUsN0gxdjFoMTRWN3ogTTEsMTJoMjF2LTFIMVYxMnogTTE1LDE1SDF2MWgxNFYxNXogTTEsMjBoMjF2LTFIMVYyMHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10ZXh0LWFsaWduLXJpZ2h0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLW1hc2soJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMSwzdjFoMjFWM0gxeiBNOCw4aDE0VjdIOFY4eiBNMjIsMTFIMXYxaDIxVjExeiBNOCwxNmgxNHYtMUg4VjE2eiBNMjIsMTlIMXYxaDIxVjE5elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWRlLWluZGVudCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1tYXNrKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTEsMjB2LTFoMjF2MUgxeiBNMTEsMTVoMTF2MUgxMVYxNXogTTExLDExaDExdjFIMTFWMTF6IE0xMSw3aDExdjFIMTFWN3ogTTYuMyw3TDcsNy43bC0zLjgsMy44TDcsMTUuM0w2LjMsMTZMMiwxMS44bC0wLjItMC4zTDIsMTEuMkw2LjMsN3ogTTEsM2gyMXYxSDFWM3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1pbi1pbmRlbnQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctbWFzaygnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xLDIwdi0xaDIxdjFIMXogTTEyLDE2SDF2LTFoMTFWMTZ6IE0xMiwxMkgxdi0xaDExVjEyeiBNMTIsOEgxVjdoMTFWOHogTTIxLDExLjJsMC4yLDAuM0wyMSwxMS44TDE2LjcsMTZMMTYsMTUuM2wzLjgtMy44TDE2LDcuN0wxNi43LDdMMjEsMTEuMnogTTIyLDRIMVYzaDIxVjR6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtYWRkLWNvbHVtbi1sZWZ0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMTUsMTloLTFIOEg3di0xdi0zSDBWMmg3aDFoMTR2NHYxdjN2MXYzdjF2M3YxSDE1eiBNMTUsMThoNnYtM2gtNlYxOHogTTE1LDE0aDZ2LTNoLTZWMTR6IE04LDE4aDZ2LTNIOFYxOHogTTgsMTRoNnYtM0g4VjE0eiBNMTQsMTBWN0g4djNIMTR6IE04LDN2M2g2VjNIOHogTTIxLDNoLTZ2M2g2VjN6IE0xNSw3djNoNlY3SDE1eiBNMywxNmgxdjJoMnYxSDR2Mkgzdi0ySDF2LTFoMlYxNnpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1hZGQtY29sdW1uLXJpZ2h0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMCwxOWwwLTFsMC0zbDAtMWwwLTNsMC0xbDAtM2wwLTFsMC00aDE0aDFoN3YxM2gtN3YzdjFoLTFIOEg3SDB6IE03LDE1SDF2M2g2VjE1eiBNNywxMUgxdjNoNlYxMXogTTE0LDE1SDh2M2g2VjE1eiBNMTQsMTFIOHYzaDZWMTF6IE0xNCwxMFY3SDh2M0gxNHogTTgsM3YzaDZWM0g4eiBNMSw2aDZWM0gxVjZ6IE0xLDd2M2g2VjdIMXogTTE5LDE4aDJ2MWgtMnYyaC0xdi0yaC0ydi0xaDJ2LTJoMVYxOHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1hZGQtcm93LWFib3ZlIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjEsMjBoLTZoLTFIOEg3SDB2LTF2LTN2LTF2LTN2LTFWOFY3VjFoMTV2Nmg2aDF2MXYzdjF2M3YxdjN2MUgyMXogTTcsOEgxdjNoNlY4eiBNNywxMkgxdjNoNlYxMnogTTcsMTZIMXYzaDZWMTZ6IE04LDE5aDZ2LTNIOFYxOXogTTgsMTVoNnYtM0g4VjE1eiBNOCwxMWg2VjhIOFYxMXogTTIxLDhoLTZ2M2g2Vjh6IE0yMSwxMmgtNnYzaDZWMTJ6IE0yMSwxNmgtNnYzaDZWMTZ6IE0xOSw2aC0xVjRoLTJWM2gyVjFoMXYyaDJ2MWgtMlY2elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWFkZC1yb3ctYmVsb3cge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0yMiwxdjF2M3YxdjN2MXYzdjFoLTFoLTZ2Nkgwdi02di0xdi0zVjlWNlY1VjJWMWg3aDFoNmgxaDZIMjJ6IE03LDEwSDF2M2g2VjEweiBNNyw2SDF2M2g2VjZ6IE03LDJIMXYzaDZWMnogTTgsNWg2VjJIOFY1eiBNOCw5aDZWNkg4Vjl6IE04LDEzaDZ2LTNIOFYxM3ogTTIxLDEwaC02djNoNlYxMHogTTIxLDZoLTZ2M2g2VjZ6IE0yMSwyaC02djNoNlYyeiBNMTksMTdoMnYxaC0ydjJoLTF2LTJoLTJ2LTFoMnYtMmgxVjE3elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLXJlbW92ZS1jb2x1bW4ge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0yMSwxOWgtNmgtMWgtMS42Yy0wLjksMS44LTIuNywzLTQuOSwzcy00LTEuMi00LjktM0gxSDB2LTF2LTN2LTF2LTN2LTFWN1Y2VjNWMmg3aDFoNmgxaDZoMXYxdjN2MXYzdjF2M3YxdjN2MUgyMXogTTcuNSwxMkM1LDEyLDMsMTQsMywxNi41UzUsMjEsNy41LDIxczQuNS0yLDQuNS00LjVTMTAsMTIsNy41LDEyeiBNMTQsM0g4djNoNlYzeiBNMTQsN0g4djNoNlY3eiBNMTQsMTFIOHYwLjFjMS45LDAuMiwzLjUsMS4zLDQuNCwyLjlIMTRWMTF6IE0xNCwxNWgtMS4yYzAuMSwwLjUsMC4yLDEsMC4yLDEuNWMwLDAuNS0wLjEsMS0wLjIsMS41SDE0VjE1eiBNMjEsM2gtNnYzaDZWM3ogTTIxLDdoLTZ2M2g2Vjd6IE0yMSwxMWgtNnYzaDZWMTF6IE0yMSwxNWgtNnYzaDZWMTV6IE05LjYsMTkuM2wtMi4xLTIuMWwtMi4xLDIuMWwtMC43LTAuN2wyLjEtMi4xbC0yLjEtMi4xbDAuNy0wLjdsMi4xLDIuMWwyLjEtMi4xbDAuNywwLjdsLTIuMSwyLjFsMi4xLDIuMUw5LjYsMTkuM3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1yZW1vdmUtcm93IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjEsMTloLTZoLTFoLTEuNmMtMC45LDEuOC0yLjcsMy00LjksM3MtNC0xLjItNC45LTNIMUgwdi0xdi0zdi0xdi0zdi0xVjdWNlYzVjJoN2gxaDZoMWg2aDF2MXYzdjF2M3YxdjN2MXYzdjFIMjF6IE0xLDE4aDEuMkMyLjEsMTcuNSwyLDE3LDIsMTYuNWMwLTAuNSwwLjEtMSwwLjItMS41SDFWMTh6IE03LDNIMXYzaDZWM3ogTTcsN0gxdjNoNlY3eiBNNy41LDEyQzUsMTIsMywxNCwzLDE2LjVTNSwyMSw3LjUsMjFzNC41LTIsNC41LTQuNVMxMCwxMiw3LjUsMTJ6IE0xNCwzSDh2M2g2VjN6IE0xNCw3SDh2M2g2Vjd6IE0xNCwxNWgtMS4yYzAuMSwwLjUsMC4yLDEsMC4yLDEuNWMwLDAuNS0wLjEsMS0wLjIsMS41SDE0VjE1eiBNMjEsM2gtNnYzaDZWM3ogTTIxLDdoLTZ2M2g2Vjd6IE0yMSwxNWgtNnYzaDZWMTV6IE05LjYsMTkuM2wtMi4xLTIuMWwtMi4xLDIuMWwtMC43LTAuN2wyLjEtMi4xbC0yLjEtMi4xbDAuNy0wLjdsMi4xLDIuMWwyLjEtMi4xbDAuNywwLjdsLTIuMSwyLjFsMi4xLDIuMUw5LjYsMTkuM3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1wYWdlYnJlYWsge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk04LDE0djFoMXYtMUg4eiBNNiwxNHYxaDF2LTFINnogTTE4LDIxSDN2LTZIMnY3aDE3di03aC0xVjIxeiBNNCwxNHYxaDF2LTFINHogTTE0LDE0djFoMXYtMUgxNHogTTEwLDE0djFoMXYtMUgxMHogTTguMiwxTDIsNy42VjE0aDFWOWg2VjJsMCwwaDl2MTJoMVYxSDguMnogTTgsOEgzLjFMOCwyLjhWOHogTTEyLDE0djFoMXYtMUgxMnogTTE2LDE0djFoMXYtMUgxNnpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1zZWN0aW9uYnJlYWsge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0yMCwxNFYySDN2MTJIMlYxaDE5djEzSDIweiBNNSwxNHYxSDR2LTFINXogTTcsMTR2MUg2di0xSDd6IE05LDE0djFIOHYtMUg5eiBNMTEsMTR2MWgtMXYtMUgxMXogTTEzLDE0djFoLTF2LTFIMTN6IE0xNSwxNHYxaC0xdi0xSDE1eiBNMTcsMTR2MWgtMXYtMUgxN3ogTTE4LDE0aDF2MWgtMVYxNHogTTMsMjFoMTd2LTZoMXY3SDJ2LTdoMVYyMXpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1zdHJpbmdicmVhayB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTE4LDEySDUuMUw5LDE1LjlsLTAuNywwLjdsLTQuNS00LjVsLTAuNi0wLjZsMC42LTAuNmw0LjUtNC41TDksNy4xTDUuMSwxMUgxOFY1aDF2NnYxSDE4elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXBhZ2VudW1iZXIge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk04LjIsMUwyLDcuNlYyMmgxN1YxSDguMnogTTgsMi44VjhIMy4xTDgsMi44eiBNMTgsMjFIM1Y5aDZWMmwwLDBoOVYyMXogTTEyLDE5aDF2LTRoLTAuN2MwLDAuMi0wLjEtMC4xLTAuMSwwYy0wLjEsMC4xLTAuMiwwLTAuMywwYy0wLjEsMC4xLTAuMiwwLjEtMC40LDAuMWMtMC4xLDAtMC4zLDAtMC40LDBWMTZIMTJWMTl6IE0xNS4zLDE3LjNDMTUsMTcuOSwxNS4xLDE4LjQsMTUsMTloMC45YzAtMC4zLDAtMC42LDAuMS0wLjljMC4xLTAuMywwLjEtMC42LDAuMy0wLjljMC4xLTAuMywwLjMtMC42LDAuNC0wLjljMC4yLTAuMywwLjEtMC4zLDAuMy0wLjVWMTVoLTN2MWgxLjlDMTUuNiwxNi40LDE1LjUsMTYuNywxNS4zLDE3LjN6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tbGluayB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTEyLjQsOS44YzAsMC0yLjEtMC4xLTMuOCwxLjJjLTIuOCwyLTMuMyw0LjMtMy4zLDQuM3MxLjYtMS43LDMuNS0yLjVjMS43LTAuNywzLjctMC40LDMuNy0wLjR2MS45bDQuOC0zLjNWMTFsLTQuOC0zLjNWOS44eiBNMTEsMUM1LjUsMSwxLDUuNSwxLDExYzAsNS41LDQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBDMjEsNS41LDE2LjUsMSwxMSwxeiBNMTEsMjBjLTUsMC05LTQuMS05LTlDMiw2LDYsMiwxMSwyczksNC4xLDksOUMyMCwxNiwxNiwyMCwxMSwyMHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1pbWFnZS1saWJyYXJ5IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIj48ZGVmcz48c3R5bGU+LmNscy0xe2lzb2xhdGlvbjppc29sYXRlO30uY2xzLTJ7b3BhY2l0eTowLjI7fS5jbHMtM3tmaWxsOiNmZmY7fS5jbHMtMTAsLmNscy0xMSwuY2xzLTQsLmNscy02LC5jbHMtNywuY2xzLTgsLmNscy05e21peC1ibGVuZC1tb2RlOm11bHRpcGx5O30uY2xzLTR7ZmlsbDp1cmwoI2dyYWRfOCk7fS5jbHMtNXtmaWxsOnVybCgjZ3JhZF8xMCk7fS5jbHMtNntmaWxsOnVybCgjZ3JhZF8xMik7fS5jbHMtN3tmaWxsOnVybCgjZ3JhZF8xNCk7fS5jbHMtOHtmaWxsOnVybCgjZ3JhZF83OSk7fS5jbHMtOXtmaWxsOnVybCgjZ3JhZF83Nyk7fS5jbHMtMTB7ZmlsbDp1cmwoI2dyYWRfNzUpO30uY2xzLTExe2ZpbGw6dXJsKCNncmFkXzgxKTt9PC9zdHlsZT48bGluZWFyR3JhZGllbnQgaWQ9XCJncmFkXzhcIiB4MT1cIjExLjA4XCIgeTE9XCIxMC4yNlwiIHgyPVwiMTEuMDhcIiB5Mj1cIjEuMjZcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj48c3RvcCBvZmZzZXQ9XCIwXCIgc3RvcC1jb2xvcj1cIiNmM2U5MTZcIi8+PHN0b3Agb2Zmc2V0PVwiMVwiIHN0b3AtY29sb3I9XCIjZjg5ZDM0XCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPVwiZ3JhZF8xMFwiIHgxPVwiMTEuMDhcIiB5MT1cIjIwLjQ0XCIgeDI9XCIxMS4wOFwiIHkyPVwiMTEuODhcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj48c3RvcCBvZmZzZXQ9XCIwXCIgc3RvcC1jb2xvcj1cIiM1ZWI2ZThcIi8+PHN0b3Agb2Zmc2V0PVwiMVwiIHN0b3AtY29sb3I9XCIjOTU4Y2MzXCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPVwiZ3JhZF8xMlwiIHgxPVwiMS40NlwiIHkxPVwiMTEuMDVcIiB4Mj1cIjEwLjQ2XCIgeTI9XCIxMS4wNVwiIGdyYWRpZW50VHJhbnNmb3JtPVwidHJhbnNsYXRlKDE3IDUuMDkpIHJvdGF0ZSg5MClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj48c3RvcCBvZmZzZXQ9XCIwXCIgc3RvcC1jb2xvcj1cIiNjYzhkYmFcIi8+PHN0b3Agb2Zmc2V0PVwiMVwiIHN0b3AtY29sb3I9XCIjZjg2ODY3XCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPVwiZ3JhZF8xNFwiIHgxPVwiMTEuNzNcIiB5MT1cIjExLjA1XCIgeDI9XCIyMC43M1wiIHkyPVwiMTEuMDVcIiBncmFkaWVudFRyYW5zZm9ybT1cInRyYW5zbGF0ZSgyNy4yOCAtNS4xOCkgcm90YXRlKDkwKVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPjxzdG9wIG9mZnNldD1cIjBcIiBzdG9wLWNvbG9yPVwiIzZhYzA3ZlwiLz48c3RvcCBvZmZzZXQ9XCIxXCIgc3RvcC1jb2xvcj1cIiNjNWRhM2RcIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9XCJncmFkXzc5XCIgeDE9XCIxMS43NFwiIHkxPVwiMTAuNDJcIiB4Mj1cIjE3LjUyXCIgeTI9XCI0LjYzXCIgZ3JhZGllbnRUcmFuc2Zvcm09XCJ0cmFuc2xhdGUoMzAuMjkgMi41MSkgcm90YXRlKDEzNSlcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj48c3RvcCBvZmZzZXQ9XCIwXCIgc3RvcC1jb2xvcj1cIiNjNWRhM2RcIi8+PHN0b3Agb2Zmc2V0PVwiMVwiIHN0b3AtY29sb3I9XCIjZjNlOTE2XCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPVwiZ3JhZF83N1wiIHgxPVwiNC43XCIgeTE9XCIxNy40OVwiIHgyPVwiMTAuNDhcIiB5Mj1cIjExLjcxXCIgZ3JhZGllbnRUcmFuc2Zvcm09XCJ0cmFuc2xhdGUoMjMuMjQgMTkuNjUpIHJvdGF0ZSgxMzUpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+PHN0b3Agb2Zmc2V0PVwiMFwiIHN0b3AtY29sb3I9XCIjOTU5NWMzXCIvPjxzdG9wIG9mZnNldD1cIjFcIiBzdG9wLWNvbG9yPVwiI2NjOGRiYVwiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD1cImdyYWRfNzVcIiB4MT1cIjQuNjlcIiB5MT1cIjQuNjRcIiB4Mj1cIjEwLjQ3XCIgeTI9XCIxMC40MlwiIGdyYWRpZW50VHJhbnNmb3JtPVwidHJhbnNsYXRlKDcuNTQgLTMuMTUpIHJvdGF0ZSg0NSlcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj48c3RvcCBvZmZzZXQ9XCIwXCIgc3RvcC1jb2xvcj1cIiNmODY4NjdcIi8+PHN0b3Agb2Zmc2V0PVwiMVwiIHN0b3AtY29sb3I9XCIjZjg5ZDM0XCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPVwiZ3JhZF84MVwiIHgxPVwiMTEuNzdcIiB5MT1cIjExLjc4XCIgeDI9XCIxNy41NVwiIHkyPVwiMTcuNTZcIiBncmFkaWVudFRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxNC42MyAtNi4wNSkgcm90YXRlKDQ1KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPjxzdG9wIG9mZnNldD1cIjBcIiBzdG9wLWNvbG9yPVwiIzVlYzBlOFwiLz48c3RvcCBvZmZzZXQ9XCIxXCIgc3RvcC1jb2xvcj1cIiM2YWMwN2ZcIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHRpdGxlPmljb25zX2Zvcl9zdmc8L3RpdGxlPjxnIGNsYXNzPVwiY2xzLTFcIj48ZyBpZD1cItCh0LvQvtC5XzFcIiBkYXRhLW5hbWU9XCLQodC70L7QuSAxXCI+PHJlY3QgY2xhc3M9XCJjbHMtMlwiIHg9XCIwLjA5XCIgeT1cIjAuMDFcIiB3aWR0aD1cIjIyXCIgaGVpZ2h0PVwiMjJcIiByeD1cIjRcIiByeT1cIjRcIi8+PHJlY3QgY2xhc3M9XCJjbHMtM1wiIHg9XCIwLjU3XCIgeT1cIjAuNDlcIiB3aWR0aD1cIjIxLjA0XCIgaGVpZ2h0PVwiMjEuMDRcIiByeD1cIjMuNlwiIHJ5PVwiMy42XCIvPjxyZWN0IGNsYXNzPVwiY2xzLTRcIiB4PVwiOC4zM1wiIHk9XCIxLjI2XCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiLz48cmVjdCBjbGFzcz1cImNscy01XCIgeD1cIjguMzNcIiB5PVwiMTEuNzZcIiB3aWR0aD1cIjUuNVwiIGhlaWdodD1cIjlcIiByeD1cIjIuNVwiIHJ5PVwiMi41XCIvPjxyZWN0IGNsYXNzPVwiY2xzLTZcIiB4PVwiMy4yMVwiIHk9XCI2LjU1XCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNS4wOSAxNykgcm90YXRlKC05MClcIi8+PHJlY3QgY2xhc3M9XCJjbHMtN1wiIHg9XCIxMy40OFwiIHk9XCI2LjU1XCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSg1LjE4IDI3LjI4KSByb3RhdGUoLTkwKVwiLz48cmVjdCBjbGFzcz1cImNscy04XCIgeD1cIjExLjg3XCIgeT1cIjMuMDNcIiB3aWR0aD1cIjUuNVwiIGhlaWdodD1cIjlcIiByeD1cIjIuNVwiIHJ5PVwiMi41XCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDE5LjY0IDIzLjE5KSByb3RhdGUoLTEzNSlcIi8+PHJlY3QgY2xhc3M9XCJjbHMtOVwiIHg9XCI0LjhcIiB5PVwiMTAuMTRcIiB3aWR0aD1cIjUuNVwiIGhlaWdodD1cIjlcIiByeD1cIjIuNVwiIHJ5PVwiMi41XCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDIuNTQgMzAuMzMpIHJvdGF0ZSgtMTM1KVwiLz48cmVjdCBjbGFzcz1cImNscy0xMFwiIHg9XCI0LjgzXCIgeT1cIjMuMDNcIiB3aWR0aD1cIjUuNVwiIGhlaWdodD1cIjlcIiByeD1cIjIuNVwiIHJ5PVwiMi41XCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0zLjEgNy41Nikgcm90YXRlKC00NSlcIi8+PHJlY3QgY2xhc3M9XCJjbHMtMTFcIiB4PVwiMTEuODdcIiB5PVwiMTAuMTRcIiB3aWR0aD1cIjUuNVwiIGhlaWdodD1cIjlcIiByeD1cIjIuNVwiIHJ5PVwiMi41XCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC02LjA3IDE0LjYzKSByb3RhdGUoLTQ1KVwiLz48L2c+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLXRleHQtdmFsaWduLXRvcCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1tYXNrKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cmVjdCBjbGFzcz1cImNscy0xXCIgeD1cIjJcIiB5PVwiMlwiIHdpZHRoPVwiMTlcIiBoZWlnaHQ9XCIxXCIvPjxyZWN0IGNsYXNzPVwiY2xzLTFcIiB4PVwiMlwiIHk9XCI0XCIgd2lkdGg9XCIxOVwiIGhlaWdodD1cIjFcIi8+PHBvbHlnb24gY2xhc3M9XCJjbHMtMVwiIHBvaW50cz1cIjEyIDE4IDExIDE4IDExIDcuODMgOC42NSA5LjggOCA4Ljk0IDExLjUgNiAxNSA5IDE0LjM1IDkuOCAxMiA3LjgzIDEyIDE4XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGV4dC12YWxpZ24tbWlkZGxlIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLW1hc2soJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxyZWN0IGNsYXNzPVwiY2xzLTFcIiB4PVwiMlwiIHk9XCIxMFwiIHdpZHRoPVwiMTlcIiBoZWlnaHQ9XCIxXCIvPjxyZWN0IGNsYXNzPVwiY2xzLTFcIiB4PVwiMlwiIHk9XCIxMlwiIHdpZHRoPVwiMTlcIiBoZWlnaHQ9XCIxXCIvPjxwb2x5Z29uIGNsYXNzPVwiY2xzLTFcIiBwb2ludHM9XCIxMSAyIDEyIDIgMTIgNy4xNyAxNC4zNSA1LjIgMTUgNi4wNiAxMS41IDkgOCA2IDguNjUgNS4yIDExIDcuMTcgMTEgMlwiLz48cG9seWdvbiBjbGFzcz1cImNscy0xXCIgcG9pbnRzPVwiMTIgMjEgMTEgMjEgMTEgMTUuODMgOC42NSAxNy44IDggMTYuOTQgMTEuNSAxNCAxNSAxNyAxNC4zNSAxNy44IDEyIDE1LjgzIDEyIDIxXCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGV4dC12YWxpZ24tYm90dG9tIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLW1hc2soJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxyZWN0IGNsYXNzPVwiY2xzLTFcIiB4PVwiMlwiIHk9XCIxOFwiIHdpZHRoPVwiMTlcIiBoZWlnaHQ9XCIxXCIvPjxyZWN0IGNsYXNzPVwiY2xzLTFcIiB4PVwiMlwiIHk9XCIyMFwiIHdpZHRoPVwiMTlcIiBoZWlnaHQ9XCIxXCIvPjxwb2x5Z29uIGNsYXNzPVwiY2xzLTFcIiBwb2ludHM9XCIxMSA0IDEyIDQgMTIgMTUuMTcgMTQuMzUgMTMuMiAxNSAxNC4wNiAxMS41IDE3IDggMTQgOC42NSAxMy4yIDExIDE1LjE3IDExIDRcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgLy8gUHJlc2V0cyBvZiB0YWJsZSBib3JkZXJzXG5cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtYWxsIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTI2LjksMEgwVjI3SDI3VjBIMjYuOVpNMTMsMjZIMVYxNEgxM1YyNlptMC0xM0gxVjFIMTNWMTNaTTI2LDI2SDE0VjE0SDI2VjI2Wm0wLTEzSDE0VjFIMjZWMTNaXCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtYm9yZGVycy1ub25lIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBvcGFjaXR5PVwiMC4zXCIgZD1cIk0yNi45LDBIMFYyN0gyN1YwSDI2LjlaTTEzLDI2SDFWMTRIMTNWMjZabTAtMTNIMVYxSDEzVjEzWk0yNiwyNkgxNFYxNEgyNlYyNlptMC0xM0gxNFYxSDI2VjEzWlwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtaW5uZXIge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwb2x5Z29uIHBvaW50cz1cIjI2IDEzIDE0IDEzIDE0IDEgMTMgMSAxMyAxMyAxIDEzIDEgMTQgMTMgMTQgMTMgMjYgMTQgMjYgMTQgMTQgMjYgMTQgMjYgMTNcIi8+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMjcsMEgwVjI3SDI3VjBaTTEsMjZWMUgyNlYyNkgxWlwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtb3V0ZXIge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjcsMEgwVjI3SDI3VjBaTTEsMjZWMUgyNlYyNkgxWlwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtbGVmdCB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMjcsMEgwVjI3SDI3VjBaTTEsMjZWMUgyNlYyNkgxWlwiLz48cmVjdCB3aWR0aD1cIjFcIiBoZWlnaHQ9XCIyN1wiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtY2VudGVyIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBvcGFjaXR5PVwiMC4zXCIgZD1cIk0yNywwSDBWMjdIMjdWMFpNMSwyNlYxSDI2VjI2SDFaXCIvPjxyZWN0IHg9XCIxM1wiIHdpZHRoPVwiMVwiIGhlaWdodD1cIjI3XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtYm9yZGVycy1yaWdodCB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMjcsMEgwVjI3SDI3VjBaTTEsMjZWMUgyNlYyNkgxWlwiLz48cmVjdCB4PVwiMjZcIiB3aWR0aD1cIjFcIiBoZWlnaHQ9XCIyN1wiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtdG9wIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBvcGFjaXR5PVwiMC4zXCIgZD1cIk0yNywwSDBWMjdIMjdWMFpNMSwyNlYxSDI2VjI2SDFaXCIvPjxyZWN0IHdpZHRoPVwiMjdcIiBoZWlnaHQ9XCIxXCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtYm9yZGVycy1taWRkbGUge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTI3LDBIMFYyN0gyN1YwWk0xLDI2VjFIMjZWMjZIMVpcIi8+PHJlY3QgeT1cIjEzXCIgd2lkdGg9XCIyN1wiIGhlaWdodD1cIjFcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1ib3JkZXJzLWJvdHRvbSB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMjcsMEgwVjI3SDI3VjBaTTEsMjZWMUgyNlYyNkgxWlwiLz48cmVjdCB5PVwiMjZcIiB3aWR0aD1cIjI3XCIgaGVpZ2h0PVwiMVwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cblxuICAvLyBSZW9yZGVyXG5cbiAgJi5pY29uLW1vdmUtYmFja3dhcmQge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxyZWN0IG9wYWNpdHk9XCIwLjNcIiB4PVwiMVwiIHk9XCIxXCIgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIvPjxwYXRoIGQ9XCJNMTAsMTBWMjdIMjdWMTBIMTBaTTI2LDI2SDExVjExSDI2VjI2WlwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLW1vdmUtZm9yd2FyZCB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMTAsMTBWMjdIMjdWMTBIMTBaTTI2LDI2SDExVjExSDI2VjI2WlwiLz48cmVjdCB4PVwiMVwiIHk9XCIxXCIgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tbW92ZS1iYWNrZ3JvdW5kIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cmVjdCBvcGFjaXR5PVwiMC4zXCIgeD1cIjhcIiB5PVwiOFwiIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiLz48cGF0aCBkPVwiTTEsMVYxM0gxM1YxSDFaTTEyLDEySDJWMkgxMlYxMlpcIi8+PHBhdGggZD1cIk0xNSwxNVYyN0gyN1YxNUgxNVpNMjYsMjZIMTZWMTZIMjZWMjZaXCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tbW92ZS1mb3JlZ3JvdW5kIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBvcGFjaXR5PVwiMC4zXCIgZD1cIk0xLDFWMTNIMTNWMUgxWk0xMiwxMkgyVjJIMTJWMTJaXCIvPjxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTE1LDE1VjI3SDI3VjE1SDE1Wk0yNiwyNkgxNlYxNkgyNlYyNlpcIi8+PHJlY3QgeD1cIjhcIiB5PVwiOFwiIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiLz48L2c+PC9zdmc+Jyk7XG4gIH1cblxuICAmLmljb24tYWxpZ24tbGVmdCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDIyIDIyO1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+LnN0MHtmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDt9PC9zdHlsZT48Zz48ZyBpZD1cIlhNTElEXzM1X1wiPjxwYXRoIGlkPVwiWE1MSURfMzZfXCIgY2xhc3M9XCJzdDBcIiBkPVwiTTEsMjFoMVYxSDFWMjF6IE00LDEzdjRoMTZ2LTRINHogTTEyLDVINHY0aDhWNXpcIi8+PC9nPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gICYuaWNvbi1hbGlnbi1jZW50ZXIge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPi5zdDB7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7fTwvc3R5bGU+PGcgaWQ9XCJYTUxJRF81X1wiPjxnIGlkPVwiWE1MSURfMjRfXCI+PHBvbHlnb24gaWQ9XCJYTUxJRF8yNV9cIiBjbGFzcz1cInN0MFwiIHBvaW50cz1cIjE5LDEzIDExLDEzIDExLDkgMTUsOSAxNSw1IDExLDUgMTEsMSAxMCwxIDEwLDUgNiw1IDYsOSAxMCw5IDEwLDEzIDIsMTMgMiwxNyAxMCwxNyAxMCwyMSAxMSwyMSAxMSwxNyAxOSwxNyBcdFx0XCIvPjwvZz48L2c+PC9zdmc+Jyk7XG4gIH1cblxuICAmLmljb24tYWxpZ24tcmlnaHQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPi5zdDB7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7fTwvc3R5bGU+PGcgaWQ9XCJYTUxJRF81X1wiPjxnIGlkPVwiWE1MSURfNDJfXCI+PHBhdGggaWQ9XCJYTUxJRF80NF9cIiBjbGFzcz1cInN0MFwiIGQ9XCJNMjAsMXYyMGgxVjFIMjB6IE0yLDE3aDE2di00SDJWMTd6IE0xMCw5aDhWNWgtOFY5elwiLz48L2c+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLWFsaWduLXRvcCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDIyIDIyO1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48ZyBpZD1cIlhNTElEXzM1X1wiPjxwYXRoIGlkPVwiWE1MSURfMzZfXCIgZD1cIk0xLDF2MWgyMFYxSDF6IE05LDRINXYxNmg0VjR6IE0xNywxMlY0aC00djhIMTd6XCIvPjwvZz48L2c+PC9zdmc+Jyk7XG4gIH1cblxuICAmLmljb24tYWxpZ24tbWlkZGxlIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjIgMjI7XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4uc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO308L3N0eWxlPjxnIGlkPVwiWE1MSURfNV9cIj48ZyBpZD1cIlhNTElEXzI0X1wiPjxwb2x5Z29uIGlkPVwiWE1MSURfMjVfXCIgY2xhc3M9XCJzdDBcIiBwb2ludHM9XCIxMywyIDEzLDEwIDksMTAgOSw2IDUsNiA1LDEwIDEsMTAgMSwxMSA1LDExIDUsMTUgOSwxNSA5LDExIDEzLDExIDEzLDE5IDE3LDE5IDE3LDExIDIxLDExIDIxLDEwIDE3LDEwIDE3LDIgXHRcdFwiLz48L2c+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLWFsaWduLWJvdHRvbSB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDIyIDIyO1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48ZyBpZD1cIlhNTElEXzM1X1wiPjxwYXRoIGlkPVwiWE1MSURfMzZfXCIgZD1cIk0yMSwyMHYtMUgxdjFIMjF6IE05LDFINXYxNmg0VjF6IE0xMyw5djhoNFY5SDEzelwiLz48L2c+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLWFsaWduLWhvcml6b250YWwge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PGcgaWQ9XCJYTUxJRF8zNV9cIj48cGF0aCBpZD1cIlhNTElEXzM2X1wiIGQ9XCJNMSwxdjFoMjBWMUgxeiBNMC45OTk5OTksMTkuMDAwMDA3NlYyMGgyMHYtMC45OTk5OTI0SDAuOTk5OTk5eiBNOS4wMDAwMDEsMi45OTk5OTk1aC00djE1aDRWMi45OTk5OTk1eiBNMTcsMTMuOTk5OTk5VjYuOTk5OTk4NmgtMy45OTk5OTl2Ny4wMDAwMDA1SDE3elwiLz48L2c+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLWFsaWduLXZlcnRpY2FsIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjIgMjI7XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxnIGlkPVwiWE1MSURfMzVfXCI+PHBhdGggaWQ9XCJYTUxJRF8zNl9cIiBkPVwiTTAuOTk5OTk5OCwyMWgxdi0yMGgtMVYyMXogTTE5LjAwMDAwNzYsMjFIMjB2LTIwaC0wLjk5OTk5MjRWMjF6IE0yLjk5OTk5OTUsMTIuOTk5OTk5djMuOTk5OTk5aDE1IHYtMy45OTk5OTlIMi45OTk5OTk1eiBNMTMuOTk5OTk5LDQuOTk5OTk5SDYuOTk5OTk4NnY0aDcuMDAwMDAwNVY0Ljk5OTk5OXpcIi8+PC9nPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gIC8vIEZvcm1hdHNcblxuICAmLmljb24tZm9ybWF0LXBkZiB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDIyIDIyO1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBpZD1cIlhNTElEXzJfXCIgZD1cIk0yLDIxaDE4VjRsLTMuOTc5MTY2LTRMMiwwVjIxeiBNMTksOHYxMkgzVjFoMTJsNCw0Vjh6XCIvPjwvZz48Zz48cGF0aCBkPVwiTTkuOTk5NjMyOCw3LjI5OTQxMjNMOS45OTk2MzI4LDcuMjk5NDEyM0MxMC4wOTg4MjQ1LDcuMjk5NDEyMywxMC4wOTg4MjQ1LDcuMjk5NDEyMyw5Ljk5OTYzMjgsNy4yOTk0MTIzXHRjMC4wOTkxOTE3LTAuNDAwNDQwNywwLjIwMDIyMDEtMC42MDA2NjE4LDAuMjAwMjIwMS0wLjkwMDA3MzVWNi4xOTkxMTgxYzAuMDk5MTkxNy0wLjQ5OTYzMjQsMC4wOTkxOTE3LTAuOTAwMDczNSwwLTAuOTk5MjY1MiBjMCwwLDAsMCwwLTAuMDk5MTkxN2wtMC4wOTkxOTE3LTAuMDk5MTkxN2wwLDBsMCwwYzAsMCwwLDAuMDk5MTkxNy0wLjA5OTE5MTcsMC4wOTkxOTE3IEM5Ljc5OTQxMTgsNS42OTk0ODU4LDkuNzk5NDExOCw2LjM5OTMzODcsOS45OTk2MzI4LDcuMjk5NDEyM0w5Ljk5OTYzMjgsNy4yOTk0MTIzeiBNNywxNC4yMDA1ODczXHRjLTAuMjAwMjIwMSwwLjA5OTE5MjYtMC40MDA0NDA3LDAuMjAwMjIxMS0wLjQ5OTYzMjgsMC4yOTk0MTE4Yy0wLjY5OTg1MjksMC42MDA2NjEzLTEuMTk5NDg1OCwxLjMwMDUxNDItMS4zMDA1MTQyLDEuNTk5OTI2OWwwLDAgbDAsMGwwLDBDNS43OTg2Nzc0LDE2LjAwMDczNDMsNi4zOTkzMzg3LDE1LjQwMDA3NCw3LDE0LjIwMDU4NzNDNy4wOTkxOTE3LDE0LjIwMDU4NzMsNy4wOTkxOTE3LDE0LjIwMDU4NzMsNywxNC4yMDA1ODczIEM3LjA5OTE5MTcsMTQuMjAwNTg3Myw3LDE0LjIwMDU4NzMsNywxNC4yMDA1ODczeiBNMTYuMTk5MTE5NiwxMi42OTk4NTM5XHRjLTAuMDk5MTkzNi0wLjA5OTE5MjYtMC40OTk2MzM4LTAuNDAwNDQxMi0xLjg5OTMzOTctMC40MDA0NDEyYy0wLjA5OTE5MjYsMC0wLjA5OTE5MjYsMC0wLjIwMDIyMTEsMGwwLDBjMCwwLDAsMCwwLDAuMDk5MTkyNiBjMC42OTk4NTI5LDAuMjk5NDExOCwxLjM5OTcwNTksMC40OTk2MzI4LDEuODk5MzM4NywwLjQ5OTYzMjhjMC4wOTkxOTE3LDAsMC4wOTkxOTE3LDAsMC4yMDAyMjIsMGwwLDBoMC4wOTkxOTE3IGMwLDAsMCwwLDAtMC4wOTkxOTI2bDAsMEMxNi4zMDAxNDgsMTIuNzk5MDQ0NiwxNi4xOTkxMTk2LDEyLjc5OTA0NDYsMTYuMTk5MTE5NiwxMi42OTk4NTM5eiBNMTYuNTk5NTU5OCwxMy40OTg4OTg1IGMtMC4yMDAyMjIsMC4wOTkxOTE3LTAuNDk5NjMzOCwwLjIwMDIyMTEtMC45MDAwNzQsMC4yMDAyMjExYy0wLjgwMDg4MTQsMC0yLjAwMDM2ODEtMC4yMDAyMjExLTIuOTk5NjMxOS0wLjY5OTg1MjkgYy0xLjcwMDk1NTQsMC4yMDAyMjExLTIuOTk5NjMyOCwwLjQwMDQ0MDItNC4wMDA3MzUzLDAuODAwODgxNGMtMC4wOTkxOTE3LDAtMC4wOTkxOTE3LDAtMC4yMDAyMjAxLDAuMDk5MTkxNyBDNy4yOTk0MTIzLDE2LjAwMDczNDMsNi4yOTgzMDk4LDE3LDUuNDk5MjY1MiwxN2MtMC4yMDAyMjA2LDAtMC4yOTk0MTIzLDAtMC40MDA0NDEyLTAuMDk5MTkxN2wtMC40OTk2MzI0LTAuMjk5NDExOFYxNi41MDIyMDNcdEM0LjUsMTYuMzAxOTgyOSw0LjUsMTYuMjAyNzkxMiw0LjUsMTYuMDAyNTcxMWMwLjA5OTE5MTctMC40OTk2MzI4LDAuNjk5ODUyOS0xLjM5OTcwNjgsMS44OTkzMzg3LTIuMDk5NTU5OCBjMC4yMDAyMjAxLTAuMDk5MTkxNywwLjQ5OTYzMjgtMC4yOTk0MTE4LDAuOTAwMDczNS0wLjQ5OTYzMjhjMC4yOTk0MTE4LTAuNDk5NjMyOCwwLjYwMDY2MTMtMS4xMDAyOTQxLDAuOTk5MjY1Mi0xLjgwMDE0NjEgYzAuNDk5NjMyOC0wLjk5OTI2NTcsMC44MDA4ODE0LTIuMDAwMzY4MSwxLjEwMDI5MzItMi45MDA0NDEybDAsMEM4Ljk5ODUzMDQsNy41MDMzMDU0LDguNzk4MzA5Myw2LjgwMzQ1MjUsOS4xOTg3NTA1LDUuNDAxOTA5NEM5LjI5Nzk0MjIsNS4wMDE0Njg3LDkuNTk5MTkxNyw0LjYwMTAyOCw5Ljk5OTYzMjgsNC42MDEwMjhoMC4yMDAyMjAxYzAuMjAwMjIwMSwwLDAuNDAwNDQwMiwwLjA5OTE5MTcsMC42MDA2NjEzLDAuMjAwMjIwNiBjMC42OTk4NTI5LDAuNjk5ODUyOSwwLjQwMDQ0MTIsMi4yOTk3Nzk0LDAsMy42MDAyOTQxYzAsMC4wOTkxOTE3LDAsMC4wOTkxOTE3LDAsMC4wOTkxOTE3IGMwLjQwMDQ0MTIsMS4xMDAyOTMyLDAuOTk5MjY1NywyLjAwMDM2NzIsMS41OTk5MjYsMi42MDEwMjg0YzAuMjk5NDExOCwwLjIwMDIyMTEsMC40OTk2MzI4LDAuNDAwNDQwMiwwLjkwMDA3NCwwLjYwMDY2MTMgYzAuNDk5NjMyOCwwLDAuOTAwMDczMS0wLjA5OTE5MTcsMS4zMDA1MTQyLTAuMDk5MTkxN2MxLjE5OTQ4NDgsMCwyLjAwMDM2ODEsMC4yMDAyMjAxLDIuMjk5Nzc5OSwwLjY5OTg1Mlx0QzE3LDEyLjUwMzMwNTQsMTcsMTIuNzAzNTI1NSwxNywxMi45MDM3NDU3QzE2LjkwMDgwODMsMTIuOTk5MjY1NywxNi43OTk3Nzk5LDEzLjMwMDUxNDIsMTYuNTk5NTU5OCwxMy40OTg4OTg1eiBNMTAuMDk4ODI0NSw5LjU5OTE5MTdDOS44OTg2MDM0LDEwLjI5OTA0NDYsOS40OTgxNjIzLDExLjA5OTkyNiw5LjA5OTU1ODgsMTIgYy0wLjIwMDIyMDEsMC40MDA0NDAyLTAuNDAwNDQwMiwwLjY5OTg1Mi0wLjYwMDY2MTMsMS4xMDAyOTQxaDAuMDk5MTkxN2gwLjA5OTE5MTdsMCwwIGMxLjMwMDUxNDItMC40OTk2MzI4LDIuNS0wLjgwMDg4MTQsMy4zMDA4ODE0LTAuOTAwMDczMUMxMS43OTc5NDEyLDEyLjEwMTAyODQsMTEuNjk4NzUwNSwxMiwxMS41OTc3MjIxLDExLjkwMDgwODMgQzExLjA5OTkyNiwxMS4zMDAxNDcxLDEwLjQ5OTI2NTcsMTAuNDk5MjY1NywxMC4wOTg4MjQ1LDkuNTk5MTkxN3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1mb3JtYXQtcHB0eCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiLTIzOCAyNDAgMjIgMjJcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAtMjM4IDI0MCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggaWQ9XCJYTUxJRF8yX1wiIGQ9XCJNLTIzNiwyNjFoMTh2LTE3bC0zLjk3OTE3MTgtNEgtMjM2VjI2MXogTS0yMTksMjQ4djEyaC0xNnYtMTloMTJsNCw0VjI0OHpcIi8+PC9nPjxnPjxwYXRoIGQ9XCJNLTIyOC44MjI2OTI5LDI1MC44NjQ2ODUxYzAuMTM3MDg1LTAuMDYwNzkxLDAuMjM0MTkxOS0wLjIzMDIyNDYsMC4zMTMxMTA0LTAuMzY0NzQ2MVx0YzAuMDc5Mjg0Ny0wLjEzNTE5MjksMC4wODYxODE2LTAuMjkzNTE4MSwwLjA4NjE4MTYtMC40NzM5MzhjMC0wLjIyMjEwNjktMC4wNjEzNDAzLTAuNDE4NjQwMS0wLjE3MjM2MzMtMC41NjAxODA3XHRjLTAuMTEwMjkwNS0wLjE0MDUwMjktMC4yOTY4NzUtMC4yNjI4Nzg0LTAuNDYyODkwNi0wLjI5MzE1MTljLTAuMTIxMDkzOC0wLjAyMzMxNTQtMC4yMzk2ODUxLTAuMDAxMjgxNy0wLjQ1MzU1MjIsMC4wMDkwOTQyIGwtMC4zMTE1MjM0LDAuMDEwMzc2djEuNzkyNTQxNWgwLjQ1MjM5MjZDLTIyOC45ODE1MDYzLDI1MC45OTI3MzY4LTIyOC45NTg2MTgyLDI1MC45MjQ5ODc4LTIyOC44MjI2OTI5LDI1MC44NjQ2ODUxelwiLz48cGF0aCBkPVwiTS0yMzMsMjU2LjExNDEzNTdsNy4zMzMzMTMsMS4zNTUzNDY3VjI0NUwtMjMzLDI0Ni4zMjY4NDMzVjI1Ni4xMTQxMzU3eiBNLTIzMC44NjYwODg5LDI0OC4yODE4NjA0bDEuNDk2ODg3Mi0wLjA5Nzc3ODMgYzAuNjA3Nzg4MS0wLjAzOTczMzksMC45MDc1MzE3LTAuMDU1NzI1MSwxLjEwMTgwNjYtMC4wMDcxNDExYzAuMzAzMjIyNywwLjA3MzYwODQsMC42MzcyMDcsMC4yMzQ5ODU0LDAuODQ4MzI3NiwwLjUzODE0N1x0YzAuMjEzODY3MiwwLjMwNzA2NzksMC4zNTU1OTA4LDAuNzU5MjE2MywwLjM1NTU5MDgsMS4yNjIwODVjMCwwLjM4Nzg3ODQtMC4wNjIzMTY5LDAuNzEzMDczNy0wLjE4NjI3OTMsMC45NzQxMjExXHRjLTAuMTIzMDQ2OSwwLjI1OTA5NDItMC4yNzgwMTUxLDAuNDU5MTA2NC0wLjQ2NDA1MDMsMC42MDAxNTg3Yy0wLjE4Mzk2LDAuMTM5NDY1My0wLjM5OTEwODksMC4yNzAwMTk1LTAuNTU4Nzc2OSwwLjMyNzI3MDUgYy0wLjMxNDU3NTIsMC4wNzc0NTM2LTAuNTI4Njg2NSwwLjE3NDc0MzctMC45ODAyODU2LDAuMTUwODE3OWgtMC41NzA4NjE4djEuOTU2MjM3OGwtMS4wNDIzNTg0LTAuMTA4MTU0M1YyNDguMjgxODYwNHpcIi8+PHBhdGggZD1cIk0tMjIxLjcyNjY4NDYsMjQ3SC0yMjV2OWgzLjI3MzMxNTRDLTIyMS4zMjUzNDc5LDI1Ni0yMjEsMjU1LjY3NDY1MjEtMjIxLDI1NS4yNzMzMTU0di03LjU0NjYzMDlcdEMtMjIxLDI0Ny4zMjUzNDc5LTIyMS4zMjUzNDc5LDI0Ny0yMjEuNzI2Njg0NiwyNDd6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxufVxuXG4vLyBPdmVyd3JpdGUgY29sb3IgZm9yIHRvb2xiYXJcbi5uYXZiYXIge1xuICBpLmljb24ge1xuICAgICYuaWNvbi11bmRvIHtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHtuYXZCYXJJY29uQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0yMCwxN3YtMmMwLTEuNy0xLjMtMy0zLTNIMy43bDMuNCwzLjRsLTEuNCwxLjRsLTUuMi01LjJMMCwxMWwwLjUtMC42bDUuMi01LjJsMS40LDEuNEwzLjcsMTBIMTdjMi44LDAsNSwyLjIsNSw1djJIMjB6XCIvPjwvZz48L3N2Zz4nKTtcbiAgICB9XG4gICAgJi5pY29uLXJlZG8ge1xuICAgICAgd2lkdGg6IDIycHg7XG4gICAgICBoZWlnaHQ6IDIycHg7XG4gICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe25hdkJhckljb25Db2xvcn1cIj48Zz48cGF0aCBkPVwiTTAsMTd2LTJjMC0yLjgsMi4yLTUsNS01aDEzLjNsLTMuNC0zLjRsMS40LTEuNGw1LjIsNS4yTDIyLDExbC0wLjUsMC42bC01LjIsNS4ybC0xLjQtMS40bDMuNC0zLjRINWMtMS43LDAtMywxLjMtMywzdjJIMHpcIi8+PC9nPjwvc3ZnPicpO1xuICAgIH1cbiAgICAmLmljb24tc2VhcmNoIHtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHtuYXZCYXJJY29uQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xOS41LDE2LjhMMTYsMTMuM2MwLjctMS4xLDEuMS0yLjQsMS4xLTMuOEMxNyw1LjQsMTMuNiwyLDkuNSwyUzIsNS40LDIsOS41UzUuNCwxNyw5LjUsMTdjMS40LDAsMi43LTAuNCwzLjgtMS4xbDMuNSwzLjVjMC43LDAuNywxLjksMC43LDIuNiwwQzIwLjIsMTguNywyMC4yLDE3LjYsMTkuNSwxNi44eiBNOS41LDE1LjNjLTMuMiwwLTUuOC0yLjYtNS44LTUuOHMyLjYtNS44LDUuOC01LjhzNS44LDIuNiw1LjgsNS44UzEyLjcsMTUuMyw5LjUsMTUuM3pcIi8+PC9nPjwvc3ZnPicpO1xuICAgIH1cbiAgICAmLmljb24tYnVyZ2VyIHtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCItOCAxIDIyIDIyXCIgZmlsbD1cIkB7bmF2QmFySWNvbkNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNLTYsNnYyaDE4VjZILTZ6IE0tNiwxM2gxOHYtMkgtNlYxM3ogTS02LDE4aDE4di0ySC02VjE4elwiLz48L2c+PC9zdmc+Jyk7XG4gICAgfVxuICAgICYuaWNvbi1wbHVzIHtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHtuYXZCYXJJY29uQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0yMSwxMmgtOXY5aC0ydi05SDF2LTJoOVYxaDJ2OWg5VjEyelwiLz48L2c+PC9zdmc+Jyk7XG4gICAgfVxuICAgICYuaWNvbi1lZGl0IHtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHtuYXZCYXJJY29uQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0wLDIwaDIydjFIMFYyMHpcIi8+PHBvbHlnb24gcG9pbnRzPVwiMTcuMSwzLjEgMy41LDE2LjcgMywyMCA2LjMsMTkuNSAxOS45LDUuOSBcdFwiLz48cGF0aCBkPVwiTTIwLjUsNS4zTDIyLDMuOGMwLDAtMC4yLTEuMi0wLjktMS45QzIwLjQsMS4xLDE5LjIsMSwxOS4yLDFsLTEuNSwxLjVMMjAuNSw1LjN6XCIvPjwvZz48L3N2Zz4nKTtcbiAgICB9XG4gICAgJi5pY29uLXBsYXkge1xuICAgICAgd2lkdGg6IDIycHg7XG4gICAgICBoZWlnaHQ6IDIycHg7XG4gICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe25hdkJhckljb25Db2xvcn1cIj48Zz48cGF0aCBkPVwiTTQuMDQ2NDM2MywyLjk4ODQ1NTNjMC4wMDY1MjYsMC4wMDI5NiwwLjAxNDIzNDUsMC4wMDY4MzUsMC4wMjMxNDM4LDAuMDExOTAyMSBjMC41OTA4NjA0LDAuMzM1NzYzNywxMi43MTE4Mzk3LDcuMjkyNDQzMywxMy44OTc3NDg5LDguMDI2ODQwMmMtMC41ODMxNTg1LDAuMzQxNzc1OS0xMy4wMTM3NTg3LDcuNDg3OTI3NC0xMy45MzQ2NTksNy45ODI2NzI3IEw0LjA0NjQzNjMsMi45ODg0NTUzIE0zLjk4ODkzNTcsMkMzLjQ0Mjc3OTUsMi4wMDAwNTc3LDMuMDAwNTI1LDIuNDUzMzU3NSwzLjAwMDUyNSwzLjAxNTM0OFx0YzAsMC41NzM0ODcsMCwxNS4xNjMyOTU3LDAsMTUuOTk0NTIyMUMzLjAwMDUyNSwxOS42MjI5NjMsMy40Nzk2MTA0LDIwLDMuOTk0MDU4OCwyMCBjMC4xNzI5MzcyLDAsMC4zNDk5MTkxLTAuMDQyNjMxMSwwLjUxMzk3NjMtMC4xMzMyMjI2YzAuODkwNTYwMi0wLjQ5MTA0NSwxMy4xODgwODk0LTcuNTU4MzM3MiwxMy45NDA3Mzg3LTcuOTk5NDQ1OSBjMC42NzUxMjEzLTAuMzk1NTIwMiwwLjY4NjczMTMtMS4zMzc1MTIsMC0xLjczMjY2MDNDMTcuNDAzMTc1NCw5LjUzMzMyNzEsNS4xNTIzODUyLDIuNTAxODUyLDQuNTM5Mzk1MywyLjE1MzUxNjUgQzQuMzUyNjIwMSwyLjA0NzI3OTQsNC4xNjU0MDEsMS45OTk5ODEzLDMuOTg4OTM1NywyTDMuOTg4OTM1NywyelwiLz48L2c+PC9zdmc+Jyk7XG4gICAgfVxuICAgICYuaWNvbi1zZXR0aW5ncyB7XG4gICAgICB3aWR0aDogMjJweDtcbiAgICAgIGhlaWdodDogMjJweDtcbiAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7bmF2QmFySWNvbkNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMTIuMSwySDkuOUM5LjYsMiw5LjQsMi4yLDkuMywyLjVMOC44LDQuOWMwLDAuMi0wLjIsMC4zLTAuMywwLjNzLTAuMSwwLTAuMi0wLjFMNi4yLDMuOEM2LjEsMy43LDYsMy43LDUuOCwzLjdjLTAuMSwwLTAuMywwLTAuNCwwLjFMMy44LDUuNGMtMC4xLDAuMi0wLjIsMC41LDAsMC44bDEuMywyLjFjMC4xLDAuMiwwLjEsMC40LTAuMiwwLjVMMi41LDkuM0MyLjIsOS40LDIsOS42LDIsOS45djIuMmMwLDAuMywwLjIsMC41LDAuNSwwLjZsMi40LDAuNWMwLjMsMC4xLDAuNCwwLjMsMC4yLDAuNWwtMS4zLDIuMWMtMC4yLDAuMi0wLjEsMC42LDAuMSwwLjhsMS42LDEuNmMwLjEsMC4xLDAuMywwLjIsMC40LDAuMnMwLjIsMCwwLjMtMC4xTDguMywxN2MwLjEtMC4xLDAuMS0wLjEsMC4yLTAuMXMwLjMsMC4xLDAuMywwLjNsMC41LDIuM0M5LjQsMTkuOCw5LjYsMjAsOS45LDIwaDIuMmMwLjMsMCwwLjUtMC4yLDAuNi0wLjVsMC41LTIuNGMwLTAuMiwwLjEtMC4zLDAuMy0wLjNjMC4xLDAsMC4xLDAsMC4yLDAuMWwyLjEsMS4zYzAuMSwwLjEsMC4yLDAuMSwwLjMsMC4xYzAuMiwwLDAuMy0wLjEsMC40LTAuMmwxLjYtMS42YzAuMi0wLjIsMC4yLTAuNSwwLjEtMC44bC0xLjMtMi4xYy0wLjItMC4yLTAuMS0wLjUsMC4yLTAuNWwyLjQtMC41YzAuMy0wLjEsMC41LTAuMywwLjUtMC42VjkuOGMwLTAuMy0wLjItMC41LTAuNS0wLjZsLTIuNC0wLjVjLTAuMy0wLjEtMC40LTAuMy0wLjItMC41bDEuMy0yLjFjMC4yLTAuMiwwLjEtMC42LTAuMS0wLjhsLTEuNi0xLjZjLTAuMS0wLjEtMC4zLTAuMi0wLjQtMC4ycy0wLjIsMC0wLjMsMC4xbC0yLjEsMS4zQzEzLjYsNSwxMy42LDUsMTMuNSw1cy0wLjMtMC4xLTAuMy0wLjNsLTAuNS0yLjJDMTIuNiwyLjIsMTIuNCwyLDEyLjEsMkwxMi4xLDJ6IE0xMSwxNC41Yy0xLjksMC0zLjUtMS42LTMuNS0zLjVTOS4xLDcuNSwxMSw3LjVzMy41LDEuNiwzLjUsMy41UzEyLjksMTQuNSwxMSwxNC41TDExLDE0LjV6XCIvPjwvZz48L3N2Zz4nKTtcbiAgICB9XG4gICAgJi5pY29uLXByZXYge1xuICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe25hdkJhckljb25Db2xvcn1cIj48Zz48cG9seWdvbiBwb2ludHM9XCI1LjEsMTAuOSAxMy45LDIgMTYsNC4xIDkuMiwxMS4xIDE2LDE3LjkgMTMuOSwyMCA1LjEsMTEuMiA1LDExLjEgXCIvPjwvZz48L3N2Zz4nKTtcbiAgICB9XG4gICAgJi5pY29uLW5leHQge1xuICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe25hdkJhckljb25Db2xvcn1cIj48Zz48cG9seWdvbiBwb2ludHM9XCIxNi45LDEwLjkgOC4xLDIgNiw0LjEgMTIuOCwxMS4xIDYsMTcuOSA4LjEsMjAgMTYuOSwxMS4yIDE3LDExLjEgXCIvPjwvZz48L3N2Zz4nKTtcbiAgICB9XG4gICAgJi5pY29uLWV4cGFuZC1kb3duIHtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHtuYXZCYXJJY29uQ29sb3J9XCI+PGc+PHBvbHlnb24gcG9pbnRzPVwiMTAuOSwxNi45IDIsOC4xIDQuMSw2IDExLjEsMTIuOCAxNy45LDYgMjAsOC4xIDExLjIsMTYuOSAxMS4xLDE3IFwiLz48L2c+PC9zdmc+Jyk7XG4gICAgfVxuICB9XG59IiwiLy8gRW5jb2RlZCBTVkcgQmFja2dyb3VuZFxuLmVuY29kZWQtc3ZnLW1hc2soQHN2Zykge1xuICBAdXJsOiBgZW5jb2RlVVJJQ29tcG9uZW50KEB7c3ZnfSlgO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCxAe3VybH1cIik7XG59IiwiQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL19taXhpbnMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL19jb2xvcnMtdmFycy5sZXNzJyk7XG5cbi8vIENvbG9yc1xuQHRoZW1lQ29sb3I6ICNERjY3Mzc7IC8vICgyMjMsMTAzLDU1KVxuQG5hdkJhckljb25Db2xvcjogI2ZmZjtcblxuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2ludHJvLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9ncmlkLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC92aWV3cy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcGFnZXMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3Rvb2xiYXJzLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC90b29sYmFycy1wYWdlcy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvc2VhcmNoYmFyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9tZXNzYWdlYmFyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9pY29ucy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvYmFkZ2VzLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2NoaXBzLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9jb250ZW50LWJsb2NrLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9saXN0cy5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9jb250YWN0cy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvZm9ybXMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2Zsb2F0aW5nLWJ1dHRvbi5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9hY2NvcmRpb24ubGVzcycpO1xuLy9AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvY2FyZHMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL21vZGFscy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcGFuZWxzLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2xhenktbG9hZC5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvdGFicy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvbWVzc2FnZXMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3N0YXR1c2Jhci5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcHJlbG9hZGVyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9wcm9ncmVzc2Jhci5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9wdWxsLXRvLXJlZnJlc2gubGVzcycpO1xuLy9AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvaW5maW5pdGUtc2Nyb2xsLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2F1dG9jb21wbGV0ZS5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9zd2lwZXIubGVzcycpO1xuLy9AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcGhvdG8tYnJvd3Nlci5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcGlja2VyLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2NhbGVuZGFyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9ub3RpZmljYXRpb25zLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2xvZ2luLXNjcmVlbi5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcmlwcGxlLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9kaXNhYmxlZC5sZXNzJyk7XG5cblxuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvX21peGlucy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9tYXRlcmlhbC9fY29udGFpbmVyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL21hdGVyaWFsL19kYXRhdmlldy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9tYXRlcmlhbC9fbGlzdHZpZXcubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvbWF0ZXJpYWwvX2J1dHRvbi5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9tYXRlcmlhbC9fY29udGV4dG1lbnUubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvbWF0ZXJpYWwvX2NvbG9yLXBhbGV0dGUubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvbWF0ZXJpYWwvX2Fib3V0Lmxlc3MnKTtcblxuQGltcG9ydCB1cmwoJ21hdGVyaWFsL19zZWFyY2gubGVzcycpO1xuQGltcG9ydCB1cmwoJ21hdGVyaWFsL19pY29ucy5sZXNzJyk7XG5cbi8vIFRvcCBvZmZzZXRcblxuI2VkaXRvcl9zZGsge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiAwO1xuICB0b3A6IEB0b29sYmFyU2l6ZTtcbiAgYm90dG9tOiAwO1xuICBoZWlnaHQ6IGF1dG87XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIC50cmFuc2l0aW9uKDMwMG1zKTtcbn1cblxuLy8gRGlzYWJsZSB0ZXh0IHNlbGVjdFxuKiB7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG5pbnB1dCwgdGV4dGFyZWEge1xuICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6ZGVmYXVsdDtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDp0ZXh0O1xuICB1c2VyLXNlbGVjdDp0ZXh0O1xufVxuXG4vLyBBZGQgQ29udGFpbmVyXG5cbiNhZGQtdGFibGUsXG4jYWRkLXNoYXBlIHtcbiAgLnBhZ2Uge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIH1cbn1cblxuLy8gVGFibGUgc3R5bGVzXG5cbi50YWJsZS1zdHlsZXMge1xuICAucm93IHtcbiAgICAmLCBsaSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICAgIH1cbiAgfVxuXG4gIGxpIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMXB4O1xuXG4gICAgaW1nIHtcbiAgICAgIHdpZHRoOiA3MHB4O1xuICAgICAgaGVpZ2h0OiA1MHB4O1xuICAgIH1cbiAgfVxufVxuXG4vLyBTaGFwZXNcblxuLnNoYXBlcyB7XG4gIGxpIHtcbiAgICB3aWR0aDogNzBweDtcbiAgICBoZWlnaHQ6IDcwcHg7XG4gICAgbWFyZ2luOiAwIDFweDtcblxuICAgIC50aHVtYiB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEB0aGVtZUNvbG9yO1xuICAgIH1cbiAgfVxufVxuXG4vLyBCdWxsZXRzIGFuZCBudW1iZXJzXG5cbi5idWxsZXRzLFxuLm51bWJlcnMge1xuICB1bCB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbiAgfVxuXG4gIGxpIHtcbiAgICB3aWR0aDogNzBweDtcbiAgICBoZWlnaHQ6IDcwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAxcHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2M0YzRjNDtcbiAgICBodG1sLnBpeGVsLXJhdGlvLTIgJiB7XG4gICAgICBib3JkZXI6IDAuNXB4IHNvbGlkICNjNGM0YzQ7XG4gICAgfVxuICAgIGh0bWwucGl4ZWwtcmF0aW8tMyAmIHtcbiAgICAgIGJvcmRlcjogMC4zM3B4IHNvbGlkICNjNGM0YzQ7XG4gICAgfVxuXG4gICAgJi5hY3RpdmUge1xuICAgICAgLy9cbiAgICB9XG5cbiAgICAudGh1bWIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xuXG4gICAgICBsYWJlbCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAzNCU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIFNsaWRlIGxheW91dFxuXG4uc2xpZGUtbGF5b3V0IHtcbiAgLnJvdyB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICB9XG5cbiAgbGkge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAxcHg7XG5cbiAgICBpbWcge1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwwLDAsMC4xNSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFNsaWRlIHRoZW1lXG5cbi5zbGlkZS10aGVtZSB7XG4gIC5yb3cge1xuICAgIG1hcmdpbi10b3A6IDE0cHg7XG4gICAgbWFyZ2luLWJvdHRvbTogMTJweDtcblxuICAgIGRpdiB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBwYWRkaW5nOiAzcHg7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLDAsMCwwLjE1KTtcbiAgICAgIHdpZHRoOiA4NXB4O1xuICAgICAgaGVpZ2h0OiAzOHB4O1xuICAgIH1cbiAgfVxufVxuXG4vLyBDaGFydHNcblxuLmNoYXJ0LXR5cGVzIHtcbiAgbGkge1xuICAgIHdpZHRoOiA2MHB4O1xuICAgIGhlaWdodDogNjBweDtcbiAgICBtYXJnaW46IDZweDtcblxuICAgIC50aHVtYiB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICB9XG4gIH1cbn0iXX0= */ \ No newline at end of file diff --git a/apps/presentationeditor/mobile/resources/less/ios/_icons.less b/apps/presentationeditor/mobile/resources/less/ios/_icons.less index 2fe1ae30e..c0379093b 100644 --- a/apps/presentationeditor/mobile/resources/less/ios/_icons.less +++ b/apps/presentationeditor/mobile/resources/less/ios/_icons.less @@ -363,4 +363,9 @@ i.icon { height: 22px; .encoded-svg-background(''); } + &.icon-format-odp { + width: 22px; + height: 22px; + .encoded-svg-background(''); + } } \ No newline at end of file diff --git a/apps/presentationeditor/mobile/resources/less/material/_icons.less b/apps/presentationeditor/mobile/resources/less/material/_icons.less index 890ab0ca9..ce6367503 100644 --- a/apps/presentationeditor/mobile/resources/less/material/_icons.less +++ b/apps/presentationeditor/mobile/resources/less/material/_icons.less @@ -333,6 +333,11 @@ i.icon { height: 22px; .encoded-svg-background(''); } + &.icon-format-odp { + width: 22px; + height: 22px; + .encoded-svg-background(''); + } } // Overwrite color for toolbar diff --git a/apps/presentationeditor/sdk_dev_scripts.js b/apps/presentationeditor/sdk_dev_scripts.js index 1fd27741d..3d2674dd3 100644 --- a/apps/presentationeditor/sdk_dev_scripts.js +++ b/apps/presentationeditor/sdk_dev_scripts.js @@ -5,6 +5,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/downloaderfiles.js", "../../../../sdkjs/common/docscoapicommon.js", "../../../../sdkjs/common/docscoapi.js", + "../../../../sdkjs/common/spellcheckapi.js", "../../../../sdkjs/common/apiCommon.js", "../../../../sdkjs/common/SerializeCommonWordExcel.js", "../../../../sdkjs/common/editorscommon.js", @@ -111,6 +112,8 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/slide/Editor/Format/SlideMaster.js", "../../../../sdkjs/slide/Editor/Format/Layout.js", "../../../../sdkjs/slide/Editor/Format/Comments.js", + "../../../../sdkjs/slide/Editor/Format/NotesMaster.js", + "../../../../sdkjs/slide/Editor/Format/Notes.js", "../../../../sdkjs/word/Editor/ParagraphContent.js", "../../../../sdkjs/word/Editor/Paragraph/ParaTextPr.js", "../../../../sdkjs/word/Editor/Paragraph/ParaTextPrChanges.js", diff --git a/apps/spreadsheeteditor/embed/index.html b/apps/spreadsheeteditor/embed/index.html index 0695c7f3d..f45c3ecef 100644 --- a/apps/spreadsheeteditor/embed/index.html +++ b/apps/spreadsheeteditor/embed/index.html @@ -322,9 +322,6 @@ - - - - - - - diff --git a/apps/spreadsheeteditor/embed/js/ApplicationView.js b/apps/spreadsheeteditor/embed/js/ApplicationView.js index ededb84b7..52ffc9df1 100644 --- a/apps/spreadsheeteditor/embed/js/ApplicationView.js +++ b/apps/spreadsheeteditor/embed/js/ApplicationView.js @@ -42,10 +42,10 @@ var ApplicationView = new(function(){ $btnTools.addClass('dropdown-toggle').attr('data-toggle', 'dropdown').attr('aria-expanded', 'true'); $btnTools.parent().append( ''); } diff --git a/apps/spreadsheeteditor/main/app.js b/apps/spreadsheeteditor/main/app.js index db740f9e6..7ef127121 100644 --- a/apps/spreadsheeteditor/main/app.js +++ b/apps/spreadsheeteditor/main/app.js @@ -54,8 +54,6 @@ require.config({ jmousewheel : '../vendor/perfect-scrollbar/src/jquery.mousewheel', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', allfonts : '../../sdkjs/common/AllFonts', sdk : '../../sdkjs/cell/sdk-all-min', api : 'api/documents/api', @@ -108,9 +106,7 @@ require.config({ 'underscore', 'allfonts', 'xregexp', - 'sockjs', - 'jsziputils', - 'jsrsasign' + 'sockjs' ] }, gateway: { diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 2448521e6..849449290 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -202,13 +202,13 @@ define([ me.api.asc_enableKeyEvents(false); }, 'modal:close': function(dlg) { - if (dlg && dlg.$lastmodal && dlg.$lastmodal.size() < 1) { + if (dlg && dlg.$lastmodal && dlg.$lastmodal.length < 1) { me.isModalShowed = false; me.api.asc_enableKeyEvents(true); } }, 'modal:hide': function(dlg) { - if (dlg && dlg.$lastmodal && dlg.$lastmodal.size() < 1) { + if (dlg && dlg.$lastmodal && dlg.$lastmodal.length < 1) { me.isModalShowed = false; me.api.asc_enableKeyEvents(true); } diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 8cc7b10c8..afcb9ede3 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -810,7 +810,20 @@ define([ props = me.api.asc_getChartObject(); if (props) { props.putType(record.get('type')); - (ischartedit) ? me.api.asc_editChartDrawingObject(props) : me.api.asc_addChartDrawingObject(props); + var range = props.getRange(), + isvalid = me.api.asc_checkDataRange(Asc.c_oAscSelectionDialogType.Chart, range, true, !props.getInColumns(), props.getType()); + if (isvalid == Asc.c_oAscError.ID.No) { + (ischartedit) ? me.api.asc_editChartDrawingObject(props) : me.api.asc_addChartDrawingObject(props); + } else { + Common.UI.warning({ + msg: (isvalid == Asc.c_oAscError.ID.StockChartError) ? me.errorStockChart : ((isvalid == Asc.c_oAscError.ID.MaxDataSeriesError) ? me.errorMaxRows : me.txtInvalidRange), + callback: function() { + _.defer(function(btn) { + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + }) + } + }); + } } } } @@ -1436,7 +1449,7 @@ define([ restoreHeight: 300, style: 'max-height: 300px;', store: me.getCollection('TableTemplates'), - itemTemplate: _.template('
    ') + itemTemplate: _.template('
    ') }); picker.on('item:click', function(picker, item, record) { @@ -2222,7 +2235,7 @@ define([ store: this.getApplication().getCollection('Common.Collections.TextArt'), parentMenu: this.toolbar.mnuInsertTextArt.menu, showLast: false, - itemTemplate: _.template('
    ') + itemTemplate: _.template('
    ') }); this.toolbar.mnuTextArtPicker.on('item:click', function(picker, item, record, e) { @@ -3055,7 +3068,10 @@ define([ txtSorting: 'Sorting', txtSortSelected: 'Sort selected', textLongOperation: 'Long operation', - warnLongOperation: 'The operation you are about to perform might take rather much time to complete.
    Are you sure you want to continue?' + warnLongOperation: 'The operation you are about to perform might take rather much time to complete.
    Are you sure you want to continue?', + txtInvalidRange: 'ERROR! Invalid cells range', + errorMaxRows: 'ERROR! The maximum number of data series per chart is 255.', + errorStockChart: 'Incorrect row order. To build a stock chart place the data on the sheet in the following order:
    opening price, max price, min price, closing price.' }, SSE.Controllers.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/view/AutoFilterDialog.js b/apps/spreadsheeteditor/main/app/view/AutoFilterDialog.js index c0c2fa909..e1500b78b 100644 --- a/apps/spreadsheeteditor/main/app/view/AutoFilterDialog.js +++ b/apps/spreadsheeteditor/main/app/view/AutoFilterDialog.js @@ -93,7 +93,7 @@ define([ this.handler = options.handler; this.type = options.type || 'number'; - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); Common.UI.Window.prototype.initialize.call(this, _options); }, @@ -342,7 +342,7 @@ define([ this.api = options.api; this.handler = options.handler; - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); Common.UI.Window.prototype.initialize.call(this, _options); }, @@ -516,7 +516,7 @@ define([ this.throughIndexes = []; this.filteredIndexes = []; - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); Common.UI.Window.prototype.initialize.call(this, _options); }, diff --git a/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js b/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js index dc36bcd89..b8a91cb4e 100644 --- a/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js +++ b/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js @@ -69,7 +69,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/spreadsheeteditor/main/app/view/FormulaDialog.js b/apps/spreadsheeteditor/main/app/view/FormulaDialog.js index 55dd6d9d8..a6bdf7a8a 100644 --- a/apps/spreadsheeteditor/main/app/view/FormulaDialog.js +++ b/apps/spreadsheeteditor/main/app/view/FormulaDialog.js @@ -92,7 +92,7 @@ define([ this.formulasGroups = options.formulasGroups; this.handler = options.handler; - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); Common.UI.Window.prototype.initialize.call(this, _options); }, diff --git a/apps/spreadsheeteditor/main/app/view/HyperlinkSettingsDialog.js b/apps/spreadsheeteditor/main/app/view/HyperlinkSettingsDialog.js index 0a9468a35..1a65109df 100644 --- a/apps/spreadsheeteditor/main/app/view/HyperlinkSettingsDialog.js +++ b/apps/spreadsheeteditor/main/app/view/HyperlinkSettingsDialog.js @@ -99,7 +99,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.api = this.options.api; Common.UI.Window.prototype.initialize.call(this, this.options); diff --git a/apps/spreadsheeteditor/main/app/view/SetValueDialog.js b/apps/spreadsheeteditor/main/app/view/SetValueDialog.js index 94aac612e..50fdfe928 100644 --- a/apps/spreadsheeteditor/main/app/view/SetValueDialog.js +++ b/apps/spreadsheeteditor/main/app/view/SetValueDialog.js @@ -67,7 +67,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.startvalue = this.options.startvalue; this.maxvalue = this.options.maxvalue; this.defaultUnit = this.options.defaultUnit; diff --git a/apps/spreadsheeteditor/main/app/view/Statusbar.js b/apps/spreadsheeteditor/main/app/view/Statusbar.js index c9a0223f4..4086b3e9a 100644 --- a/apps/spreadsheeteditor/main/app/view/Statusbar.js +++ b/apps/spreadsheeteditor/main/app/view/Statusbar.js @@ -68,7 +68,7 @@ define([ templateUserList: _.template(''), @@ -489,7 +489,7 @@ define([ _onAddUser: function(m, c, opts) { if (this.panelUsersList) { - this.panelUsersList.find('ul').append(_.template(this.tplUser, {user: m, scope: this})); + this.panelUsersList.find('ul').append(_.template(this.tplUser)({user: m, scope: this})); this.panelUsersList.scroller.update({minScrollbarLength : 40, alwaysVisibleY: true}); } }, @@ -706,7 +706,7 @@ define([ label: this.labelSheetName, btns: {ok: this.okButtonText, cancel: this.cancelButtonText} }); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, @@ -823,7 +823,7 @@ define([ label: options.ismove ? this.textMoveBefore : this.textCopyBefore, btns: {ok: this.okButtonText, cancel: this.cancelButtonText} }); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/spreadsheeteditor/main/app/view/TableOptionsDialog.js b/apps/spreadsheeteditor/main/app/view/TableOptionsDialog.js index c4dc0a4e4..023fd5bc3 100644 --- a/apps/spreadsheeteditor/main/app/view/TableOptionsDialog.js +++ b/apps/spreadsheeteditor/main/app/view/TableOptionsDialog.js @@ -72,7 +72,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.checkRangeType = Asc.c_oAscSelectionDialogType.FormatTable; this.selectionType = Asc.c_oAscSelectionType.RangeCells; diff --git a/apps/spreadsheeteditor/main/app_dev.js b/apps/spreadsheeteditor/main/app_dev.js index 3d8301bbb..1cc730a2d 100644 --- a/apps/spreadsheeteditor/main/app_dev.js +++ b/apps/spreadsheeteditor/main/app_dev.js @@ -54,8 +54,6 @@ require.config({ jmousewheel : '../vendor/perfect-scrollbar/src/jquery.mousewheel', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', api : 'api/documents/api', core : 'common/main/lib/core/application', notification : 'common/main/lib/core/NotificationCenter', @@ -121,8 +119,6 @@ require([ 'analytics', 'gateway', 'locale', - 'jsziputils', - 'jsrsasign', 'sockjs', 'underscore' ], function (Backbone, Bootstrap, Core) { diff --git a/apps/spreadsheeteditor/main/locale/de.json b/apps/spreadsheeteditor/main/locale/de.json index 87f7e97e0..62fc071b7 100644 --- a/apps/spreadsheeteditor/main/locale/de.json +++ b/apps/spreadsheeteditor/main/locale/de.json @@ -74,7 +74,6 @@ "Common.Views.DocumentAccessDialog.textTitle": "Freigabeeinstellungen", "Common.Views.Header.openNewTabText": "In neuer Registerkarte öffnen", "Common.Views.Header.textBack": "Zu Dokumenten übergehen", - "Common.Views.Header.txtHeaderDeveloper": "ENTWICKLERMODUS", "Common.Views.Header.txtRename": "Umbenennen", "Common.Views.ImageFromUrlDialog.cancelButtonText": "Abbrechen", "Common.Views.ImageFromUrlDialog.okButtonText": "OK", @@ -176,6 +175,23 @@ "SSE.Controllers.DocumentHolder.txtMatrixAlign": "Matrixausrichtung", "SSE.Controllers.DocumentHolder.txtNoChoices": "Es gibt keine Möglichkeit zum Füllung der Zelle.
    Nur die Textwerte aus der Spalte kann für den Ersatz gewählt werden. ", "SSE.Controllers.DocumentHolder.txtOverbar": "Linie über dem Text", + "SSE.Controllers.DocumentHolder.txtPaste": "Einfügen", + "SSE.Controllers.DocumentHolder.txtPasteBorders": "Formel ohne Rahmenlinien", + "SSE.Controllers.DocumentHolder.txtPasteColWidths": "Formel + Spaltenbreite", + "SSE.Controllers.DocumentHolder.txtPasteDestFormat": "Zielformatierung", + "SSE.Controllers.DocumentHolder.txtPasteFormat": "Nur Formatierung einfügen", + "SSE.Controllers.DocumentHolder.txtPasteFormulaNumFormat": "Formel + Zahlenformat", + "SSE.Controllers.DocumentHolder.txtPasteFormulas": "Nur Formel einfügen", + "SSE.Controllers.DocumentHolder.txtPasteKeepSourceFormat": "Formel + alle Formatierungen", + "SSE.Controllers.DocumentHolder.txtPasteLink": "Hyperlink einfügen", + "SSE.Controllers.DocumentHolder.txtPasteLinkPicture": "Verknüpfte Grafik", + "SSE.Controllers.DocumentHolder.txtPasteMerge": "Bedingte Formatierung beim Verbinden", + "SSE.Controllers.DocumentHolder.txtPastePicture": "Bild", + "SSE.Controllers.DocumentHolder.txtPasteSourceFormat": "Ursprüngliche Formatierung ", + "SSE.Controllers.DocumentHolder.txtPasteTranspose": "Vertauschen", + "SSE.Controllers.DocumentHolder.txtPasteValFormat": "Wert + alle Formatierung", + "SSE.Controllers.DocumentHolder.txtPasteValNumFormat": "Wert + Zahlenformat", + "SSE.Controllers.DocumentHolder.txtPasteValues": "Nur die Werte einfügen", "SSE.Controllers.DocumentHolder.txtRemFractionBar": "Bruchstrich entfernen", "SSE.Controllers.DocumentHolder.txtRemLimit": "Grenzwert entfernen\t", "SSE.Controllers.DocumentHolder.txtRemoveAccentChar": "Akzentzeichen entfernen\t", @@ -224,7 +240,7 @@ "SSE.Controllers.Main.downloadTextText": "Kalkulationstabelle wird heruntergeladen...", "SSE.Controllers.Main.downloadTitleText": "Herunterladen der Kalkulationstabelle", "SSE.Controllers.Main.errorAccessDeny": "Sie haben versucht die Änderungen im Dokument, zu dem Sie keine Berechtigungen haben, vorzunehemen.
    Wenden Sie sich an Ihren Serveradministrator.", - "SSE.Controllers.Main.errorArgsRange": "Die eingegebene Formel enthält einen Fehler.
    Falscher Bereich der Argumente wurde genutzt.", + "SSE.Controllers.Main.errorArgsRange": "Die eingegebene Formel enthält einen Fehler.
    Es wird falschen Argumentbereich genutzt.", "SSE.Controllers.Main.errorAutoFilterChange": "Der Vorgang ist nicht zulässig, denn es wurde versucht, Zellen in der Tabelle auf Ihrem Arbeitsblatt zu verschieben.", "SSE.Controllers.Main.errorAutoFilterChangeFormatTable": "Dieser Vorgang kann für die gewählten Zellen nicht ausgeführt werden, weil Sie ein Teil der Tabelle nicht verschieben können.
    Wählen Sie den anderen Datenbereich, so dass die ganze Tabelle verschoben wurde und versuchen Sie noch einmal.", "SSE.Controllers.Main.errorAutoFilterDataRange": "Der Vorgang kann für einen ausgewählten Zellbereich nicht ausgeführt werden.
    Wählen Sie einen einheitlichen Datenbereich, der sich deutlich von dem bestehenden unterscheidet und versuchen Sie es erneut.", @@ -254,7 +270,7 @@ "SSE.Controllers.Main.errorMoveRange": "Es ist unmöglich einen Teil der vereinigten Zelle zu ändern", "SSE.Controllers.Main.errorOpenWarning": "Die Länge einer der Formeln in der Datei hat
    die zugelassene Anzahl von Zeichen überschritten und sie wurde entfernt.", "SSE.Controllers.Main.errorOperandExpected": "Die Syntax der eingegeben Funktion ist nicht korrekt. Bitte überprüfen Sie, ob eine der Klammern - '(' oder ')' fehlt.", - "SSE.Controllers.Main.errorPasteMaxRange": "Der Bereich Kopieren und Einfügen stimmen nicht überein.
    Bitte wählen Sie einen Bereich der gleichen Größe oder klicken auf die erste Zelle der Zeile, um die kopierten Zellen einzufügen", + "SSE.Controllers.Main.errorPasteMaxRange": "Zeilen Kopieren und Einfügen stimmen nicht überein.
    Bitte wählen Sie einen Bereich der gleichen Größe oder klicken auf die erste Zelle der Zeile, um die kopierten Zellen einzufügen.", "SSE.Controllers.Main.errorPrintMaxPagesCount": "Leider kann man in der aktuellen Programmversion nicht mehr als 1500 Seiten gleichzeitig drucken.
    Diese Einschränkung wird in den kommenden Versionen entfernt.", "SSE.Controllers.Main.errorProcessSaveResult": "Speichern ist fehlgeschlagen", "SSE.Controllers.Main.errorServerVersion": "Editor-Version wurde aktualisiert. Die Seite wird neu geladen, um die Änderungen zu übernehmen.", @@ -916,28 +932,29 @@ "SSE.Views.DigitalFilterDialog.textUse1": "Nutzen Sie das Symbol ?, um ein einziges Zeichen darzustellen", "SSE.Views.DigitalFilterDialog.textUse2": "Nutzen Sie das Symbol *, um eine Reihe von Zeichen darzustellen", "SSE.Views.DigitalFilterDialog.txtTitle": "Benutzerdefinierter Filter", + "SSE.Views.DocumentHolder.advancedImgText": "Erweiterte Einstellungen des Bildes", "SSE.Views.DocumentHolder.advancedShapeText": "Erweiterte Einstellungen der Form", "SSE.Views.DocumentHolder.bottomCellText": "Unten ausrichten", "SSE.Views.DocumentHolder.centerCellText": "Zentriert ausrichten", "SSE.Views.DocumentHolder.chartText": "Erweiterte Einstellungen des Diagramms", - "SSE.Views.DocumentHolder.deleteColumnText": "Spalte löschen", - "SSE.Views.DocumentHolder.deleteRowText": "Zeile löschen", - "SSE.Views.DocumentHolder.deleteTableText": "Tabelle löschen", + "SSE.Views.DocumentHolder.deleteColumnText": "Spalte", + "SSE.Views.DocumentHolder.deleteRowText": "Zeile", + "SSE.Views.DocumentHolder.deleteTableText": "Tabelle", "SSE.Views.DocumentHolder.direct270Text": "Um 270° drehen", "SSE.Views.DocumentHolder.direct90Text": "Um 90° drehen ", "SSE.Views.DocumentHolder.directHText": "Horizontal", "SSE.Views.DocumentHolder.directionText": "Textausrichtung\t", "SSE.Views.DocumentHolder.editChartText": "Daten ändern", "SSE.Views.DocumentHolder.editHyperlinkText": "Hyperlink bearbeiten", - "SSE.Views.DocumentHolder.insertColumnLeftText": "Spalte links einfügen", - "SSE.Views.DocumentHolder.insertColumnRightText": "Spalte rechts einfügen", - "SSE.Views.DocumentHolder.insertRowAboveText": "Zeile oberhalb einfügen", - "SSE.Views.DocumentHolder.insertRowBelowText": "Zeile unterhalb einfügen", + "SSE.Views.DocumentHolder.insertColumnLeftText": "Spalte nach links", + "SSE.Views.DocumentHolder.insertColumnRightText": "Spalte nach rechts", + "SSE.Views.DocumentHolder.insertRowAboveText": "Zeile oberhalb", + "SSE.Views.DocumentHolder.insertRowBelowText": "Zeile unterhalb", "SSE.Views.DocumentHolder.removeHyperlinkText": "Hyperlink entfernen", - "SSE.Views.DocumentHolder.selectColumnText": "Ganze Spalte auswählen", - "SSE.Views.DocumentHolder.selectDataText": "Spaltendaten auswählen", - "SSE.Views.DocumentHolder.selectRowText": "Zeile auswählen", - "SSE.Views.DocumentHolder.selectTableText": "Tabelle auswählen", + "SSE.Views.DocumentHolder.selectColumnText": "Ganze Spalte", + "SSE.Views.DocumentHolder.selectDataText": "Spaltendaten", + "SSE.Views.DocumentHolder.selectRowText": "Zeile", + "SSE.Views.DocumentHolder.selectTableText": "Tabelle", "SSE.Views.DocumentHolder.textArrangeBack": "In den Hintergrund senden", "SSE.Views.DocumentHolder.textArrangeBackward": "Eine Ebene nach hinten", "SSE.Views.DocumentHolder.textArrangeForward": "Eine Ebene nach vorne", @@ -988,6 +1005,7 @@ "SSE.Views.DocumentHolder.txtShiftRight": "Zellen nach rechts verschieben", "SSE.Views.DocumentHolder.txtShiftUp": "Zellen nach oben verschieben", "SSE.Views.DocumentHolder.txtShow": "Anzeigen", + "SSE.Views.DocumentHolder.txtShowComment": "Kommentare anzeigen", "SSE.Views.DocumentHolder.txtSort": "Sortieren", "SSE.Views.DocumentHolder.txtSortCellColor": "Ausgewählte Zellenfarbe nach oben", "SSE.Views.DocumentHolder.txtSortFontColor": "Ausgewählte Schriftfarbe nach oben", @@ -1031,6 +1049,7 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.strCoAuthModeDescStrict": "Sie müssen die Änderungen annehmen, bevor Sie diese sehen können", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFast": "Schnell", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFontRender": "Hinting der Schriftarten", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Immer auf dem Server speichern (ansonsten auf dem Server beim Schließen des Dokuments speichern)", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocale": "Formelsprache ", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocaleEx": "Beispiel: SUM; MIN; MAX; COUNT", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strLiveComment": "Live-Kommentare einschalten", @@ -1046,6 +1065,7 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoRecover": "Autowiederherstellen", "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoSave": "Automatisch speichern", "SSE.Views.FileMenuPanels.MainSettingsGeneral.textDisabled": "Deaktiviert", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.textForceSave": "Auf dem Server speichern", "SSE.Views.FileMenuPanels.MainSettingsGeneral.textMinute": "Jede Minute", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtCm": "Zentimeter", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtDe": "Deutsch", @@ -1086,9 +1106,9 @@ "SSE.Views.FormatSettingsDialog.txtScientific": "Wissenschaftlich", "SSE.Views.FormatSettingsDialog.txtText": "Text", "SSE.Views.FormatSettingsDialog.txtTime": "Zeit", - "SSE.Views.FormatSettingsDialog.txtUpto1": "Bis zu einer Ziffer", - "SSE.Views.FormatSettingsDialog.txtUpto2": "Bis zu zwei Ziffern", - "SSE.Views.FormatSettingsDialog.txtUpto3": "Dreistellig", + "SSE.Views.FormatSettingsDialog.txtUpto1": "Bis zu einer Ziffer(1/3)", + "SSE.Views.FormatSettingsDialog.txtUpto2": "Zweistellig (12/25)", + "SSE.Views.FormatSettingsDialog.txtUpto3": "Dreistellig (131/135)", "SSE.Views.FormulaDialog.cancelButtonText": "Abbrechen", "SSE.Views.FormulaDialog.okButtonText": "OK", "SSE.Views.FormulaDialog.sCategoryAll": "Alle", @@ -1173,6 +1193,7 @@ "SSE.Views.LeftMenu.tipPlugins": "Plugins", "SSE.Views.LeftMenu.tipSearch": "Suchen", "SSE.Views.LeftMenu.tipSupport": "Feedback und Support", + "SSE.Views.LeftMenu.txtDeveloper": "ENTWICKLERMODUS", "SSE.Views.MainSettingsPrint.okButtonText": "Speichern", "SSE.Views.MainSettingsPrint.strBottom": "Unten", "SSE.Views.MainSettingsPrint.strLandscape": "Querformat", diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index 2d12a638f..7f399ded7 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -74,7 +74,6 @@ "Common.Views.DocumentAccessDialog.textTitle": "Sharing Settings", "Common.Views.Header.openNewTabText": "Open in New Tab", "Common.Views.Header.textBack": "Go to Documents", - "del_Common.Views.Header.txtHeaderDeveloper": "DEVELOPER MODE", "Common.Views.Header.txtRename": "Rename", "Common.Views.ImageFromUrlDialog.cancelButtonText": "Cancel", "Common.Views.ImageFromUrlDialog.okButtonText": "OK", @@ -176,6 +175,23 @@ "SSE.Controllers.DocumentHolder.txtMatrixAlign": "Matrix alignment", "SSE.Controllers.DocumentHolder.txtNoChoices": "There are no choices for filling the cell.
    Only text values from the column can be selected for replacement.", "SSE.Controllers.DocumentHolder.txtOverbar": "Bar over text", + "SSE.Controllers.DocumentHolder.txtPaste": "Paste", + "SSE.Controllers.DocumentHolder.txtPasteBorders": "Formula without borders", + "SSE.Controllers.DocumentHolder.txtPasteColWidths": "Formula + column width", + "SSE.Controllers.DocumentHolder.txtPasteDestFormat": "Destination formatting", + "SSE.Controllers.DocumentHolder.txtPasteFormat": "Paste only formatting", + "SSE.Controllers.DocumentHolder.txtPasteFormulaNumFormat": "Formula + number format", + "SSE.Controllers.DocumentHolder.txtPasteFormulas": "Paste only formula", + "SSE.Controllers.DocumentHolder.txtPasteKeepSourceFormat": "Formula + all formatting", + "SSE.Controllers.DocumentHolder.txtPasteLink": "Paste link", + "SSE.Controllers.DocumentHolder.txtPasteLinkPicture": "Linked picture", + "SSE.Controllers.DocumentHolder.txtPasteMerge": "Merge conditional formatting", + "SSE.Controllers.DocumentHolder.txtPastePicture": "Picture", + "SSE.Controllers.DocumentHolder.txtPasteSourceFormat": "Source formatting", + "SSE.Controllers.DocumentHolder.txtPasteTranspose": "Transpose", + "SSE.Controllers.DocumentHolder.txtPasteValFormat": "Value + all formatting", + "SSE.Controllers.DocumentHolder.txtPasteValNumFormat": "Value + number format", + "SSE.Controllers.DocumentHolder.txtPasteValues": "Paste only value", "SSE.Controllers.DocumentHolder.txtRemFractionBar": "Remove fraction bar", "SSE.Controllers.DocumentHolder.txtRemLimit": "Remove limit", "SSE.Controllers.DocumentHolder.txtRemoveAccentChar": "Remove accent character", @@ -198,23 +214,6 @@ "SSE.Controllers.DocumentHolder.txtTop": "Top", "SSE.Controllers.DocumentHolder.txtUnderbar": "Bar under text", "SSE.Controllers.DocumentHolder.txtWidth": "Width", - "SSE.Controllers.DocumentHolder.txtPaste": "Paste", - "SSE.Controllers.DocumentHolder.txtPasteFormulas": "Paste only formula", - "SSE.Controllers.DocumentHolder.txtPasteFormulaNumFormat": "Formula + number format", - "SSE.Controllers.DocumentHolder.txtPasteKeepSourceFormat": "Formula + all formatting", - "SSE.Controllers.DocumentHolder.txtPasteBorders": "Formula without borders", - "SSE.Controllers.DocumentHolder.txtPasteColWidths": "Formula + column width", - "SSE.Controllers.DocumentHolder.txtPasteMerge": "Merge conditional formatting", - "SSE.Controllers.DocumentHolder.txtPasteTranspose": "Transpose", - "SSE.Controllers.DocumentHolder.txtPasteValues": "Paste only value", - "SSE.Controllers.DocumentHolder.txtPasteValNumFormat": "Value + number format", - "SSE.Controllers.DocumentHolder.txtPasteValFormat": "Value + all formatting", - "SSE.Controllers.DocumentHolder.txtPasteFormat": "Paste only formatting", - "SSE.Controllers.DocumentHolder.txtPasteLink": "Paste link", - "SSE.Controllers.DocumentHolder.txtPastePicture": "Picture", - "SSE.Controllers.DocumentHolder.txtPasteLinkPicture": "Linked picture", - "SSE.Controllers.DocumentHolder.txtPasteSourceFormat": "Source formatting", - "SSE.Controllers.DocumentHolder.txtPasteDestFormat": "Destination formatting", "SSE.Controllers.LeftMenu.newDocumentTitle": "Unnamed spreadsheet", "SSE.Controllers.LeftMenu.textByColumns": "By columns", "SSE.Controllers.LeftMenu.textByRows": "By rows", @@ -241,7 +240,7 @@ "SSE.Controllers.Main.downloadTextText": "Downloading spreadsheet...", "SSE.Controllers.Main.downloadTitleText": "Downloading Spreadsheet", "SSE.Controllers.Main.errorAccessDeny": "You are trying to perform an action you do not have rights for.
    Please contact your Document Server administrator.", - "SSE.Controllers.Main.errorArgsRange": "An error in the entered formula.
    Incorrect arguments range is used.", + "SSE.Controllers.Main.errorArgsRange": "An error in the entered formula.
    Incorrect argument range is used.", "SSE.Controllers.Main.errorAutoFilterChange": "The operation is not allowed, as it is attempting to shift cells in a table on your worksheet.", "SSE.Controllers.Main.errorAutoFilterChangeFormatTable": "The operation could not be done for the selected cells as you cannot move a part of the table.
    Select another data range so that the whole table was shifted and try again.", "SSE.Controllers.Main.errorAutoFilterDataRange": "The operation could not be done for the selected range of cells.
    Select a uniform data range different from the existing one and try again.", @@ -271,9 +270,10 @@ "SSE.Controllers.Main.errorMoveRange": "Cannot change part of a merged cell", "SSE.Controllers.Main.errorOpenWarning": "The length of one of the formulas in the file exceeded
    the allowed number of characters and it was removed.", "SSE.Controllers.Main.errorOperandExpected": "The entered function syntax is not correct. Please check if you are missing one of the parentheses - '(' or ')'.", - "SSE.Controllers.Main.errorPasteMaxRange": "The copy and paste area does not match.
    Please select an area with the same size or click the first cell in a row to paste the copied cells.", + "SSE.Controllers.Main.errorPasteMaxRange": "The copy and paste area do not match.
    Please select an area with the same size or click the first cell in a row to paste the copied cells.", "SSE.Controllers.Main.errorPrintMaxPagesCount": "Unfortunately, it is not possible to print more than 1500 pages at once in the current program version.
    This restriction will be removed in the upcoming releases.", "SSE.Controllers.Main.errorProcessSaveResult": "Saving failed", + "SSE.Controllers.Main.errorServerVersion": "The editor version has been updated. The page will be reloaded to apply the changes.", "SSE.Controllers.Main.errorSessionAbsolute": "The document editing session has expired. Please reload the page.", "SSE.Controllers.Main.errorSessionIdle": "The document has not been edited for quite a long time. Please reload the page.", "SSE.Controllers.Main.errorSessionToken": "The connection to the server has been interrupted. Please reload the page.", @@ -328,6 +328,7 @@ "SSE.Controllers.Main.textYes": "Yes", "SSE.Controllers.Main.titleLicenseExp": "License expired", "SSE.Controllers.Main.titleRecalcFormulas": "Calculating...", + "SSE.Controllers.Main.titleServerVersion": "Editor updated", "SSE.Controllers.Main.txtArt": "Your text here", "SSE.Controllers.Main.txtBasicShapes": "Basic Shapes", "SSE.Controllers.Main.txtButtons": "Buttons", @@ -355,8 +356,6 @@ "SSE.Controllers.Main.warnLicenseExp": "Your license has expired.
    Please update your license and refresh the page.", "SSE.Controllers.Main.warnNoLicense": "You are using an open source version of ONLYOFFICE. The version has limitations for concurrent connections to the document server (20 connections at a time).
    If you need more please consider purchasing a commercial license.", "SSE.Controllers.Main.warnProcessRightsChange": "You have been denied the right to edit the file.", - "SSE.Controllers.Main.titleServerVersion": "Editor updated", - "SSE.Controllers.Main.errorServerVersion": "The editor version has been updated. The page will be reloaded to apply the changes.", "SSE.Controllers.Print.strAllSheets": "All Sheets", "SSE.Controllers.Print.textWarning": "Warning", "SSE.Controllers.Print.warnCheckMargings": "Margins are incorrect", @@ -366,6 +365,8 @@ "SSE.Controllers.Statusbar.warnDeleteSheet": "The worksheet might contain data. Are you sure you want to proceed?", "SSE.Controllers.Statusbar.zoomText": "Zoom {0}%", "SSE.Controllers.Toolbar.confirmAddFontName": "The font you are going to save is not available on the current device.
    The text style will be displayed using one of the system fonts, the saved font will be used when it is available.
    Do you want to continue?", + "SSE.Controllers.Toolbar.errorMaxRows": "ERROR! The maximum number of data series per chart is 255", + "SSE.Controllers.Toolbar.errorStockChart": "Incorrect row order. To build a stock chart place the data on the sheet in the following order:
    opening price, max price, min price, closing price.", "SSE.Controllers.Toolbar.textAccent": "Accents", "SSE.Controllers.Toolbar.textBracket": "Brackets", "SSE.Controllers.Toolbar.textCancel": "Cancel", @@ -373,6 +374,7 @@ "SSE.Controllers.Toolbar.textFraction": "Fractions", "SSE.Controllers.Toolbar.textFunction": "Functions", "SSE.Controllers.Toolbar.textIntegral": "Integrals", + "SSE.Controllers.Toolbar.txtInvalidRange": "ERROR! Invalid cells range", "SSE.Controllers.Toolbar.textLargeOperator": "Large Operators", "SSE.Controllers.Toolbar.textLimitAndLog": "Limits And Logarithms", "SSE.Controllers.Toolbar.textMatrix": "Matrices", @@ -935,8 +937,8 @@ "SSE.Views.DigitalFilterDialog.textUse1": "Use ? to present any single character", "SSE.Views.DigitalFilterDialog.textUse2": "Use * to present any series of character", "SSE.Views.DigitalFilterDialog.txtTitle": "Custom Filter", - "SSE.Views.DocumentHolder.advancedShapeText": "Shape Advanced Settings", "SSE.Views.DocumentHolder.advancedImgText": "Image Advanced Settings", + "SSE.Views.DocumentHolder.advancedShapeText": "Shape Advanced Settings", "SSE.Views.DocumentHolder.bottomCellText": "Align Bottom", "SSE.Views.DocumentHolder.centerCellText": "Align Center", "SSE.Views.DocumentHolder.chartText": "Chart Advanced Settings", @@ -989,7 +991,6 @@ "SSE.Views.DocumentHolder.txtDelete": "Delete", "SSE.Views.DocumentHolder.txtDescending": "Descending", "SSE.Views.DocumentHolder.txtEditComment": "Edit Comment", - "SSE.Views.DocumentHolder.txtShowComment": "Show Comment", "SSE.Views.DocumentHolder.txtFilter": "Filter", "SSE.Views.DocumentHolder.txtFilterCellColor": "Filter by cell's color", "SSE.Views.DocumentHolder.txtFilterFontColor": "Filter by font color", @@ -1009,6 +1010,7 @@ "SSE.Views.DocumentHolder.txtShiftRight": "Shift cells right", "SSE.Views.DocumentHolder.txtShiftUp": "Shift cells up", "SSE.Views.DocumentHolder.txtShow": "Show", + "SSE.Views.DocumentHolder.txtShowComment": "Show Comment", "SSE.Views.DocumentHolder.txtSort": "Sort", "SSE.Views.DocumentHolder.txtSortCellColor": "Selected Cell Color on top", "SSE.Views.DocumentHolder.txtSortFontColor": "Selected Font Color on top", @@ -1052,6 +1054,7 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.strCoAuthModeDescStrict": "You will need to accept changes before you can see them", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFast": "Fast", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFontRender": "Font Hinting", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Always save to server (otherwise save to server on document close)", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocale": "Formula Language", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocaleEx": "Example: SUM; MIN; MAX; COUNT", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strLiveComment": "Turn on display of the comments", @@ -1067,6 +1070,7 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoRecover": "Autorecover", "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoSave": "Autosave", "SSE.Views.FileMenuPanels.MainSettingsGeneral.textDisabled": "Disabled", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.textForceSave": "Save to Server", "SSE.Views.FileMenuPanels.MainSettingsGeneral.textMinute": "Every Minute", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtCm": "Centimeter", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtDe": "Deutsch", @@ -1075,12 +1079,10 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtLiveComment": "Commenting Display", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtMac": "as OS X", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtNative": "Native", - "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtPt": "Point", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtPl": "Polish", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtPt": "Point", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtRu": "Russian", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtWin": "as Windows", - "SSE.Views.FileMenuPanels.MainSettingsGeneral.textForceSave": "Save to Server", - "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Always save to server (otherwise save to server on document close)", "SSE.Views.FileMenuPanels.Settings.txtGeneral": "General", "SSE.Views.FileMenuPanels.Settings.txtPageSettings": "Page Settings", "SSE.Views.FormatSettingsDialog.textCancel": "Cancel", @@ -1467,6 +1469,7 @@ "SSE.Views.TableSettings.textBanded": "Banded", "SSE.Views.TableSettings.textCancel": "Cancel", "SSE.Views.TableSettings.textColumns": "Columns", + "SSE.Views.TableSettings.textConvertRange": "Convert to range", "SSE.Views.TableSettings.textEdit": "Rows & Columns", "SSE.Views.TableSettings.textEmptyTemplate": "No templates", "SSE.Views.TableSettings.textExistName": "ERROR! A range with such a name already exists", @@ -1484,7 +1487,6 @@ "SSE.Views.TableSettings.textTableName": "Table Name", "SSE.Views.TableSettings.textTemplate": "Select From Template", "SSE.Views.TableSettings.textTotal": "Total", - "SSE.Views.TableSettings.textConvertRange": "Convert to range", "SSE.Views.TableSettings.textLongOperation": "Long operation", "SSE.Views.TableSettings.warnLongOperation": "The operation you are about to perform might take rather much time to complete.
    Are you sure you want to continue?", "SSE.Views.TableSettingsAdvanced.cancelButtonText": "Cancel", @@ -1565,6 +1567,7 @@ "SSE.Views.Toolbar.textDiagUpBorder": "Diagonal Up Border", "SSE.Views.Toolbar.textEntireCol": "Entire Column", "SSE.Views.Toolbar.textEntireRow": "Entire Row", + "SSE.Views.Toolbar.textFreezePanes": "Freeze Panes", "SSE.Views.Toolbar.textHideFBar": "Hide Formula Bar", "SSE.Views.Toolbar.textHideGridlines": "Hide Gridlines", "SSE.Views.Toolbar.textHideHeadings": "Hide Headings", diff --git a/apps/spreadsheeteditor/main/locale/fr.json b/apps/spreadsheeteditor/main/locale/fr.json index 0f912132e..1613f08bc 100644 --- a/apps/spreadsheeteditor/main/locale/fr.json +++ b/apps/spreadsheeteditor/main/locale/fr.json @@ -74,7 +74,6 @@ "Common.Views.DocumentAccessDialog.textTitle": "Paramètres de partage", "Common.Views.Header.openNewTabText": "Ouvrir dans un nouvel onglet", "Common.Views.Header.textBack": "Aller aux Documents", - "Common.Views.Header.txtHeaderDeveloper": "MODE DEVELOPPEUR", "Common.Views.Header.txtRename": "Renommer", "Common.Views.ImageFromUrlDialog.cancelButtonText": "Annuler", "Common.Views.ImageFromUrlDialog.okButtonText": "OK", @@ -176,6 +175,23 @@ "SSE.Controllers.DocumentHolder.txtMatrixAlign": "Alignement de la matrice", "SSE.Controllers.DocumentHolder.txtNoChoices": "Il n’y a pas de choix pour le remplissage de la cellule.
    Uniquement les valeurs de texte de la colonne peuvent être sélectionnées pour le remplacement.", "SSE.Controllers.DocumentHolder.txtOverbar": "Barre au-dessus d'un texte", + "SSE.Controllers.DocumentHolder.txtPaste": "Coller", + "SSE.Controllers.DocumentHolder.txtPasteBorders": "Formule sans bordures", + "SSE.Controllers.DocumentHolder.txtPasteColWidths": "Formule + largeur de colonne", + "SSE.Controllers.DocumentHolder.txtPasteDestFormat": "Mise en forme de destination", + "SSE.Controllers.DocumentHolder.txtPasteFormat": "Coller uniquement la mise en forme", + "SSE.Controllers.DocumentHolder.txtPasteFormulaNumFormat": "Formule + format de nombre", + "SSE.Controllers.DocumentHolder.txtPasteFormulas": "Coller uniquement la formule", + "SSE.Controllers.DocumentHolder.txtPasteKeepSourceFormat": "Formule + mise en forme", + "SSE.Controllers.DocumentHolder.txtPasteLink": "Coller avec liaison", + "SSE.Controllers.DocumentHolder.txtPasteLinkPicture": "Image liée", + "SSE.Controllers.DocumentHolder.txtPasteMerge": "Fusionner la mise en forme conditionnelle", + "SSE.Controllers.DocumentHolder.txtPastePicture": "Image", + "SSE.Controllers.DocumentHolder.txtPasteSourceFormat": "Mise en forme source", + "SSE.Controllers.DocumentHolder.txtPasteTranspose": "Transposer", + "SSE.Controllers.DocumentHolder.txtPasteValFormat": "Valeur + toute la mise en forme", + "SSE.Controllers.DocumentHolder.txtPasteValNumFormat": "Valeur + format de nombre", + "SSE.Controllers.DocumentHolder.txtPasteValues": "Coller uniquement la valeur", "SSE.Controllers.DocumentHolder.txtRemFractionBar": "Supprimer la barre de fraction", "SSE.Controllers.DocumentHolder.txtRemLimit": "Supprimer la limite", "SSE.Controllers.DocumentHolder.txtRemoveAccentChar": "Supprimer le caractère d'accent", @@ -224,18 +240,18 @@ "SSE.Controllers.Main.downloadTextText": "Téléchargement de la feuille de calcul en cours...", "SSE.Controllers.Main.downloadTitleText": "Téléchargement de la feuille de calcul", "SSE.Controllers.Main.errorAccessDeny": "Vous tentez d'exéсuter une action pour laquelle vous ne disposez pas des droits.
    Veuillez contacter l'administrateur de Document Server.", - "SSE.Controllers.Main.errorArgsRange": "Une erreur dans la formule entrée.
    Argument de plage utilisé est incorrect.", + "SSE.Controllers.Main.errorArgsRange": "Une erreur dans la formule entrée.
    La plage des arguments utilisée est incorrecte.", "SSE.Controllers.Main.errorAutoFilterChange": "L'opération n'est pas autorisée, car elle tente de déplacer les cellules d'un tableau de votre feuille de calcul.", - "SSE.Controllers.Main.errorAutoFilterChangeFormatTable": "Opération impossible sur les cellules sélectionnées car vous ne pouvez pas déplacer une partie du tableau.
    Sélectionnez une autre plage de données afin que tout le tableau soit déplacé et essayez à nouveau.", - "SSE.Controllers.Main.errorAutoFilterDataRange": "L'opération n'a pu être effectuée pour la plage de cellules spécifiée.
    Sélectionnez la plage de données différentes à partir de celui existant et essayez à nouveau.\n", + "SSE.Controllers.Main.errorAutoFilterChangeFormatTable": "Impossible de réaliser l'opération sur les cellules sélectionnées car vous ne pouvez pas déplacer une partie du tableau.
    Sélectionnez une autre plage de données afin que tout le tableau soit déplacé et essayez à nouveau.", + "SSE.Controllers.Main.errorAutoFilterDataRange": "Impossible de réaliser l'opération sur la plage de cellules spécifiée.
    Sélectionnez la plage de données différente de la plage existante et essayez à nouveau.\n", "SSE.Controllers.Main.errorAutoFilterHiddenRange": "L'opération ne peut pas être effectuée car la zone contient des cellules filtrées.
    Veuillez afficher des éléments filtrés et réessayez.", "SSE.Controllers.Main.errorBadImageUrl": "L'URL d'image est incorrecte", "SSE.Controllers.Main.errorCoAuthoringDisconnect": "Connexion au serveur perdue. Le document ne peut être modifié en ce moment.", - "SSE.Controllers.Main.errorConnectToServer": "Le document n'a pas pu être enregistré. Veuillez vérifier les paramètres de connexion ou contactez votre administrateur.
    Lorsque vous cliquez sur le bouton 'OK', vous serez invité à télécharger le document.

    Trouvez plus d'informations sur la connexion Document Serverhere", + "SSE.Controllers.Main.errorConnectToServer": "Le document n'a pas pu être enregistré. Veuillez vérifier les paramètres de connexion ou contactez votre administrateur.
    Lorsque vous cliquez sur le bouton 'OK', vous serez invité à télécharger le document.

    Trouvez plus d'informations sur la connexion de Document Serverici", "SSE.Controllers.Main.errorCopyMultiselectArea": "Impossible d'exécuter cette commande sur des sélections multiples.
    Sélectionnez une seule plage et essayez à nouveau.", "SSE.Controllers.Main.errorCountArg": "Une erreur dans la formule entrée.
    Nombre d'arguments utilisé est incorrect.", "SSE.Controllers.Main.errorCountArgExceed": "Une erreur dans la formule entrée.
    Nombre d'arguments est dépassé.", - "SSE.Controllers.Main.errorCreateDefName": "Actuellement des plages nommées existantes ne peuvent pas être modifiées et les nouvelles ne peuvent pas être
    créées car certaines d'entre eux sont en cours de modification.", + "SSE.Controllers.Main.errorCreateDefName": "Actuellement, des plages nommées existantes ne peuvent pas être modifiées et les nouvelles ne peuvent pas être créées,
    car certaines d'entre eux sont en cours de modification.", "SSE.Controllers.Main.errorDatabaseConnection": "Erreur externe.
    Erreur de connexion à la base de données. Si l'erreur persiste veillez contactez l'assistance technique.", "SSE.Controllers.Main.errorDataRange": "Plage de données incorrecte.", "SSE.Controllers.Main.errorDefaultMessage": "Code d'erreur: %1", @@ -252,9 +268,9 @@ "SSE.Controllers.Main.errorLockedAll": "L'opération ne peut pas être faite car la feuille a été verrouillée par un autre utilisateur.", "SSE.Controllers.Main.errorLockedWorksheetRename": "La feuille ne peut pas être renommée pour l'instant puisque elle est renommée par un autre utilisateur", "SSE.Controllers.Main.errorMoveRange": "Impossible de modifier une partie d'une cellule fusionnée", - "SSE.Controllers.Main.errorOpenWarning": "La longueur de l'une des formules dans le fichier dépassé le nombre autorisé de caractères et il a été retiré.", + "SSE.Controllers.Main.errorOpenWarning": "La longueur de l'une des formules dans le fichier a dépassé
    le nombre de caractères autorisé, et la formule a été supprimée.", "SSE.Controllers.Main.errorOperandExpected": "La syntaxe de la saisie est incorrecte. Veuillez vérifier si l'une des parenthèses - '(' ou ')' est manquante.", - "SSE.Controllers.Main.errorPasteMaxRange": "La zone de copie ne correspond pas à la zone de collage.
    Pour coller les cellules copiées, veuillez sélectionner une zone avec la même taille ou cliquer sur la première cellule d'une ligne.", + "SSE.Controllers.Main.errorPasteMaxRange": "La zone de copie ne correspond pas à la zone de collage.
    Sélectionnez une zone avec la même taille ou cliquez sur la première cellule d'une ligne pour coller les cellules sélectionnées.", "SSE.Controllers.Main.errorPrintMaxPagesCount": "Malheureusement, il n’est pas possible d’imprimer plus de 1500 pages à la fois en utilisant la version actuelle du programme.
    Cette restriction sera supprimée dans la version future.", "SSE.Controllers.Main.errorProcessSaveResult": "Échec de l'enregistrement", "SSE.Controllers.Main.errorServerVersion": "La version de l'éditeur a été mise à jour. La page sera rechargée pour appliquer les modifications.", @@ -916,28 +932,29 @@ "SSE.Views.DigitalFilterDialog.textUse1": "Utilisez ? pour présenter un caractère unique", "SSE.Views.DigitalFilterDialog.textUse2": "Utilisez * pour présenter une série de caractères", "SSE.Views.DigitalFilterDialog.txtTitle": "Filtre personnalisé", + "SSE.Views.DocumentHolder.advancedImgText": "Paramètres avancés de l'image", "SSE.Views.DocumentHolder.advancedShapeText": "Paramètres avancés de la forme", "SSE.Views.DocumentHolder.bottomCellText": "Aligner en bas", "SSE.Views.DocumentHolder.centerCellText": "Aligner au centre", "SSE.Views.DocumentHolder.chartText": "Paramètres du graphique avancés", - "SSE.Views.DocumentHolder.deleteColumnText": "Supprimer la colonne", - "SSE.Views.DocumentHolder.deleteRowText": "Supprimer la ligne", - "SSE.Views.DocumentHolder.deleteTableText": "Supprimer le tableau", + "SSE.Views.DocumentHolder.deleteColumnText": "Colonne", + "SSE.Views.DocumentHolder.deleteRowText": "Ligne", + "SSE.Views.DocumentHolder.deleteTableText": "Tableau", "SSE.Views.DocumentHolder.direct270Text": "Rotation à 270 °", "SSE.Views.DocumentHolder.direct90Text": "Rotation à 90 °", "SSE.Views.DocumentHolder.directHText": "Horizontal", "SSE.Views.DocumentHolder.directionText": "Orientation du texte", "SSE.Views.DocumentHolder.editChartText": "Modifier les données", "SSE.Views.DocumentHolder.editHyperlinkText": "Modifier le lien hypertexte", - "SSE.Views.DocumentHolder.insertColumnLeftText": "Insérer une colonne à gauche", - "SSE.Views.DocumentHolder.insertColumnRightText": "Insérer une colonne à droite", - "SSE.Views.DocumentHolder.insertRowAboveText": "Insérer une ligne au-dessus", - "SSE.Views.DocumentHolder.insertRowBelowText": "Insérer une ligne en dessous", + "SSE.Views.DocumentHolder.insertColumnLeftText": "Colonne à gauche", + "SSE.Views.DocumentHolder.insertColumnRightText": "Colonne à droite", + "SSE.Views.DocumentHolder.insertRowAboveText": "Ligne au-dessus", + "SSE.Views.DocumentHolder.insertRowBelowText": "Ligne en dessous", "SSE.Views.DocumentHolder.removeHyperlinkText": "Supprimer le lien hypertexte", - "SSE.Views.DocumentHolder.selectColumnText": "Sélectionner la colonne entière", - "SSE.Views.DocumentHolder.selectDataText": "Sélectionner les données de la colonne", - "SSE.Views.DocumentHolder.selectRowText": "Sélectionner la ligne", - "SSE.Views.DocumentHolder.selectTableText": "Sélectionner le tableau", + "SSE.Views.DocumentHolder.selectColumnText": "Colonne entière", + "SSE.Views.DocumentHolder.selectDataText": "Données de la colonne", + "SSE.Views.DocumentHolder.selectRowText": "Ligne", + "SSE.Views.DocumentHolder.selectTableText": "Tableau", "SSE.Views.DocumentHolder.textArrangeBack": "Mettre en arrière-plan", "SSE.Views.DocumentHolder.textArrangeBackward": "Déplacer vers l'arrière", "SSE.Views.DocumentHolder.textArrangeForward": "Avancer", @@ -988,6 +1005,7 @@ "SSE.Views.DocumentHolder.txtShiftRight": "Décaler les cellules vers la droite", "SSE.Views.DocumentHolder.txtShiftUp": "Décaler les cellules vers le haut", "SSE.Views.DocumentHolder.txtShow": "Afficher", + "SSE.Views.DocumentHolder.txtShowComment": "Afficher le commentaire", "SSE.Views.DocumentHolder.txtSort": "Trier", "SSE.Views.DocumentHolder.txtSortCellColor": "Couleur sélectionnée de cellules sur le dessus", "SSE.Views.DocumentHolder.txtSortFontColor": "Couleur sélectionné de la police sur le dessus", @@ -1031,6 +1049,7 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.strCoAuthModeDescStrict": "Avant de pouvoir afficher les modifications, vous avez besoin de les accépter ", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFast": "Rapide", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFontRender": "Hinting de la police", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Toujours enregistrer sur le serveur ( sinon enregistrer sur le serveur lors de la fermeture du document )", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocale": "La formule de langue", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocaleEx": "Example: SUM; MIN; MAX; COUNT", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strLiveComment": "Activer l'affichage des commentaires", @@ -1046,6 +1065,7 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoRecover": "Récupération automatique", "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoSave": "Enregistrement automatique", "SSE.Views.FileMenuPanels.MainSettingsGeneral.textDisabled": "Désactivé", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.textForceSave": "Enregistrer sur le serveur", "SSE.Views.FileMenuPanels.MainSettingsGeneral.textMinute": "Chaque minute", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtCm": "Centimètre", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtDe": "Deutsch", @@ -1173,6 +1193,7 @@ "SSE.Views.LeftMenu.tipPlugins": "Plug-ins", "SSE.Views.LeftMenu.tipSearch": "Rechercher", "SSE.Views.LeftMenu.tipSupport": "Commentaires & assistance", + "SSE.Views.LeftMenu.txtDeveloper": "MODE DEVELOPPEUR", "SSE.Views.MainSettingsPrint.okButtonText": "Enregistrer", "SSE.Views.MainSettingsPrint.strBottom": "En bas", "SSE.Views.MainSettingsPrint.strLandscape": "Paysage", @@ -1193,7 +1214,7 @@ "SSE.Views.MainSettingsPrint.textPrintHeadings": "Imprimer les titres de lignes et de colonnes ", "SSE.Views.MainSettingsPrint.textSettings": "Paramètres pour", "SSE.Views.NamedRangeEditDlg.cancelButtonText": "Annuler", - "SSE.Views.NamedRangeEditDlg.errorCreateDefName": "Actuellement des plages nommées existantes ne peuvent pas être modifiées et les nouvelles ne peuvent pas être
    créées car certaines d'entre eux sont en cours de modification.", + "SSE.Views.NamedRangeEditDlg.errorCreateDefName": "Actuellement, des plages nommées existantes ne peuvent pas être modifiées et les nouvelles ne peuvent pas être créées,
    car certaines d'entre eux sont en cours de modification.", "SSE.Views.NamedRangeEditDlg.namePlaceholder": "Nom défini", "SSE.Views.NamedRangeEditDlg.notcriticalErrorTitle": "Avertissement", "SSE.Views.NamedRangeEditDlg.okButtonText": "Ok", @@ -1248,14 +1269,14 @@ "SSE.Views.ParagraphSettingsAdvanced.noTabs": "Les onglets spécifiés s'affichent dans ce champ", "SSE.Views.ParagraphSettingsAdvanced.okButtonText": "OK", "SSE.Views.ParagraphSettingsAdvanced.strAllCaps": "Majuscules", - "SSE.Views.ParagraphSettingsAdvanced.strDoubleStrike": "Double biffés", + "SSE.Views.ParagraphSettingsAdvanced.strDoubleStrike": "Barré double", "SSE.Views.ParagraphSettingsAdvanced.strIndentsFirstLine": "Première ligne", "SSE.Views.ParagraphSettingsAdvanced.strIndentsLeftText": "A gauche", "SSE.Views.ParagraphSettingsAdvanced.strIndentsRightText": "A droite", "SSE.Views.ParagraphSettingsAdvanced.strParagraphFont": "Police", "SSE.Views.ParagraphSettingsAdvanced.strParagraphIndents": "Retraits et emplacement", "SSE.Views.ParagraphSettingsAdvanced.strSmallCaps": "Petites majuscules", - "SSE.Views.ParagraphSettingsAdvanced.strStrike": "Biffés", + "SSE.Views.ParagraphSettingsAdvanced.strStrike": "Barré", "SSE.Views.ParagraphSettingsAdvanced.strSubscript": "Indice", "SSE.Views.ParagraphSettingsAdvanced.strSuperscript": "Exposant", "SSE.Views.ParagraphSettingsAdvanced.strTabs": "Tabulation", @@ -1419,7 +1440,7 @@ "SSE.Views.Statusbar.tipZoomOut": "Zoom arrière", "SSE.Views.Statusbar.txAccessRights": "Changer les droits d'accès", "SSE.Views.Statusbar.zoomText": "Zoom {0}%", - "SSE.Views.TableOptionsDialog.errorAutoFilterDataRange": "L'opération n'a pu être effectuée pour la plage de cellules spécifiée.
    Sélectionnez la plage de données différentes à partir de celui existant et essayez à nouveau.\n", + "SSE.Views.TableOptionsDialog.errorAutoFilterDataRange": "Impossible de réaliser l'opération sur la plage de cellules spécifiée.
    Sélectionnez la plage de données différente de la plage existante et essayez à nouveau.\n", "SSE.Views.TableOptionsDialog.errorFTChangeTableRangeError": "L'opération n'a pas pu être achevée pour la plage de cellules sélectionnée.
    Sélectionnez une plage de telle sorte que la première ligne de la table était sur la même ligne
    et la table résultant chevauché l'actuel.", "SSE.Views.TableOptionsDialog.errorFTRangeIncludedOtherTables": "L'opération n'a pas pu être achevée pour la plage de cellules sélectionnée.
    Sélectionnez une plage qui ne comprend pas d'autres tables.", "SSE.Views.TableOptionsDialog.textCancel": "Annuler", @@ -1588,7 +1609,7 @@ "SSE.Views.Toolbar.tipCopy": "Copier", "SSE.Views.Toolbar.tipCopyStyle": "Copier le style", "SSE.Views.Toolbar.tipDecDecimal": "Réduire les décimales", - "SSE.Views.Toolbar.tipDecFont": "Réduire taille de la police", + "SSE.Views.Toolbar.tipDecFont": "Réduire la taille de la police", "SSE.Views.Toolbar.tipDeleteOpt": "Supprimer les cellules", "SSE.Views.Toolbar.tipDigStyleAccounting": "Style comptable", "SSE.Views.Toolbar.tipDigStyleCurrency": "Style monétaire", @@ -1599,7 +1620,7 @@ "SSE.Views.Toolbar.tipFontSize": "Taille de la police", "SSE.Views.Toolbar.tipHAligh": "Alignement horizontal", "SSE.Views.Toolbar.tipIncDecimal": "Ajouter une décimale", - "SSE.Views.Toolbar.tipIncFont": "Augmenter taille de la police", + "SSE.Views.Toolbar.tipIncFont": "Augmenter la taille de la police", "SSE.Views.Toolbar.tipInsertChart": "Insérer un graphique", "SSE.Views.Toolbar.tipInsertChartSpark": "Insérer une graphique ou sparkline", "SSE.Views.Toolbar.tipInsertEquation": "Insérer une équation", diff --git a/apps/spreadsheeteditor/main/locale/ru.json b/apps/spreadsheeteditor/main/locale/ru.json index 48c625a8c..70fb959a7 100644 --- a/apps/spreadsheeteditor/main/locale/ru.json +++ b/apps/spreadsheeteditor/main/locale/ru.json @@ -74,7 +74,6 @@ "Common.Views.DocumentAccessDialog.textTitle": "Настройки совместного доступа", "Common.Views.Header.openNewTabText": "Открыть в новой вкладке", "Common.Views.Header.textBack": "Перейти к Документам", - "Common.Views.Header.txtHeaderDeveloper": "РЕЖИМ РАЗРАБОТЧИКА", "Common.Views.Header.txtRename": "Переименовать", "Common.Views.ImageFromUrlDialog.cancelButtonText": "Отмена", "Common.Views.ImageFromUrlDialog.okButtonText": "OK", @@ -176,6 +175,23 @@ "SSE.Controllers.DocumentHolder.txtMatrixAlign": "Выравнивание матрицы", "SSE.Controllers.DocumentHolder.txtNoChoices": "Нет вариантов для заполнения ячейки.
    Для замены можно выбрать только текстовые значения из столбца.", "SSE.Controllers.DocumentHolder.txtOverbar": "Черта над текстом", + "SSE.Controllers.DocumentHolder.txtPaste": "Вставить", + "SSE.Controllers.DocumentHolder.txtPasteBorders": "Формула без границ", + "SSE.Controllers.DocumentHolder.txtPasteColWidths": "Формула + ширина столбца", + "SSE.Controllers.DocumentHolder.txtPasteDestFormat": "Форматы конечных ячеек", + "SSE.Controllers.DocumentHolder.txtPasteFormat": "Вставить только форматирование", + "SSE.Controllers.DocumentHolder.txtPasteFormulaNumFormat": "Формула + формат чисел", + "SSE.Controllers.DocumentHolder.txtPasteFormulas": "Вставить только формулу", + "SSE.Controllers.DocumentHolder.txtPasteKeepSourceFormat": "Формула + все форматирование", + "SSE.Controllers.DocumentHolder.txtPasteLink": "Вставить связь", + "SSE.Controllers.DocumentHolder.txtPasteLinkPicture": "Связанный рисунок", + "SSE.Controllers.DocumentHolder.txtPasteMerge": "Объединить условное форматирование", + "SSE.Controllers.DocumentHolder.txtPastePicture": "Рисунок", + "SSE.Controllers.DocumentHolder.txtPasteSourceFormat": "Форматы исходных ячеек", + "SSE.Controllers.DocumentHolder.txtPasteTranspose": "Транспонировать", + "SSE.Controllers.DocumentHolder.txtPasteValFormat": "Значение + все форматирование", + "SSE.Controllers.DocumentHolder.txtPasteValNumFormat": "Значение + формат чисел", + "SSE.Controllers.DocumentHolder.txtPasteValues": "Вставить только значение", "SSE.Controllers.DocumentHolder.txtRemFractionBar": "Удалить дробную черту", "SSE.Controllers.DocumentHolder.txtRemLimit": "Удалить предел", "SSE.Controllers.DocumentHolder.txtRemoveAccentChar": "Удалить диакритический знак", @@ -916,28 +932,29 @@ "SSE.Views.DigitalFilterDialog.textUse1": "Используйте знак ? вместо любого отдельного символа", "SSE.Views.DigitalFilterDialog.textUse2": "Используйте знак * вместо любой последовательности символов", "SSE.Views.DigitalFilterDialog.txtTitle": "Пользовательский фильтр", + "SSE.Views.DocumentHolder.advancedImgText": "Дополнительные параметры изображения", "SSE.Views.DocumentHolder.advancedShapeText": "Дополнительные параметры фигуры", "SSE.Views.DocumentHolder.bottomCellText": "По нижнему краю", "SSE.Views.DocumentHolder.centerCellText": "По центру", "SSE.Views.DocumentHolder.chartText": "Дополнительные параметры диаграммы", - "SSE.Views.DocumentHolder.deleteColumnText": "Удалить столбец", - "SSE.Views.DocumentHolder.deleteRowText": "Удалить строку", - "SSE.Views.DocumentHolder.deleteTableText": "Удалить таблицу", + "SSE.Views.DocumentHolder.deleteColumnText": "Столбец", + "SSE.Views.DocumentHolder.deleteRowText": "Строку", + "SSE.Views.DocumentHolder.deleteTableText": "Таблицу", "SSE.Views.DocumentHolder.direct270Text": "Поворот на 270°", "SSE.Views.DocumentHolder.direct90Text": "Поворот на 90°", "SSE.Views.DocumentHolder.directHText": "Горизонтальное", "SSE.Views.DocumentHolder.directionText": "Направление текста", "SSE.Views.DocumentHolder.editChartText": "Изменить данные", "SSE.Views.DocumentHolder.editHyperlinkText": "Изменить гиперссылку", - "SSE.Views.DocumentHolder.insertColumnLeftText": "Вставить столбец слева", - "SSE.Views.DocumentHolder.insertColumnRightText": "Вставить столбец справа", - "SSE.Views.DocumentHolder.insertRowAboveText": "Вставить строку выше", - "SSE.Views.DocumentHolder.insertRowBelowText": "Вставить строку ниже", + "SSE.Views.DocumentHolder.insertColumnLeftText": "Столбец слева", + "SSE.Views.DocumentHolder.insertColumnRightText": "Столбец справа", + "SSE.Views.DocumentHolder.insertRowAboveText": "Строку выше", + "SSE.Views.DocumentHolder.insertRowBelowText": "Строку ниже", "SSE.Views.DocumentHolder.removeHyperlinkText": "Удалить гиперссылку", - "SSE.Views.DocumentHolder.selectColumnText": "Выделить весь столбец", - "SSE.Views.DocumentHolder.selectDataText": "Выделить данные столбцов", - "SSE.Views.DocumentHolder.selectRowText": "Выделить строку", - "SSE.Views.DocumentHolder.selectTableText": "Выделить таблицу", + "SSE.Views.DocumentHolder.selectColumnText": "Весь столбец", + "SSE.Views.DocumentHolder.selectDataText": "Данные столбцов", + "SSE.Views.DocumentHolder.selectRowText": "Строку", + "SSE.Views.DocumentHolder.selectTableText": "Таблицу", "SSE.Views.DocumentHolder.textArrangeBack": "Переместить на задний план", "SSE.Views.DocumentHolder.textArrangeBackward": "Перенести назад", "SSE.Views.DocumentHolder.textArrangeForward": "Перенести вперед", @@ -988,6 +1005,7 @@ "SSE.Views.DocumentHolder.txtShiftRight": "Ячейки со сдвигом вправо", "SSE.Views.DocumentHolder.txtShiftUp": "Ячейки со сдвигом вверх", "SSE.Views.DocumentHolder.txtShow": "Показать", + "SSE.Views.DocumentHolder.txtShowComment": "Показать комментарий", "SSE.Views.DocumentHolder.txtSort": "Сортировка", "SSE.Views.DocumentHolder.txtSortCellColor": "Сначала ячейки с выделенным цветом", "SSE.Views.DocumentHolder.txtSortFontColor": "Сначала ячейки с выделенным шрифтом", @@ -1031,6 +1049,7 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.strCoAuthModeDescStrict": "Прежде чем вы сможете увидеть изменения, их надо будет принять", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFast": "Быстрый", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFontRender": "Хинтинг шрифтов", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Всегда сохранять на сервере (в противном случае сохранять на сервере при закрытии документа)", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocale": "Язык формул", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocaleEx": "Пример: СУММ; МИН; МАКС; СЧЁТ", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strLiveComment": "Включить отображение комментариев в тексте", @@ -1046,6 +1065,7 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoRecover": "Автовосстановление", "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoSave": "Автосохранение", "SSE.Views.FileMenuPanels.MainSettingsGeneral.textDisabled": "Отключено", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.textForceSave": "Сохранить на сервере", "SSE.Views.FileMenuPanels.MainSettingsGeneral.textMinute": "Каждую минуту", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtCm": "Сантиметр", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtDe": "Немецкий", @@ -1173,6 +1193,7 @@ "SSE.Views.LeftMenu.tipPlugins": "Дополнения", "SSE.Views.LeftMenu.tipSearch": "Поиск", "SSE.Views.LeftMenu.tipSupport": "Обратная связь и поддержка", + "SSE.Views.LeftMenu.txtDeveloper": "РЕЖИМ РАЗРАБОТЧИКА", "SSE.Views.MainSettingsPrint.okButtonText": "Сохранить", "SSE.Views.MainSettingsPrint.strBottom": "Снизу", "SSE.Views.MainSettingsPrint.strLandscape": "Альбомная", diff --git a/apps/spreadsheeteditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm b/apps/spreadsheeteditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm index 9c2891803..fcdab000a 100644 --- a/apps/spreadsheeteditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm +++ b/apps/spreadsheeteditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm @@ -20,10 +20,15 @@ Open the File panel to save, download, print the current spreadsheet, view its info, create a new spreadsheet or open an existing one, access Spreadsheet Editor help or advanced settings. - Open 'Search' window + Open 'Find and Replace' window Ctrl+F - Open the Search window to start searching for a cell containing the characters you need. + Open the Find and Replace window to start searching for a cell containing the characters you need. + + Open 'Find and Replace' window with replacement field + Ctrl+H + Open the Find and Replace window with the replacement field to replace one or more occurrences of the found characters. + Open 'Comments' panel* Ctrl+Shift+H @@ -39,7 +44,7 @@ Alt+Q Open the Chat panel and send a message. - + Save spreadsheet Ctrl+S Save all the changes to the spreadsheet currently edited with Spreadsheet Editor. @@ -79,7 +84,7 @@ Jump to the end of the row - End + End, or Ctrl+Right Outline the last cell of the current row. @@ -172,10 +177,15 @@ Select a fragment from the cursor to the end of the current row. - Extend the selection + Extend the selection to beginning of worksheet Ctrl+Shift+Home Select a fragment from the current selected cells to the beginning of the worksheet. + + Extend the selection to the last used cell + Ctrl+Shift+End + Select a fragment from the current selected cells to the last used cell on the worksheet. + Undo and Redo diff --git a/apps/spreadsheeteditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm b/apps/spreadsheeteditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm index 174ea3ff8..eb19860c8 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm @@ -20,10 +20,15 @@ Открыть панель Файл, чтобы сохранить, загрузить, распечатать текущую электронную таблицу, просмотреть сведения о ней, создать новую таблицу или открыть существующую, получить доступ к Справке по онлайн-редактору электронных таблиц или дополнительным параметрам. - Открыть панель 'Поиск' + Открыть окно 'Поиск и замена' Ctrl+F - Открыть панель Поиск, чтобы начать поиск ячейки, содержащей требуемые символы. + Открыть окно Поиск и замена, чтобы начать поиск ячейки, содержащей требуемые символы. + + Открыть окно 'Поиск и замена' с полем замены + Ctrl+H + Открыть окно Поиск и замена с полем замены, чтобы заменить одно или более вхождений найденных символов. + Открыть панель 'Комментарии'* Ctrl+Shift+H @@ -79,7 +84,7 @@ Перейти в конец строки - End + End или Ctrl+Right Выделить последнюю ячейку текущей строки. @@ -172,10 +177,15 @@ Выделить фрагмент с позиции курсора до конца текущей строки. - Расширить выделение + Расширить выделение до начала рабочего листа Ctrl+Shift+Home Выделить фрагмент начиная с выделенных в данный момент ячеек до начала рабочего листа. + + Расширить выделение до последней используемой ячейки + Ctrl+Shift+End + Выделить фрагмент начиная с выделенных в данный момент ячеек до последней используемой ячейки на рабочем листе. + Отмена и повтор diff --git a/apps/spreadsheeteditor/mobile/app-dev.js b/apps/spreadsheeteditor/mobile/app-dev.js index 70e500048..ead495523 100644 --- a/apps/spreadsheeteditor/mobile/app-dev.js +++ b/apps/spreadsheeteditor/mobile/app-dev.js @@ -51,9 +51,6 @@ require.config({ text : '../vendor/requirejs-text/text', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jszip : '../vendor/jszip/jszip.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', api : 'api/documents/api', core : 'common/main/lib/core/application', extendes : 'common/mobile/utils/extendes', @@ -100,9 +97,6 @@ require([ 'analytics', 'gateway', 'locale', - 'jszip', - 'jsziputils', - 'jsrsasign', 'sockjs' ], function (Backbone, Framework7) { Backbone.history.start(); diff --git a/apps/spreadsheeteditor/mobile/app.js b/apps/spreadsheeteditor/mobile/app.js index 518035953..fd4cd8d79 100644 --- a/apps/spreadsheeteditor/mobile/app.js +++ b/apps/spreadsheeteditor/mobile/app.js @@ -51,9 +51,6 @@ require.config({ text : '../vendor/requirejs-text/text', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jszip : '../vendor/jszip/jszip.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', allfonts : '../../sdkjs/common/AllFonts', sdk : '../../sdkjs/cell/sdk-all-min', api : 'api/documents/api', @@ -80,10 +77,7 @@ require.config({ 'underscore', 'allfonts', 'xregexp', - 'sockjs', - 'jszip', - 'jsziputils', - 'jsrsasign' + 'sockjs' ] }, backbone: { diff --git a/apps/spreadsheeteditor/mobile/app/controller/Main.js b/apps/spreadsheeteditor/mobile/app/controller/Main.js index a6de91ff3..eb04ec058 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/Main.js +++ b/apps/spreadsheeteditor/mobile/app/controller/Main.js @@ -573,7 +573,7 @@ define([ me.appOptions.canAnalytics = params.asc_getIsAnalyticsEnable(); me.appOptions.isOffline = me.api.asc_isOffline(); - me.appOptions.canLicense = (licType === Asc.c_oLicenseResult.Success); + me.appOptions.canLicense = (licType === Asc.c_oLicenseResult.Success || licType === Asc.c_oLicenseResult.SuccessLimit); me.appOptions.isLightVersion = params.asc_getIsLight(); /** coauthoring begin **/ me.appOptions.canCoAuthoring = !me.appOptions.isLightVersion; @@ -582,7 +582,7 @@ define([ me.appOptions.canChat = me.appOptions.canLicense && !me.appOptions.isOffline && !((typeof (me.editorConfig.customization) == 'object') && me.editorConfig.customization.chat===false); me.appOptions.canRename = !!me.permissions.rename; - me.appOptions.canBranding = (licType!==Asc.c_oLicenseResult.Error) && (typeof me.editorConfig.customization == 'object'); + me.appOptions.canBranding = (licType === Asc.c_oLicenseResult.Success) && (typeof me.editorConfig.customization == 'object'); me.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof me.editorConfig.customization == 'object'); } diff --git a/apps/spreadsheeteditor/mobile/app/view/add/AddFunction.js b/apps/spreadsheeteditor/mobile/app/view/add/AddFunction.js index dea71b678..684c4d5da 100644 --- a/apps/spreadsheeteditor/mobile/app/view/add/AddFunction.js +++ b/apps/spreadsheeteditor/mobile/app/view/add/AddFunction.js @@ -57,7 +57,7 @@ define([ }; _.extend(_params, args); - var $content = $('
    ').append(_.template(this.template, _params)); + var $content = $('
    ').append(_.template(this.template)(_params)); // Android fix for navigation if (Framework7.prototype.device.android) { @@ -121,7 +121,7 @@ define([ 'Logical': me.sCatLogical }; - me.layout = $('
    ').append(_.template(me.template, { + me.layout = $('
    ').append(_.template(me.template)({ android : Common.SharedSettings.get('android'), phone : Common.SharedSettings.get('phone'), textGroups : me.textGroups, diff --git a/apps/spreadsheeteditor/mobile/app/view/add/AddLink.js b/apps/spreadsheeteditor/mobile/app/view/add/AddLink.js index de2d9ac1e..d73083cab 100644 --- a/apps/spreadsheeteditor/mobile/app/view/add/AddLink.js +++ b/apps/spreadsheeteditor/mobile/app/view/add/AddLink.js @@ -210,7 +210,7 @@ define([ '<% }) %>'; this.layout.find('#add-link-sheet select').html( - _.template(tpl, { + _.template(tpl)({ worksheets: sheets }) ); @@ -219,7 +219,7 @@ define([ if ($view.length > 0) { $view.find('#add-link-sheet select').html( - _.template(tpl, { + _.template(tpl)({ worksheets: sheets }) ); diff --git a/apps/spreadsheeteditor/mobile/app/view/add/AddOther.js b/apps/spreadsheeteditor/mobile/app/view/add/AddOther.js index efed7228c..6c14be0ff 100644 --- a/apps/spreadsheeteditor/mobile/app/view/add/AddOther.js +++ b/apps/spreadsheeteditor/mobile/app/view/add/AddOther.js @@ -76,8 +76,7 @@ define([ } mapNavigation = - el = _.template(tplNavigation, - { + el = _.template(tplNavigation)({ android : Common.SharedSettings.get('android'), phone : Common.SharedSettings.get('phone'), textBack : this.textBack, diff --git a/apps/spreadsheeteditor/mobile/app/view/edit/EditCell.js b/apps/spreadsheeteditor/mobile/app/view/edit/EditCell.js index 5164c86f9..ba5a83ea7 100644 --- a/apps/spreadsheeteditor/mobile/app/view/edit/EditCell.js +++ b/apps/spreadsheeteditor/mobile/app/view/edit/EditCell.js @@ -133,7 +133,7 @@ define([ '<% }); %>', '', '<% }); %>' - ].join(''), { + ].join(''))({ styles: styles, styleSize: styleSize }); diff --git a/apps/spreadsheeteditor/mobile/app/view/edit/EditChart.js b/apps/spreadsheeteditor/mobile/app/view/edit/EditChart.js index dadda1dc3..e1ed91813 100644 --- a/apps/spreadsheeteditor/mobile/app/view/edit/EditChart.js +++ b/apps/spreadsheeteditor/mobile/app/view/edit/EditChart.js @@ -160,7 +160,7 @@ define([ '<% }); %>', '', '<% }); %>' - ].join(''), { + ].join(''))({ styles: styles }); diff --git a/apps/spreadsheeteditor/mobile/locale/de.json b/apps/spreadsheeteditor/mobile/locale/de.json index 8c6679d7f..2879916e9 100644 --- a/apps/spreadsheeteditor/mobile/locale/de.json +++ b/apps/spreadsheeteditor/mobile/locale/de.json @@ -9,9 +9,9 @@ "SSE.Controllers.AddChart.txtYAxis": "y-Achse", "SSE.Controllers.AddContainer.textChart": "Diagramm", "SSE.Controllers.AddContainer.textFormula": "Funktion", + "SSE.Controllers.AddContainer.textImage": "Bild", "SSE.Controllers.AddContainer.textOther": "Sonstiges", "SSE.Controllers.AddContainer.textShape": "Form", - "SSE.Controllers.AddContainer.textImage": "Image", "SSE.Controllers.AddLink.textInvalidRange": "FEHLER! Ungültiger Zellenbereich", "SSE.Controllers.AddLink.txtNotUrl": "Dieser Bereich soll ein URL in der Format \"http://www.example.com\" sein.", "SSE.Controllers.AddOther.textEmptyImgUrl": "Sie müssen eine Bild-URL angeben.", @@ -24,23 +24,15 @@ "SSE.Controllers.DocumentHolder.menuEdit": "Bearbeiten", "SSE.Controllers.DocumentHolder.menuHide": "Vergeben", "SSE.Controllers.DocumentHolder.menuMerge": "Verbinden", + "SSE.Controllers.DocumentHolder.menuMore": "Mehr", "SSE.Controllers.DocumentHolder.menuOpenLink": "Link öffnen", "SSE.Controllers.DocumentHolder.menuPaste": "Einfügen", "SSE.Controllers.DocumentHolder.menuShow": "Anzeigen", "SSE.Controllers.DocumentHolder.menuUnmerge": "Verbund aufheben", "SSE.Controllers.DocumentHolder.menuUnwrap": "Umbruch aufheben", "SSE.Controllers.DocumentHolder.menuWrap": "Umbrechen", - "SSE.Controllers.DocumentHolder.warnMergeLostData": "Vorgang kann die Daten in den markierten Zellen zerstören.
    Fortsenzen? ", - "SSE.Controllers.DocumentHolder.menuMore": "More", "SSE.Controllers.DocumentHolder.sheetCancel": "Abbrechen", - "SSE.Controllers.EditContainer.textSettings": "Settings", - "SSE.Controllers.EditContainer.textCell": "Cell", - "SSE.Controllers.EditContainer.textTable": "Table", - "SSE.Controllers.EditContainer.textShape": "Shape", - "SSE.Controllers.EditContainer.textImage": "Image", - "SSE.Controllers.EditContainer.textChart": "Chart", - "SSE.Controllers.EditContainer.textText": "Text", - "SSE.Controllers.EditContainer.textHyperlink": "Hyperlink", + "SSE.Controllers.DocumentHolder.warnMergeLostData": "Vorgang kann die Daten in den markierten Zellen zerstören.
    Fortsenzen? ", "SSE.Controllers.EditCell.textAuto": "Automatisch", "SSE.Controllers.EditCell.textFonts": "Schriftarten", "SSE.Controllers.EditCell.textPt": "pt", @@ -86,6 +78,14 @@ "SSE.Controllers.EditChart.textTop": "Oben", "SSE.Controllers.EditChart.textTrillions": "Billionen", "SSE.Controllers.EditChart.textValue": "Wert", + "SSE.Controllers.EditContainer.textCell": "Zelle", + "SSE.Controllers.EditContainer.textChart": "Diagramm", + "SSE.Controllers.EditContainer.textHyperlink": "Hyperlink", + "SSE.Controllers.EditContainer.textImage": "Bild", + "SSE.Controllers.EditContainer.textSettings": "Einstellungen", + "SSE.Controllers.EditContainer.textShape": "Form", + "SSE.Controllers.EditContainer.textTable": "Tabelle", + "SSE.Controllers.EditContainer.textText": "Text", "SSE.Controllers.EditHyperlink.textDefault": "Gewählter Bereich", "SSE.Controllers.EditHyperlink.textEmptyImgUrl": "Sie müssen eine Bild-URL angeben.", "SSE.Controllers.EditHyperlink.textExternalLink": "Externer Link", @@ -108,39 +108,42 @@ "SSE.Controllers.Main.downloadTextText": "Dokument wird heruntergeladen...", "SSE.Controllers.Main.downloadTitleText": "Herunterladen des Dokuments", "SSE.Controllers.Main.errorAccessDeny": "Sie haben versucht die Änderungen im Dokument, zu dem Sie keine Berechtigungen haben, vorzunehemen.
    Wenden Sie sich an Ihren Serveradministrator.", - "SSE.Controllers.Main.errorArgsRange": "Die eingegebene Formel enthält einen Fehler.
    Falscher Bereich der Argumente wurde genutzt.", + "SSE.Controllers.Main.errorArgsRange": "Die eingegebene Formel enthält einen Fehler.
    Falscher Argumentbereich wurde genutzt.", "SSE.Controllers.Main.errorAutoFilterChange": "Der Vorgang ist nicht zulässig, denn es wurde versucht, Zellen in der Tabelle auf Ihrem Arbeitsblatt zu verschieben.", - "SSE.Controllers.Main.errorAutoFilterChangeFormatTable": "Dieser Vorgang kann für die gewählten Zellen nicht ausgeführt werden, weil Sie ein Teil der Tabelle nicht verschieben können.
    Wählen Sie den anderen Datenbereich, so dass die ganze Tabelle verschoben wurde und versuchen Sie noch einmal.", + "SSE.Controllers.Main.errorAutoFilterChangeFormatTable": "Dieser Vorgang kann für die gewählten Zellen nicht ausgeführt werden, weil Sie einen Teil der Tabelle nicht verschieben können.
    Wählen Sie den anderen Datenbereich, so dass die ganze Tabelle verschoben wurde und versuchen Sie noch einmal.", "SSE.Controllers.Main.errorAutoFilterDataRange": "Der Vorgang kann für einen ausgewählten Zellbereich nicht ausgeführt werden.
    Wählen Sie einen einheitlichen Datenbereich, der sich deutlich von dem bestehenden unterscheidet und versuchen Sie es erneut.", "SSE.Controllers.Main.errorAutoFilterHiddenRange": "Die Operation kann nicht ausgeführt werden, weil der Bereich gefilterte Zellen enthält.
    Bitte machen Sie die gefilterten Elemente sichtbar und versuchen Sie es erneut.", "SSE.Controllers.Main.errorBadImageUrl": "URL des Bildes ist falsch", - "SSE.Controllers.Main.errorCoAuthoringDisconnect": "Verbindung zum Server ist verloren gegangen. Das Dokument kann momentan nicht bearbeitet werden.", + "SSE.Controllers.Main.errorCoAuthoringDisconnect": "Verbindung zum Server ist verloren gegangen. Sie können nicht mehr editieren.", "SSE.Controllers.Main.errorConnectToServer": "Das Dokument konnte nicht gespeichert werden. Bitte überprüfen Sie die Verbindungseinstellungen, oder richten Sie an Ihren Administrator.
    Wann Sie auf die Taste \"OK\" klicken, werden Sie aufgefordert, das Dokument herunterzuladen.

    Finden Sie mehr Information über Verbindung des Dokument Servers hier", - "SSE.Controllers.Main.errorCopyMultiselectArea": "Bei einer Markierung von nicht angrenzenden Zellen ist die Ausführung dieses Befehls nicht möglich.
    Wählen Sie nur einen einzelnen Bereich aus, und versuchen Sie es noch mal.", - "SSE.Controllers.Main.errorCountArg": "Die eingegebene Formel enthält einen Fehler.
    Falsche Anzahl an Argumenten wurde genutzt.", + "SSE.Controllers.Main.errorCopyMultiselectArea": "Dieser Befehl kann nicht bei Mehrfachauswahl verwendet werden
    Wählen Sie nur einen einzelnen Bereich aus, und versuchen Sie es nochmal.", + "SSE.Controllers.Main.errorCountArg": "Die eingegebene Formel enthält einen Fehler.
    Es wurde falsche Anzahl an Argumenten benutzt.", "SSE.Controllers.Main.errorCountArgExceed": "Die eingegebene Formel enthält einen Fehler.
    Anzahl der Argumente wurde überschritten.", - "SSE.Controllers.Main.errorCreateDefName": "Die bestehende benannte Bereiche können nicht bearbeitet werden und die neuen Bereiche können
    im Moment nicht erstellt werden, weil einige von ihnen sind in Bearbeitung.", - "SSE.Controllers.Main.errorDatabaseConnection": "Externer Fehler.
    Fehler beim Verbinden zur Datenbank. Bitte wenden Sie sich an den Kundendienst, falls der Fehler bestehen bleibt.", + "SSE.Controllers.Main.errorCreateDefName": "Die bestehende benannte Bereiche können nicht bearbeitet werden und neue Bereiche können
    im Moment nicht erstellt werden, weil einige von ihnen sind in Bearbeitung.", + "SSE.Controllers.Main.errorDatabaseConnection": "Externer Fehler.
    Datenbank-Verbindungsfehler. Wenden Sie sich an den Support.", "SSE.Controllers.Main.errorDataRange": "Falscher Datenbereich.", "SSE.Controllers.Main.errorDefaultMessage": "Fehlercode: %1", "SSE.Controllers.Main.errorFilePassProtect": "Das Dokument ist kennwortgeschützt und kann nicht geöffnet werden.", "SSE.Controllers.Main.errorFileRequest": "Externer Fehler.
    Fehler bei der Dateianfrage. Bitte wenden Sie sich an den Kundendienst, falls der Fehler bestehen bleibt.", "SSE.Controllers.Main.errorFileVKey": "Externer Fehler.
    Ungültiger Sicherheitsschlüssel. Bitte wenden Sie sich an den Kundendienst, falls der Fehler bestehen bleibt.", "SSE.Controllers.Main.errorFillRange": "Der gewählte Zellbereich kann nicht ausgefüllt werden.
    Alle verbundenen Zellen müssen die gleiche Größe haben.", - "SSE.Controllers.Main.errorFormulaName": "Die eingegebene Formel enthält einen Fehler.
    Falscher Name der Formel wurde genutzt.", + "SSE.Controllers.Main.errorFormulaName": "Die eingegebene Formel enthält einen Fehler.
    Es wurde falschen Formelnamen benutzt.", "SSE.Controllers.Main.errorFormulaParsing": "Interner Fehler bei der Syntaxanalyse der Formel.", "SSE.Controllers.Main.errorFrmlWrongReferences": "Die Funktion bezieht sich auf ein Blatt, das nicht existiert.
    Bitte überprüfen Sie die Daten und versuchen Sie es erneut.", - "SSE.Controllers.Main.errorInvalidRef": "Enter a correct name for the selection or a valid reference to go to.", + "SSE.Controllers.Main.errorInvalidRef": "Geben Sie einen korrekten Namen oder einen gültigen Webverweis ein.", "SSE.Controllers.Main.errorKeyEncrypt": "Unbekannter Schlüsseldeskriptor", "SSE.Controllers.Main.errorKeyExpire": "Der Schlüsseldeskriptor ist abgelaufen", "SSE.Controllers.Main.errorLockedAll": "Die Operation kann nicht durchgeführt werden, weil das Blatt von einem anderen Benutzer gesperrt ist.", - "SSE.Controllers.Main.errorLockedWorksheetRename": "Umbenennen des Blattes ist derzeit nicht möglich, denn es wird gleichzeitig von einem anderen Benutzer umbenannt.", - "SSE.Controllers.Main.errorMoveRange": "Es ist unmöglich einen Teil der vereinigten Zelle zu ändern", + "SSE.Controllers.Main.errorLockedWorksheetRename": "Umbenennen des Sheets ist derzeit nicht möglich, denn es wird gleichzeitig von einem anderen Benutzer umbenannt.", + "SSE.Controllers.Main.errorMailMergeLoadFile": "Fehler beim Laden\t", + "SSE.Controllers.Main.errorMailMergeSaveFile": "Verbinden ist fehlgeschlagen.", + "SSE.Controllers.Main.errorMoveRange": "Es ist unmöglich, den Teil einer verbundenen Zelle zu ändern", "SSE.Controllers.Main.errorOpenWarning": "Die Länge einer der Formeln in der Datei hat
    die zugelassene Anzahl von Zeichen überschritten und sie wurde entfernt.", "SSE.Controllers.Main.errorOperandExpected": "Die Syntax der eingegeben Funktion ist nicht korrekt. Bitte überprüfen Sie, ob eine der Klammern - '(' oder ')' fehlt.", - "SSE.Controllers.Main.errorPasteMaxRange": "Der Bereich Kopieren und Einfügen stimmen nicht überein.
    Bitte wählen Sie einen Bereich der gleichen Größe oder klicken auf die erste Zelle der Zeile, um die kopierten Zellen einzufügen", + "SSE.Controllers.Main.errorPasteMaxRange": "Zeilen Kopieren und Einfügen stimmen nicht überein.
    Bitte wählen Sie einen Bereich der gleichen Größe oder klicken auf die erste Zelle der Zeile, um die kopierten Zellen einzufügen.", "SSE.Controllers.Main.errorPrintMaxPagesCount": "Leider kann man in der aktuellen Programmversion nicht mehr als 1500 Seiten gleichzeitig drucken.
    Diese Einschränkung wird in den kommenden Versionen entfernt.", "SSE.Controllers.Main.errorProcessSaveResult": "Speichern ist fehlgeschlagen", + "SSE.Controllers.Main.errorServerVersion": "Editor-Version wurde aktualisiert. Die Seite wird neu geladen, um die Änderungen zu übernehmen.", "SSE.Controllers.Main.errorSessionAbsolute": "Die Bearbeitungssitzung des Dokumentes ist abgelaufen. Laden Sie die Seite neu.", "SSE.Controllers.Main.errorSessionIdle": "Das Dokument wurde lange nicht bearbeitet. Laden Sie die Seite neu.", "SSE.Controllers.Main.errorSessionToken": "Die Verbindung zum Server wurde unterbrochen. Laden Sie die Seite neu.", @@ -151,11 +154,9 @@ "SSE.Controllers.Main.errorUpdateVersion": "Die Dateiversion wurde geändert. Die Seite wird neu geladen.", "SSE.Controllers.Main.errorUserDrop": "Kein Zugriff auf diese Datei ist möglich.", "SSE.Controllers.Main.errorUsersExceed": "Die nach dem Zahlungsplan erlaubte Benutzeranzahl ist überschritten", - "SSE.Controllers.Main.errorViewerDisconnect": "Die Verbindung ist verloren. Man kann das Dokument anschauen.
    Es ist aber momentan nicht möglich, ihn herunterzuladen oder auszudrücken bis die Verbindung wiederhergestellt wird.", - "SSE.Controllers.Main.errorWrongBracketsCount": "Die eingegebene Formel enthält einen Fehler.
    Falsche Anzahl an Klammern wurde genutzt.", + "SSE.Controllers.Main.errorViewerDisconnect": "Die Verbindung ist verloren. Man kann das Dokument anschauen,
    aber nicht herunterladen bis die Verbindung wiederhergestellt wird.", + "SSE.Controllers.Main.errorWrongBracketsCount": "Die eingegebene Formel enthält einen Fehler.
    Es wurde falsche Anzahl an Klammern wurde benutzt.", "SSE.Controllers.Main.errorWrongOperator": "Die eingegebene Formel enthält einen Fehler. Falscher Operator wurde genutzt.
    Bitte korrigieren Sie den Fehler.", - "SSE.Controllers.Main.errorMailMergeLoadFile": "Fehler beim Laden\t", - "SSE.Controllers.Main.errorMailMergeSaveFile": "Verbinden ist fehlgeschlagen.", "SSE.Controllers.Main.leavePageText": "Dieses Dokument enthält ungespeicherte Änderungen. Klicken Sie \"Auf dieser Seite bleiben\", um auf automatisches Speichern des Dokumentes zu warten. Klicken Sie \"Diese Seite verlassen\", um alle nicht gespeicherten Änderungen zu verwerfen.", "SSE.Controllers.Main.loadFontsTextText": "Daten werden geladen...", "SSE.Controllers.Main.loadFontsTitleText": "Daten werden geladen", @@ -202,6 +203,7 @@ "SSE.Controllers.Main.textTryUndoRedo": "Undo/Redo Optionen sind für den halbformalen Zusammenbearbeitungsmodus deaktiviert.
    Klicken Sie auf den Button \"Formaler Modus\", um den formalen Zusammenbearbeitungsmodus zu aktivieren, um die Datei, ohne Störungen anderer Benutzer zu bearbeiten und die Änderungen erst nachdem Sie sie gespeichert haben, zu senden. Sie können zwischen den Zusammenbearbeitungsmodi mit der Hilfe der erweiterten Einstellungen von Editor umschalten.", "SSE.Controllers.Main.textUsername": "Benutzername", "SSE.Controllers.Main.titleLicenseExp": "Lizenz ist abgelaufen", + "SSE.Controllers.Main.titleServerVersion": "Editor wurde aktualisiert", "SSE.Controllers.Main.titleUpdateVersion": "Version wurde geändert", "SSE.Controllers.Main.txtArt": "Hier den Text eingeben", "SSE.Controllers.Main.txtBasicShapes": "Standardformen", @@ -259,8 +261,8 @@ "SSE.Views.AddFunction.sCatMathematic": "Mathematik und Trigonometrie", "SSE.Views.AddFunction.sCatStatistical": "Statistisch", "SSE.Views.AddFunction.sCatTextAndData": "Text und Daten", - "SSE.Views.AddFunction.textGroups": "Kategorien", "SSE.Views.AddFunction.textBack": "Zurück", + "SSE.Views.AddFunction.textGroups": "Kategorien", "SSE.Views.AddLink.textAddLink": "Link hinzufügen", "SSE.Views.AddLink.textAddress": "Adresse", "SSE.Views.AddLink.textDisplay": "Anzeigen", @@ -283,8 +285,7 @@ "SSE.Views.AddOther.textInsert": "Einfügen", "SSE.Views.AddOther.textInsertImage": "Bild einfügen", "SSE.Views.AddOther.textLink": "Link", - "SSE.Views.AddOther.textSortOrig": "Sortieren und Filtern", - "SSE.Views.AddOther.textSort": "Sortieren", + "SSE.Views.AddOther.textSort": "Sortieren und Filtern", "SSE.Views.EditCell.textAccounting": "Rechnungswesen", "SSE.Views.EditCell.textAlignBottom": "Unten ausrichten", "SSE.Views.EditCell.textAlignCenter": "Zentriert ausrichten", @@ -363,6 +364,7 @@ "SSE.Views.EditChart.textMajorType": "Primärer Typ", "SSE.Views.EditChart.textMaxValue": "Maximalwert", "SSE.Views.EditChart.textMinor": "Unerheblich", + "SSE.Views.EditChart.textMinorType": "Sekundärer Typ", "SSE.Views.EditChart.textMinValue": "Minimalwert", "SSE.Views.EditChart.textNone": "Kein", "SSE.Views.EditChart.textNoOverlay": "Ohne Überlagerung", @@ -443,8 +445,8 @@ "SSE.Views.Settings.textAuthor": "Autor", "SSE.Views.Settings.textBack": "Zurück", "SSE.Views.Settings.textCreateDate": "Erstellungsdatum", - "SSE.Views.Settings.textDocInfo": "Dokumentinfo", - "SSE.Views.Settings.textDocTitle": "Titel des Dokuments", + "SSE.Views.Settings.textDocInfo": "Tabelle Information", + "SSE.Views.Settings.textDocTitle": "Titel der Tabelle", "SSE.Views.Settings.textDone": "Fertig", "SSE.Views.Settings.textDownload": "Herunterladen", "SSE.Views.Settings.textDownloadAs": "Herunterladen als...", diff --git a/apps/spreadsheeteditor/mobile/locale/en.json b/apps/spreadsheeteditor/mobile/locale/en.json index d4b8535f9..2b4ae6721 100644 --- a/apps/spreadsheeteditor/mobile/locale/en.json +++ b/apps/spreadsheeteditor/mobile/locale/en.json @@ -9,9 +9,9 @@ "SSE.Controllers.AddChart.txtYAxis": "Y Axis", "SSE.Controllers.AddContainer.textChart": "Chart", "SSE.Controllers.AddContainer.textFormula": "Function", + "SSE.Controllers.AddContainer.textImage": "Image", "SSE.Controllers.AddContainer.textOther": "Other", "SSE.Controllers.AddContainer.textShape": "Shape", - "SSE.Controllers.AddContainer.textImage": "Image", "SSE.Controllers.AddLink.textInvalidRange": "ERROR! Invalid cells range", "SSE.Controllers.AddLink.txtNotUrl": "This field should be a URL in the format 'http://www.example.com'", "SSE.Controllers.AddOther.textEmptyImgUrl": "You need to specify image URL.", @@ -24,23 +24,15 @@ "SSE.Controllers.DocumentHolder.menuEdit": "Edit", "SSE.Controllers.DocumentHolder.menuHide": "Hide", "SSE.Controllers.DocumentHolder.menuMerge": "Merge", + "SSE.Controllers.DocumentHolder.menuMore": "More", "SSE.Controllers.DocumentHolder.menuOpenLink": "Open Link", "SSE.Controllers.DocumentHolder.menuPaste": "Paste", "SSE.Controllers.DocumentHolder.menuShow": "Show", "SSE.Controllers.DocumentHolder.menuUnmerge": "Unmerge", "SSE.Controllers.DocumentHolder.menuUnwrap": "Unwrap", "SSE.Controllers.DocumentHolder.menuWrap": "Wrap", - "SSE.Controllers.DocumentHolder.warnMergeLostData": "Operation can destroy data in the selected cells.
    Continue?", - "SSE.Controllers.DocumentHolder.menuMore": "More", "SSE.Controllers.DocumentHolder.sheetCancel": "Cancel", - "SSE.Controllers.EditContainer.textSettings": "Settings", - "SSE.Controllers.EditContainer.textCell": "Cell", - "SSE.Controllers.EditContainer.textTable": "Table", - "SSE.Controllers.EditContainer.textShape": "Shape", - "SSE.Controllers.EditContainer.textImage": "Image", - "SSE.Controllers.EditContainer.textChart": "Chart", - "SSE.Controllers.EditContainer.textText": "Text", - "SSE.Controllers.EditContainer.textHyperlink": "Hyperlink", + "SSE.Controllers.DocumentHolder.warnMergeLostData": "Operation can destroy data in the selected cells.
    Continue?", "SSE.Controllers.EditCell.textAuto": "Auto", "SSE.Controllers.EditCell.textFonts": "Fonts", "SSE.Controllers.EditCell.textPt": "pt", @@ -86,6 +78,14 @@ "SSE.Controllers.EditChart.textTop": "Top", "SSE.Controllers.EditChart.textTrillions": "Trillions", "SSE.Controllers.EditChart.textValue": "Value", + "SSE.Controllers.EditContainer.textCell": "Cell", + "SSE.Controllers.EditContainer.textChart": "Chart", + "SSE.Controllers.EditContainer.textHyperlink": "Hyperlink", + "SSE.Controllers.EditContainer.textImage": "Image", + "SSE.Controllers.EditContainer.textSettings": "Settings", + "SSE.Controllers.EditContainer.textShape": "Shape", + "SSE.Controllers.EditContainer.textTable": "Table", + "SSE.Controllers.EditContainer.textText": "Text", "SSE.Controllers.EditHyperlink.textDefault": "Selected range", "SSE.Controllers.EditHyperlink.textEmptyImgUrl": "You need to specify image URL.", "SSE.Controllers.EditHyperlink.textExternalLink": "External Link", @@ -108,7 +108,7 @@ "SSE.Controllers.Main.downloadTextText": "Downloading document...", "SSE.Controllers.Main.downloadTitleText": "Downloading Document", "SSE.Controllers.Main.errorAccessDeny": "You are trying to perform an action you do not have rights for.
    Please contact your Document Server administrator.", - "SSE.Controllers.Main.errorArgsRange": "An error in the entered formula.
    Incorrect arguments range is used.", + "SSE.Controllers.Main.errorArgsRange": "An error in the entered formula.
    Incorrect argument range is used.", "SSE.Controllers.Main.errorAutoFilterChange": "The operation is not allowed, as it is attempting to shift cells in a table on your worksheet.", "SSE.Controllers.Main.errorAutoFilterChangeFormatTable": "The operation could not be done for the selected cells as you cannot move a part of the table.
    Select another data range so that the whole table was shifted and try again.", "SSE.Controllers.Main.errorAutoFilterDataRange": "The operation could not be done for the selected range of cells.
    Select a uniform data range different from the existing one and try again.", @@ -135,12 +135,15 @@ "SSE.Controllers.Main.errorKeyExpire": "Key descriptor expired", "SSE.Controllers.Main.errorLockedAll": "The operation could not be done as the sheet has been locked by another user.", "SSE.Controllers.Main.errorLockedWorksheetRename": "The sheet cannot be renamed at the moment as it is being renamed by another user", + "SSE.Controllers.Main.errorMailMergeLoadFile": "Loading failed", + "SSE.Controllers.Main.errorMailMergeSaveFile": "Merge failed.", "SSE.Controllers.Main.errorMoveRange": "Cannot change part of a merged cell", "SSE.Controllers.Main.errorOpenWarning": "The length of one of the formulas in the file exceeded
    the allowed number of characters and it was removed.", "SSE.Controllers.Main.errorOperandExpected": "The entered function syntax is not correct. Please check if you are missing one of the parentheses - '(' or ')'.", - "SSE.Controllers.Main.errorPasteMaxRange": "The copy and paste area does not match.
    Please select an area with the same size or click the first cell in a row to paste the copied cells.", + "SSE.Controllers.Main.errorPasteMaxRange": "The copy and paste area do not match.
    Please select an area with the same size or click the first cell in a row to paste the copied cells.", "SSE.Controllers.Main.errorPrintMaxPagesCount": "Unfortunately, it is not possible to print more than 1500 pages at once in the current program version.
    This restriction will be removed in the upcoming releases.", "SSE.Controllers.Main.errorProcessSaveResult": "Saving failed", + "SSE.Controllers.Main.errorServerVersion": "The editor version has been updated. The page will be reloaded to apply the changes.", "SSE.Controllers.Main.errorSessionAbsolute": "The document editing session has expired. Please reload the page.", "SSE.Controllers.Main.errorSessionIdle": "The document has not been edited for quite a long time. Please reload the page.", "SSE.Controllers.Main.errorSessionToken": "The connection to the server has been interrupted. Please reload the page.", @@ -154,8 +157,6 @@ "SSE.Controllers.Main.errorViewerDisconnect": "Connection is lost. You can still view the document,
    but will not be able to download or print until the connection is restored.", "SSE.Controllers.Main.errorWrongBracketsCount": "An error in the entered formula.
    Wrong number of brackets is used.", "SSE.Controllers.Main.errorWrongOperator": "An error in the entered formula. Wrong operator is used.
    Please correct the error.", - "SSE.Controllers.Main.errorMailMergeLoadFile": "Loading failed", - "SSE.Controllers.Main.errorMailMergeSaveFile": "Merge failed.", "SSE.Controllers.Main.leavePageText": "You have unsaved changes in this document. Click 'Stay on this Page' to await the autosave of the document. Click 'Leave this Page' to discard all the unsaved changes.", "SSE.Controllers.Main.loadFontsTextText": "Loading data...", "SSE.Controllers.Main.loadFontsTitleText": "Loading Data", @@ -202,6 +203,7 @@ "SSE.Controllers.Main.textTryUndoRedo": "The Undo/Redo functions are disabled for the Fast co-editing mode.
    Click the 'Strict mode' button to switch to the Strict co-editing mode to edit the file without other users interference and send your changes only after you save them. You can switch between the co-editing modes using the editor Advanced settings.", "SSE.Controllers.Main.textUsername": "Username", "SSE.Controllers.Main.titleLicenseExp": "License expired", + "SSE.Controllers.Main.titleServerVersion": "Editor updated", "SSE.Controllers.Main.titleUpdateVersion": "Version changed", "SSE.Controllers.Main.txtArt": "Your text here", "SSE.Controllers.Main.txtBasicShapes": "Basic Shapes", @@ -233,8 +235,6 @@ "SSE.Controllers.Main.warnLicenseExp": "Your license has expired.
    Please update your license and refresh the page.", "SSE.Controllers.Main.warnNoLicense": "You are using an open source version of ONLYOFFICE. The version has limitations for concurrent connections to the document server (20 connections at a time).
    If you need more please consider purchasing a commercial license.", "SSE.Controllers.Main.warnProcessRightsChange": "You have been denied the right to edit the file.", - "SSE.Controllers.Main.titleServerVersion": "Editor updated", - "SSE.Controllers.Main.errorServerVersion": "The editor version has been updated. The page will be reloaded to apply the changes.", "SSE.Controllers.Search.textNoTextFound": "Text not found", "SSE.Controllers.Search.textReplaceAll": "Replace All", "SSE.Controllers.Settings.notcriticalErrorTitle": "Warning", @@ -261,8 +261,8 @@ "SSE.Views.AddFunction.sCatMathematic": "Math and trigonometry", "SSE.Views.AddFunction.sCatStatistical": "Statistical", "SSE.Views.AddFunction.sCatTextAndData": "Text and data", - "SSE.Views.AddFunction.textGroups": "Categories", "SSE.Views.AddFunction.textBack": "Back", + "SSE.Views.AddFunction.textGroups": "Categories", "SSE.Views.AddLink.textAddLink": "Add Link", "SSE.Views.AddLink.textAddress": "Address", "SSE.Views.AddLink.textDisplay": "Display", @@ -285,8 +285,7 @@ "SSE.Views.AddOther.textInsert": "Insert", "SSE.Views.AddOther.textInsertImage": "Insert Image", "SSE.Views.AddOther.textLink": "Link", - "SSE.Views.AddOther.textSortOrig": "Sort and Filter", - "SSE.Views.AddOther.textSort": "Sort", + "SSE.Views.AddOther.textSort": "Sort and Filter", "SSE.Views.EditCell.textAccounting": "Accounting", "SSE.Views.EditCell.textAlignBottom": "Align Bottom", "SSE.Views.EditCell.textAlignCenter": "Align Center", @@ -446,8 +445,8 @@ "SSE.Views.Settings.textAuthor": "Author", "SSE.Views.Settings.textBack": "Back", "SSE.Views.Settings.textCreateDate": "Creation date", - "SSE.Views.Settings.textDocInfo": "Document Info", - "SSE.Views.Settings.textDocTitle": "Document title", + "SSE.Views.Settings.textDocInfo": "Spreadsheet Info", + "SSE.Views.Settings.textDocTitle": "Spreadsheet title", "SSE.Views.Settings.textDone": "Done", "SSE.Views.Settings.textDownload": "Download", "SSE.Views.Settings.textDownloadAs": "Download As...", diff --git a/apps/spreadsheeteditor/mobile/locale/fr.json b/apps/spreadsheeteditor/mobile/locale/fr.json index a6670ed90..2525a8cd7 100644 --- a/apps/spreadsheeteditor/mobile/locale/fr.json +++ b/apps/spreadsheeteditor/mobile/locale/fr.json @@ -9,9 +9,9 @@ "SSE.Controllers.AddChart.txtYAxis": "Axe Y", "SSE.Controllers.AddContainer.textChart": "Graphique", "SSE.Controllers.AddContainer.textFormula": "Fonction", + "SSE.Controllers.AddContainer.textImage": "Image", "SSE.Controllers.AddContainer.textOther": "Autre", "SSE.Controllers.AddContainer.textShape": "Forme", - "SSE.Controllers.AddContainer.textImage": "Image", "SSE.Controllers.AddLink.textInvalidRange": "ERREUR! La plage de cellules n'est pas valide", "SSE.Controllers.AddLink.txtNotUrl": "Ce champ doit être une URL au format 'http://www.example.com'", "SSE.Controllers.AddOther.textEmptyImgUrl": "Spécifiez l'URL de l'image", @@ -24,23 +24,15 @@ "SSE.Controllers.DocumentHolder.menuEdit": "Modifier", "SSE.Controllers.DocumentHolder.menuHide": "Masquer", "SSE.Controllers.DocumentHolder.menuMerge": "Fusionner", + "SSE.Controllers.DocumentHolder.menuMore": "Plus", "SSE.Controllers.DocumentHolder.menuOpenLink": "Ouvrir le lien", "SSE.Controllers.DocumentHolder.menuPaste": "Coller", "SSE.Controllers.DocumentHolder.menuShow": "Afficher", "SSE.Controllers.DocumentHolder.menuUnmerge": "Annuler la fusion", "SSE.Controllers.DocumentHolder.menuUnwrap": "Annuler le renvoi", "SSE.Controllers.DocumentHolder.menuWrap": "Renvoi à la ligne", - "SSE.Controllers.DocumentHolder.warnMergeLostData": "Cette opération détruira les données des cellules sélectionnées.
    Сontinuer ?", - "SSE.Controllers.DocumentHolder.menuMore": "More", "SSE.Controllers.DocumentHolder.sheetCancel": "Annuler", - "SSE.Controllers.EditContainer.textSettings": "Settings", - "SSE.Controllers.EditContainer.textCell": "Cell", - "SSE.Controllers.EditContainer.textTable": "Table", - "SSE.Controllers.EditContainer.textShape": "Shape", - "SSE.Controllers.EditContainer.textImage": "Image", - "SSE.Controllers.EditContainer.textChart": "Chart", - "SSE.Controllers.EditContainer.textText": "Text", - "SSE.Controllers.EditContainer.textHyperlink": "Hyperlink", + "SSE.Controllers.DocumentHolder.warnMergeLostData": "Cette opération détruira les données des cellules sélectionnées.
    Сontinuer ?", "SSE.Controllers.EditCell.textAuto": "Auto", "SSE.Controllers.EditCell.textFonts": "Polices", "SSE.Controllers.EditCell.textPt": "pt", @@ -86,6 +78,14 @@ "SSE.Controllers.EditChart.textTop": "En haut", "SSE.Controllers.EditChart.textTrillions": "Trillions", "SSE.Controllers.EditChart.textValue": "Valeur", + "SSE.Controllers.EditContainer.textCell": "Cellule", + "SSE.Controllers.EditContainer.textChart": "Graphique", + "SSE.Controllers.EditContainer.textHyperlink": "Lien hypertexte", + "SSE.Controllers.EditContainer.textImage": "Image", + "SSE.Controllers.EditContainer.textSettings": "Paramètres", + "SSE.Controllers.EditContainer.textShape": "Forme", + "SSE.Controllers.EditContainer.textTable": "Tableau", + "SSE.Controllers.EditContainer.textText": "Texte", "SSE.Controllers.EditHyperlink.textDefault": "Plage sélectionnée", "SSE.Controllers.EditHyperlink.textEmptyImgUrl": "Spécifiez l'URL de l'image", "SSE.Controllers.EditHyperlink.textExternalLink": "Lien externe", @@ -108,54 +108,55 @@ "SSE.Controllers.Main.downloadTextText": "Téléchargement du document...", "SSE.Controllers.Main.downloadTitleText": "Téléchargement du document", "SSE.Controllers.Main.errorAccessDeny": "Vous tentez d'exéсuter une action pour laquelle vous ne disposez pas des droits.
    Veuillez contacter l'administrateur de Document Server.", - "SSE.Controllers.Main.errorArgsRange": "Une erreur dans la formule entrée.
    Argument de plage utilisé est incorrect.", + "SSE.Controllers.Main.errorArgsRange": "Une erreur dans la formule entrée.
    La plage des arguments utilisée est incorrecte.", "SSE.Controllers.Main.errorAutoFilterChange": "L'opération n'est pas autorisée, car elle tente de déplacer les cellules d'un tableau de votre feuille de calcul.", - "SSE.Controllers.Main.errorAutoFilterChangeFormatTable": "Opération impossible sur les cellules sélectionnées car vous ne pouvez pas déplacer une partie du tableau.
    Sélectionnez une autre plage de données afin que tout le tableau soit déplacé et essayez à nouveau.", - "SSE.Controllers.Main.errorAutoFilterDataRange": "L'opération n'a pu être effectuée pour la plage de cellules spécifiée.
    Sélectionnez la plage de données différentes à partir de celui existant et essayez à nouveau.\n", + "SSE.Controllers.Main.errorAutoFilterChangeFormatTable": "Impossible de réaliser l'opération sur les cellules sélectionnées car vous ne pouvez pas déplacer une partie du tableau.
    Sélectionnez une autre plage de données afin que tout le tableau soit déplacé et essayez à nouveau.", + "SSE.Controllers.Main.errorAutoFilterDataRange": "Impossible de réaliser l'opération sur la plage de cellules spécifiée.
    Sélectionnez la plage de données différente de la plage existante et essayez à nouveau.\n", "SSE.Controllers.Main.errorAutoFilterHiddenRange": "L'opération ne peut pas être effectuée car la zone contient des cellules filtrées.
    Veuillez afficher des éléments filtrés et réessayez.", "SSE.Controllers.Main.errorBadImageUrl": "L'URL d'image est incorrecte", - "SSE.Controllers.Main.errorCoAuthoringDisconnect": "Connexion au serveur perdue. Le document ne peut être modifié en ce moment.", - "SSE.Controllers.Main.errorConnectToServer": "Le document n'a pas pu être enregistré. Veuillez vérifier les paramètres de connexion ou contactez votre administrateur.
    Lorsque vous cliquez sur le bouton 'OK', vous serez invité à télécharger le document.

    Trouvez plus d'informations sur la connexion Document Serverhere", + "SSE.Controllers.Main.errorCoAuthoringDisconnect": "La connexion au serveur perdue. Désolé, vous ne pouvez plus modifier le document.", + "SSE.Controllers.Main.errorConnectToServer": "Le document n'a pas pu être enregistré. Veuillez vérifier les paramètres de connexion ou contactez votre administrateur.
    Lorsque vous cliquez sur le bouton 'OK', vous serez invité à télécharger le document.

    Trouvez plus d'informations sur la connexion de Document Serverici", "SSE.Controllers.Main.errorCopyMultiselectArea": "Impossible d'exécuter cette commande sur des sélections multiples.
    Sélectionnez une seule plage et essayez à nouveau.", - "SSE.Controllers.Main.errorCountArg": "Une erreur dans la formule entrée.
    Nombre d'arguments utilisé est incorrect.", - "SSE.Controllers.Main.errorCountArgExceed": "Une erreur dans la formule entrée.
    Nombre d'arguments est dépassé.", - "SSE.Controllers.Main.errorCreateDefName": "Actuellement des plages nommées existantes ne peuvent pas être modifiées et les nouvelles ne peuvent pas être
    créées car certaines d'entre eux sont en cours de modification.", - "SSE.Controllers.Main.errorDatabaseConnection": "Erreur externe.
    Erreur de connexion à la base de données. Si l'erreur persiste veillez contactez l'assistance technique.", + "SSE.Controllers.Main.errorCountArg": "Une erreur dans la formule entrée.
    Le nombre d'arguments utilisé est incorrect.", + "SSE.Controllers.Main.errorCountArgExceed": "Une erreur dans la formule entrée.
    Le nombre d'arguments est dépassé.", + "SSE.Controllers.Main.errorCreateDefName": "Actuellement, des plages nommées existantes ne peuvent pas être modifiées et les nouvelles ne peuvent pas être créées,
    car certaines d'entre eux sont en cours de modification.", + "SSE.Controllers.Main.errorDatabaseConnection": "Erreur externe.
    Erreur de connexion à la base de données. Si l'erreur persiste, veillez contactez l'assistance technique.", "SSE.Controllers.Main.errorDataRange": "Plage de données incorrecte.", "SSE.Controllers.Main.errorDefaultMessage": "Code d'erreur: %1", "SSE.Controllers.Main.errorFilePassProtect": "Le document est protégé par le mot de passe et ne peut être ouvert.", - "SSE.Controllers.Main.errorFileRequest": "Erreur externe.
    Erreur de demande du fichier. Si l'erreur persiste veillez contactez l'assistance technique.", - "SSE.Controllers.Main.errorFileVKey": "Erreur externe.
    Clé de sécurité incorrecte. Si l'erreur persiste veillez contactez l'assistance technique.", + "SSE.Controllers.Main.errorFileRequest": "Erreur externe.
    Erreur de demande du fichier. Si l'erreur persiste, veillez contactez l'assistance technique.", + "SSE.Controllers.Main.errorFileVKey": "Erreur externe.
    Clé de sécurité incorrecte. Si l'erreur persiste, veillez contactez l'assistance technique.", "SSE.Controllers.Main.errorFillRange": "Il est impossible de remplir la plage de cellules sélectionnée.
    Toutes les cellules unies doivent être de la même taille.", - "SSE.Controllers.Main.errorFormulaName": "Une erreur dans la formule entrée.
    Nom de formule utilisé est incorrect.", + "SSE.Controllers.Main.errorFormulaName": "Une erreur dans la formule entrée.
    Le nom de formule utilisé est incorrect.", "SSE.Controllers.Main.errorFormulaParsing": "Une erreur interne lors de l'analyse de la formule.", - "SSE.Controllers.Main.errorFrmlWrongReferences": "La fonction fait référence à une feuille qui n'existe pas.
    Veuillez vérifier les données et réessayer.", + "SSE.Controllers.Main.errorFrmlWrongReferences": "La fonction fait référence à une feuille qui n'existe pas.
    Veuillez vérifier les données et réessayez.", "SSE.Controllers.Main.errorInvalidRef": "Entrez un nom correct pour la sélection ou une référence valable pour aller à.", "SSE.Controllers.Main.errorKeyEncrypt": "Descripteur de clés inconnu", "SSE.Controllers.Main.errorKeyExpire": "Descripteur de clés expiré", "SSE.Controllers.Main.errorLockedAll": "L'opération ne peut pas être faite car la feuille a été verrouillée par un autre utilisateur.", "SSE.Controllers.Main.errorLockedWorksheetRename": "La feuille ne peut pas être renommée pour l'instant puisque elle est renommée par un autre utilisateur", + "SSE.Controllers.Main.errorMailMergeLoadFile": "Échec du chargement", + "SSE.Controllers.Main.errorMailMergeSaveFile": "Fusion a échoué.", "SSE.Controllers.Main.errorMoveRange": "Impossible de modifier une partie d'une cellule fusionnée", - "SSE.Controllers.Main.errorOpenWarning": "La longueur de l'une des formules dans le fichier dépassé le nombre autorisé de caractères et il a été retiré.", - "SSE.Controllers.Main.errorOperandExpected": "La syntaxe de la saisie est incorrecte. Veuillez vérifier si l'une des parenthèses - '(' ou ')' est manquante.", - "SSE.Controllers.Main.errorPasteMaxRange": "La zone de copie ne correspond pas à la zone de collage.
    Pour coller les cellules copiées, veuillez sélectionner une zone avec la même taille ou cliquer sur la première cellule d'une ligne.", + "SSE.Controllers.Main.errorOpenWarning": "La longueur de l'une des formules dans le fichier a dépassé
    le nombre de caractères autorisé, et la formule a été supprimée.", + "SSE.Controllers.Main.errorOperandExpected": "La syntaxe de la saisie est incorrecte. Veuillez vérifier la présence de l'une des parenthèses - '(' ou ')'.", + "SSE.Controllers.Main.errorPasteMaxRange": "La zone de copie ne correspond pas à la zone de collage.
    Sélectionnez une zone avec la même taille ou cliquez sur la première cellule d'une ligne pour coller les cellules sélectionnées.", "SSE.Controllers.Main.errorPrintMaxPagesCount": "Malheureusement, il n’est pas possible d’imprimer plus de 1500 pages à la fois en utilisant la version actuelle du programme.
    Cette restriction sera supprimée dans la version future.", "SSE.Controllers.Main.errorProcessSaveResult": "Échec de l'enregistrement", - "SSE.Controllers.Main.errorSessionAbsolute": "La session de la modification de document a expiré.Veuillez recharger la page.", + "SSE.Controllers.Main.errorServerVersion": "La version de l'éditeur a été mise à jour. La page sera rechargée pour appliquer les modifications.", + "SSE.Controllers.Main.errorSessionAbsolute": "La session de la modification de document a expiré. Veuillez recharger la page.", "SSE.Controllers.Main.errorSessionIdle": "Le document n'est pas modifié depuis longtemps. Veuillez recharger la page.", "SSE.Controllers.Main.errorSessionToken": "La connexion au serveur a été interrompue. Veuillez recharger la page.", "SSE.Controllers.Main.errorStockChart": "L'ordre des lignes est incorrect. Pour créer un graphique boursier organisez vos données sur la feuille de calcul dans l'ordre suivant:
    cours à l'ouverture, cours maximal, cours minimal, cours à la clôture.", "SSE.Controllers.Main.errorToken": "Le jeton de sécurité du document n’était pas formé correctement.
    Veuillez contacter l'administrateur de Document Server.", "SSE.Controllers.Main.errorTokenExpire": "Le jeton de sécurité du document a expiré.
    Veuillez contactez l'administrateur de Document Server.", - "SSE.Controllers.Main.errorUnexpectedGuid": "Erreur externe.
    GUID non prévue. Si l'erreur persiste veillez contactez l'assistance technique.", + "SSE.Controllers.Main.errorUnexpectedGuid": "Erreur externe.
    GUID non prévue. Si l'erreur persiste, veillez contactez l'assistance technique.", "SSE.Controllers.Main.errorUpdateVersion": "La version du fichier a été changée. La page sera rechargée.", - "SSE.Controllers.Main.errorUserDrop": "Impossible d'accéder au fichier", + "SSE.Controllers.Main.errorUserDrop": "Impossible d'accéder au fichier.", "SSE.Controllers.Main.errorUsersExceed": "Le nombre d'utilisateurs autorisés par le plan tarifaire a été dépassé", - "SSE.Controllers.Main.errorViewerDisconnect": "La connexion a été perdue. Vous pouvez toujours afficher le document,
    mais ne pouvez pas le télécharger jusqu'à ce que la connexion soit rétablie.", - "SSE.Controllers.Main.errorWrongBracketsCount": "Une erreur dans la formule entrée.
    Nombre utilisé entre parenthèses est incorrect.", - "SSE.Controllers.Main.errorWrongOperator": "Une erreur dans la formule entrée.Opérateur utilisé est incorrect.
    Veuillez corriger l'erreur.", - "SSE.Controllers.Main.errorMailMergeLoadFile": "Échec du chargement", - "SSE.Controllers.Main.errorMailMergeSaveFile": "Fusion a échoué.", + "SSE.Controllers.Main.errorViewerDisconnect": "La connexion a été perdue. Vous pouvez toujours afficher le document,
    mais ne pouvez pas le télécharger ou l'imprimer jusqu'à ce que la connexion soit rétablie.", + "SSE.Controllers.Main.errorWrongBracketsCount": "Une erreur dans la formule entrée.
    Le nombre de crochets utilisé est incorrect.", + "SSE.Controllers.Main.errorWrongOperator": "Une erreur dans la formule entrée. L'opérateur utilisé est incorrect.
    Veuillez corriger l'erreur.", "SSE.Controllers.Main.leavePageText": "Vous avez des modifications non enregistrées dans ce document. Cliquez sur 'Rester sur cette page' pour la sauvegarde automatique du document. Cliquez sur 'Quitter cette Page' pour ignorer toutes les modifications non enregistrées.", "SSE.Controllers.Main.loadFontsTextText": "Chargement des données...", "SSE.Controllers.Main.loadFontsTitleText": "Chargement des données", @@ -202,6 +203,7 @@ "SSE.Controllers.Main.textTryUndoRedo": "Les fonctions annuler/rétablir sont désactivées pour le mode de la co-édition rapide.
    Cliquez sur le bouton \"Mode strict\" pour passer au mode de la co-édition stricte pour modifier le fichier sans interférence des autres utilisateurs et envoyer vos modifications seulement après leur enregistrement. Vous pouvez basculer entre les modes de la co-édition à l'aide des paramètres avancés de l'éditeur.", "SSE.Controllers.Main.textUsername": "Nom d'utilisateur", "SSE.Controllers.Main.titleLicenseExp": "Licence expirée", + "SSE.Controllers.Main.titleServerVersion": "L'éditeur est mis à jour", "SSE.Controllers.Main.titleUpdateVersion": "Version a été modifiée", "SSE.Controllers.Main.txtArt": "Entrez votre texte", "SSE.Controllers.Main.txtBasicShapes": "Formes de base", @@ -259,8 +261,8 @@ "SSE.Views.AddFunction.sCatMathematic": "Maths et trigonométrie", "SSE.Views.AddFunction.sCatStatistical": "Statistiques", "SSE.Views.AddFunction.sCatTextAndData": "Texte et données", - "SSE.Views.AddFunction.textGroups": "Catégories", "SSE.Views.AddFunction.textBack": "Retour", + "SSE.Views.AddFunction.textGroups": "Catégories", "SSE.Views.AddLink.textAddLink": "Ajouter le lien", "SSE.Views.AddLink.textAddress": "Adresse", "SSE.Views.AddLink.textDisplay": "Afficher", @@ -283,7 +285,6 @@ "SSE.Views.AddOther.textInsert": "Insérer", "SSE.Views.AddOther.textInsertImage": "Insérer une image", "SSE.Views.AddOther.textLink": "Lien", - "SSE.Views.AddOther.textSortOrig": "Trier", "SSE.Views.AddOther.textSort": "Trier et filtrer", "SSE.Views.EditCell.textAccounting": "Comptabilité", "SSE.Views.EditCell.textAlignBottom": "Aligner en bas", @@ -363,6 +364,7 @@ "SSE.Views.EditChart.textMajorType": "Type principal", "SSE.Views.EditChart.textMaxValue": "Valeur maximale", "SSE.Views.EditChart.textMinor": "Secondaires", + "SSE.Views.EditChart.textMinorType": "Type secondaire", "SSE.Views.EditChart.textMinValue": "Valeur minimale", "SSE.Views.EditChart.textNone": "Aucun", "SSE.Views.EditChart.textNoOverlay": "Sans superposition", @@ -443,8 +445,8 @@ "SSE.Views.Settings.textAuthor": "Auteur", "SSE.Views.Settings.textBack": "Retour", "SSE.Views.Settings.textCreateDate": "Date de création", - "SSE.Views.Settings.textDocInfo": "Infos du document", - "SSE.Views.Settings.textDocTitle": "Titre du document", + "SSE.Views.Settings.textDocInfo": "Infos sur tableur", + "SSE.Views.Settings.textDocTitle": "Titre du tableur", "SSE.Views.Settings.textDone": "Terminé", "SSE.Views.Settings.textDownload": "Télécharger", "SSE.Views.Settings.textDownloadAs": "Télécharger comme...", diff --git a/apps/spreadsheeteditor/mobile/locale/ru.json b/apps/spreadsheeteditor/mobile/locale/ru.json index df36a82a8..84f982db9 100644 --- a/apps/spreadsheeteditor/mobile/locale/ru.json +++ b/apps/spreadsheeteditor/mobile/locale/ru.json @@ -9,9 +9,9 @@ "SSE.Controllers.AddChart.txtYAxis": "Ось Y", "SSE.Controllers.AddContainer.textChart": "Диаграмма", "SSE.Controllers.AddContainer.textFormula": "Функция", + "SSE.Controllers.AddContainer.textImage": "Изображение", "SSE.Controllers.AddContainer.textOther": "Другое", "SSE.Controllers.AddContainer.textShape": "Фигура", - "SSE.Controllers.AddContainer.textImage": "Картинка", "SSE.Controllers.AddLink.textInvalidRange": "ОШИБКА! Недопустимый диапазон ячеек", "SSE.Controllers.AddLink.txtNotUrl": "Это поле должно быть URL-адресом в формате 'http://www.example.com'", "SSE.Controllers.AddOther.textEmptyImgUrl": "Необходимо указать URL изображения.", @@ -24,23 +24,15 @@ "SSE.Controllers.DocumentHolder.menuEdit": "Редактировать", "SSE.Controllers.DocumentHolder.menuHide": "Скрыть", "SSE.Controllers.DocumentHolder.menuMerge": "Объединить", + "SSE.Controllers.DocumentHolder.menuMore": "Ещё", "SSE.Controllers.DocumentHolder.menuOpenLink": "Перейти по ссылке", "SSE.Controllers.DocumentHolder.menuPaste": "Вставить", "SSE.Controllers.DocumentHolder.menuShow": "Показать", "SSE.Controllers.DocumentHolder.menuUnmerge": "Разбить", "SSE.Controllers.DocumentHolder.menuUnwrap": "Убрать перенос", "SSE.Controllers.DocumentHolder.menuWrap": "Перенос текста", - "SSE.Controllers.DocumentHolder.warnMergeLostData": "Операция может уничтожить данные в выделенных ячейках.
    Продолжить?", - "SSE.Controllers.DocumentHolder.menuMore": "Еще", "SSE.Controllers.DocumentHolder.sheetCancel": "Отмена", - "SSE.Controllers.EditContainer.textSettings": "Настройки", - "SSE.Controllers.EditContainer.textCell": "Ячейка", - "SSE.Controllers.EditContainer.textTable": "Таблица", - "SSE.Controllers.EditContainer.textShape": "Фигура", - "SSE.Controllers.EditContainer.textImage": "Картинка", - "SSE.Controllers.EditContainer.textChart": "Диаграмма", - "SSE.Controllers.EditContainer.textText": "Текст", - "SSE.Controllers.EditContainer.textHyperlink": "Ссылка", + "SSE.Controllers.DocumentHolder.warnMergeLostData": "Операция может уничтожить данные в выделенных ячейках.
    Продолжить?", "SSE.Controllers.EditCell.textAuto": "Авто", "SSE.Controllers.EditCell.textFonts": "Шрифты", "SSE.Controllers.EditCell.textPt": "пт", @@ -86,6 +78,14 @@ "SSE.Controllers.EditChart.textTop": "Сверху", "SSE.Controllers.EditChart.textTrillions": "Триллионы", "SSE.Controllers.EditChart.textValue": "Значение", + "SSE.Controllers.EditContainer.textCell": "Ячейка", + "SSE.Controllers.EditContainer.textChart": "Диаграмма", + "SSE.Controllers.EditContainer.textHyperlink": "Гиперссылка", + "SSE.Controllers.EditContainer.textImage": "Изображение", + "SSE.Controllers.EditContainer.textSettings": "Настройки", + "SSE.Controllers.EditContainer.textShape": "Фигура", + "SSE.Controllers.EditContainer.textTable": "Таблица", + "SSE.Controllers.EditContainer.textText": "Текст", "SSE.Controllers.EditHyperlink.textDefault": "Выбранный диапазон", "SSE.Controllers.EditHyperlink.textEmptyImgUrl": "Необходимо указать URL изображения.", "SSE.Controllers.EditHyperlink.textExternalLink": "Внешняя ссылка", @@ -135,12 +135,15 @@ "SSE.Controllers.Main.errorKeyExpire": "Срок действия дескриптора ключа истек", "SSE.Controllers.Main.errorLockedAll": "Операция не может быть произведена, так как лист заблокирован другим пользователем.", "SSE.Controllers.Main.errorLockedWorksheetRename": "В настоящее время лист нельзя переименовать, так как его переименовывает другой пользователь", + "SSE.Controllers.Main.errorMailMergeLoadFile": "Сбой при загрузке", + "SSE.Controllers.Main.errorMailMergeSaveFile": "Не удалось выполнить слияние.", "SSE.Controllers.Main.errorMoveRange": "Нельзя изменить часть объединенной ячейки", "SSE.Controllers.Main.errorOpenWarning": "Длина одной из формул в файле превышала
    допустимое количество символов, и формула была удалена.", "SSE.Controllers.Main.errorOperandExpected": "Синтаксис введенной функции некорректен. Проверьте, не пропущена ли одна из скобок - '(' или ')'.", "SSE.Controllers.Main.errorPasteMaxRange": "Область копирования не соответствует области вставки.
    Для вставки скопированных ячеек выделите область такого же размера или щелкните по первой ячейке в строке.", "SSE.Controllers.Main.errorPrintMaxPagesCount": "К сожалению, в текущей версии программы нельзя напечатать более 1500 страниц за один раз.
    Это ограничение будет устранено в последующих версиях.", "SSE.Controllers.Main.errorProcessSaveResult": "Сбой при сохранении", + "SSE.Controllers.Main.errorServerVersion": "Версия редактора была обновлена. Страница будет перезагружена, чтобы применить изменения.", "SSE.Controllers.Main.errorSessionAbsolute": "Время сеанса редактирования документа истекло. Пожалуйста, обновите страницу.", "SSE.Controllers.Main.errorSessionIdle": "Документ долгое время не редактировался. Пожалуйста, обновите страницу.", "SSE.Controllers.Main.errorSessionToken": "Подключение к серверу было прервано. Пожалуйста, обновите страницу.", @@ -154,8 +157,6 @@ "SSE.Controllers.Main.errorViewerDisconnect": "Подключение прервано. Вы по-прежнему можете просматривать документ,
    но не сможете скачать или напечатать его до восстановления подключения.", "SSE.Controllers.Main.errorWrongBracketsCount": "Ошибка во введенной формуле.
    Использовано неверное количество скобок.", "SSE.Controllers.Main.errorWrongOperator": "Ошибка во введенной формуле. Использован неправильный оператор.
    Пожалуйста, исправьте ошибку.", - "SSE.Controllers.Main.errorMailMergeLoadFile": "Сбой при загрузке", - "SSE.Controllers.Main.errorMailMergeSaveFile": "Не удалось выполнить слияние.", "SSE.Controllers.Main.leavePageText": "В документе есть несохраненные изменения. Нажмите 'Остаться на странице', чтобы дождаться автосохранения документа. Нажмите 'Уйти со страницы', чтобы сбросить все несохраненные изменения.", "SSE.Controllers.Main.loadFontsTextText": "Загрузка данных...", "SSE.Controllers.Main.loadFontsTitleText": "Загрузка данных", @@ -202,6 +203,7 @@ "SSE.Controllers.Main.textTryUndoRedo": "Функции отмены и повтора действий отключены в Быстром режиме совместного редактирования.
    Нажмите на кнопку 'Строгий режим' для переключения в Строгий режим совместного редактирования, чтобы редактировать файл без вмешательства других пользователей и отправлять изменения только после того, как вы их сохраните. Переключаться между режимами совместного редактирования можно с помощью Дополнительных параметров редактора.", "SSE.Controllers.Main.textUsername": "Имя пользователя", "SSE.Controllers.Main.titleLicenseExp": "Истек срок действия лицензии", + "SSE.Controllers.Main.titleServerVersion": "Редактор обновлен", "SSE.Controllers.Main.titleUpdateVersion": "Версия изменилась", "SSE.Controllers.Main.txtArt": "Введите ваш текст", "SSE.Controllers.Main.txtBasicShapes": "Основные фигуры", @@ -259,8 +261,8 @@ "SSE.Views.AddFunction.sCatMathematic": "Математические", "SSE.Views.AddFunction.sCatStatistical": "Статистические", "SSE.Views.AddFunction.sCatTextAndData": "Текст и данные", - "SSE.Views.AddFunction.textGroups": "Категории", "SSE.Views.AddFunction.textBack": "Назад", + "SSE.Views.AddFunction.textGroups": "Категории", "SSE.Views.AddLink.textAddLink": "Добавить ссылку", "SSE.Views.AddLink.textAddress": "Адрес", "SSE.Views.AddLink.textDisplay": "Отображать", @@ -283,8 +285,7 @@ "SSE.Views.AddOther.textInsert": "Вставить", "SSE.Views.AddOther.textInsertImage": "Вставить изображение", "SSE.Views.AddOther.textLink": "Ссылка", - "SSE.Views.AddOther.textSortOrig": "Сортировка и фильтрация", - "SSE.Views.AddOther.textSort": "Сортировка", + "SSE.Views.AddOther.textSort": "Сортировка и фильтрация", "SSE.Views.EditCell.textAccounting": "Финансовый", "SSE.Views.EditCell.textAlignBottom": "По нижнему краю", "SSE.Views.EditCell.textAlignCenter": "По центру", @@ -363,6 +364,7 @@ "SSE.Views.EditChart.textMajorType": "Основной тип", "SSE.Views.EditChart.textMaxValue": "Максимум", "SSE.Views.EditChart.textMinor": "Дополнительные", + "SSE.Views.EditChart.textMinorType": "Дополнительный тип", "SSE.Views.EditChart.textMinValue": "Минимум", "SSE.Views.EditChart.textNone": "Нет", "SSE.Views.EditChart.textNoOverlay": "Без наложения", @@ -415,7 +417,7 @@ "SSE.Views.EditShape.textEffects": "Эффекты", "SSE.Views.EditShape.textFill": "Заливка", "SSE.Views.EditShape.textForward": "Перенести вперед", - "SSE.Views.EditShape.textOpacity": "Непрозрачность", + "SSE.Views.EditShape.textOpacity": "Прозрачность", "SSE.Views.EditShape.textRemoveShape": "Удалить фигуру", "SSE.Views.EditShape.textReorder": "Порядок", "SSE.Views.EditShape.textReplace": "Заменить", @@ -438,13 +440,13 @@ "SSE.Views.Search.textSearchIn": "Область поиска", "SSE.Views.Search.textSheet": "Лист", "SSE.Views.Search.textWorkbook": "Книга", - "SSE.Views.Settings.textAbout": "О продукте", + "SSE.Views.Settings.textAbout": "О программе", "SSE.Views.Settings.textAddress": "адрес", "SSE.Views.Settings.textAuthor": "Автор", "SSE.Views.Settings.textBack": "Назад", "SSE.Views.Settings.textCreateDate": "Дата создания", - "SSE.Views.Settings.textDocInfo": "Информация о документе", - "SSE.Views.Settings.textDocTitle": "Название документа", + "SSE.Views.Settings.textDocInfo": "Информация о таблице", + "SSE.Views.Settings.textDocTitle": "Название таблицы", "SSE.Views.Settings.textDone": "Готово", "SSE.Views.Settings.textDownload": "Скачать", "SSE.Views.Settings.textDownloadAs": "Скачать как...", diff --git a/build/Gruntfile.js b/build/Gruntfile.js index 05a499ce5..e4021d4b2 100644 --- a/build/Gruntfile.js +++ b/build/Gruntfile.js @@ -114,7 +114,6 @@ module.exports = function(grunt) { doRegisterTask('bootstrap'); doRegisterTask('jszip'); doRegisterTask('jsziputils'); - doRegisterTask('jsrsasign'); doRegisterTask('requirejs', function(defaultConfig, packageFile) { return { uglify: { @@ -374,7 +373,6 @@ module.exports = function(grunt) { grunt.registerTask('deploy-bootstrap', ['bootstrap-init', 'clean', 'copy']); grunt.registerTask('deploy-jszip', ['jszip-init', 'clean', 'copy']); grunt.registerTask('deploy-jsziputils', ['jsziputils-init', 'clean', 'copy']); - grunt.registerTask('deploy-jsrsasign', ['jsrsasign-init', 'clean', 'copy']); grunt.registerTask('deploy-requirejs', ['requirejs-init', 'clean', 'uglify']); grunt.registerTask('deploy-app-main', ['main-app-init', 'clean', 'imagemin', 'less', 'requirejs', 'concat', diff --git a/build/common.json b/build/common.json index c5fc67f31..0a7255f78 100644 --- a/build/common.json +++ b/build/common.json @@ -162,17 +162,6 @@ } } }, - "jsrsasign": { - "clean": [ - "../deploy/web-apps/vendor/jsrsasign" - ], - "copy": { - "script": { - "src": "../vendor/jsrsasign/jsrsasign-latest-all-min.js", - "dest": "../deploy/web-apps/vendor/jsrsasign/jsrsasign-latest-all-min.js" - } - } - }, "underscore": { "clean": [ "../deploy/web-apps/vendor/underscore" @@ -206,8 +195,7 @@ "deploy-underscore", "deploy-bootstrap", "deploy-jszip", - "deploy-jsziputils", - "deploy-jsrsasign" + "deploy-jsziputils" ] } } \ No newline at end of file diff --git a/build/documenteditor.json b/build/documenteditor.json index a9ee525c2..ac7be5be4 100644 --- a/build/documenteditor.json +++ b/build/documenteditor.json @@ -30,7 +30,6 @@ "sockjs": "empty:", "jszip": "empty:", "jszip-utils": "empty:", - "jsrsasign": "empty:", "coapisettings": "empty:", "allfonts": "empty:", "sdk": "empty:", @@ -85,8 +84,7 @@ "xregexp", "sockjs", "jszip", - "jszip-utils", - "jsrsasign" + "jszip-utils" ] }, "gateway": { @@ -197,7 +195,6 @@ "sockjs": "empty:", "jszip": "empty:", "jszip-utils": "empty:", - "jsrsasign": "empty:", "coapisettings": "empty:", "allfonts": "empty:", "sdk": "empty:", @@ -255,8 +252,7 @@ "xregexp", "sockjs", "jszip", - "jszip-utils", - "jsrsasign" + "jszip-utils" ] }, "gateway": { diff --git a/build/presentationeditor.json b/build/presentationeditor.json index 7073edbb6..b3512c847 100644 --- a/build/presentationeditor.json +++ b/build/presentationeditor.json @@ -30,7 +30,6 @@ "sockjs": "empty:", "jszip": "empty:", "jszip-utils": "empty:", - "jsrsasign": "empty:", "coapisettings": "empty:", "allfonts": "empty:", "sdk": "empty:", @@ -85,8 +84,7 @@ "xregexp", "sockjs", "jszip", - "jszip-utils", - "jsrsasign" + "jszip-utils" ] }, "gateway": { @@ -197,7 +195,6 @@ "sockjs": "empty:", "jszip": "empty:", "jszip-utils": "empty:", - "jsrsasign": "empty:", "coapisettings": "empty:", "allfonts": "empty:", "sdk": "empty:", @@ -255,8 +252,7 @@ "xregexp", "sockjs", "jszip", - "jszip-utils", - "jsrsasign" + "jszip-utils" ] }, "gateway": { diff --git a/build/spreadsheeteditor.json b/build/spreadsheeteditor.json index e3655845b..2ff9bd594 100644 --- a/build/spreadsheeteditor.json +++ b/build/spreadsheeteditor.json @@ -30,7 +30,6 @@ "sockjs": "empty:", "jszip": "empty:", "jszip-utils": "empty:", - "jsrsasign": "empty:", "coapisettings": "empty:", "allfonts": "empty:", "sdk": "empty:", @@ -85,8 +84,7 @@ "xregexp", "sockjs", "jszip", - "jszip-utils", - "jsrsasign" + "jszip-utils" ] }, "gateway": { @@ -208,7 +206,6 @@ "sockjs": "empty:", "jszip": "empty:", "jszip-utils": "empty:", - "jsrsasign": "empty:", "coapisettings": "empty:", "allfonts": "empty:", "sdk": "empty:", @@ -266,8 +263,7 @@ "xregexp", "sockjs", "jszip", - "jszip-utils", - "jsrsasign" + "jszip-utils" ] }, "gateway": { diff --git a/vendor/jquery/README.md b/vendor/jquery/README.md index 328064b7b..92dfef0e6 100644 --- a/vendor/jquery/README.md +++ b/vendor/jquery/README.md @@ -1,7 +1,9 @@ jQuery Component ================ -Shim repository for the [jQuery](http://jquery.com). +Shim [repository](https://github.com/components/jquery) for the [jQuery](http://jquery.com). + +If you're looking for jquery-migrate: It got it's [own repository](https://github.com/components/jquery-migrate) since jQuery v3.0.0. Package Managers ---------------- @@ -9,3 +11,4 @@ Package Managers * [Bower](http://bower.io/): `jquery` * [Component](https://github.com/component/component): `components/jquery` * [Composer](http://packagist.org/packages/components/jquery): `components/jquery` +* [spm](http://spmjs.io/package/jquery): `jquery` diff --git a/vendor/jquery/bower.json b/vendor/jquery/bower.json index 2fa650fc5..a03804338 100644 --- a/vendor/jquery/bower.json +++ b/vendor/jquery/bower.json @@ -1,11 +1,16 @@ { - "name": "jquery", - "version": "2.0.3", - "description": "jQuery component", - "keywords": [ - "jquery", - "component" - ], - "main": "jquery.js", - "license": "MIT" + "name": "jquery", + "version": "3.2.1", + "description": "jQuery component", + "license": "MIT", + "keywords": [ + "jquery", + "component" + ], + "main": "jquery.js", + "ignore": [ + "component.json", + "package.json", + "composer.json" + ] } diff --git a/vendor/jquery/component.json b/vendor/jquery/component.json index cf834a301..0716b0a5d 100644 --- a/vendor/jquery/component.json +++ b/vendor/jquery/component.json @@ -1,15 +1,22 @@ { - "name": "jquery", - "repo": "components/jquery", - "version": "2.0.3", - "description": "jQuery component", - "keywords": [ - "jquery", - "component" - ], - "main": "jquery.js", - "scripts": [ - "jquery.js" - ], - "license": "MIT" + "name": "jquery", + "repo": "components/jquery", + "version": "3.2.1", + "description": "jQuery component", + "license": "MIT", + "keywords": [ + "jquery", + "component" + ], + "main": "jquery.js", + "scripts": [ + "jquery.js", + "jquery.min.js", + "jquery.slim.js", + "jquery.slim.min.js" + ], + "files": [ + "jquery.min.map", + "jquery.slim.min.map" + ] } diff --git a/vendor/jquery/composer.json b/vendor/jquery/composer.json index c61784062..8a779adb8 100644 --- a/vendor/jquery/composer.json +++ b/vendor/jquery/composer.json @@ -6,20 +6,17 @@ "license": "MIT", "support": { "irc": "irc://irc.freenode.org/jquery", - "issues": "http://bugs.jquery.com", + "issues": "https://github.com/jquery/jquery/issues", "forum": "http://forum.jquery.com", "wiki": "http://docs.jquery.com/", "source": "https://github.com/jquery/jquery" }, "authors": [ { - "name": "John Resig", - "email": "jeresig@gmail.com" + "name": "JS Foundation and other contributors", + "url": "https://github.com/jquery/jquery/blob/master/AUTHORS.txt" } ], - "require": { - "robloach/component-installer": "*" - }, "extra": { "component": { "scripts": [ @@ -27,8 +24,10 @@ ], "files": [ "jquery.min.js", - "jquery-migrate.js", - "jquery-migrate.min.js" + "jquery.min.map", + "jquery.slim.js", + "jquery.slim.min.js", + "jquery.slim.min.map" ] } } diff --git a/vendor/jquery/jquery-migrate.js b/vendor/jquery/jquery-migrate.js index 89437ebed..05b1a803c 100644 --- a/vendor/jquery/jquery-migrate.js +++ b/vendor/jquery/jquery-migrate.js @@ -1,30 +1,47 @@ /*! - * jQuery Migrate - v1.4.1 - 2016-05-19 + * jQuery Migrate - v3.0.0 - 2016-06-09 * Copyright jQuery Foundation and other contributors */ -(function( jQuery, window, undefined ) { -// See http://bugs.jquery.com/ticket/13335 -// "use strict"; +(function( jQuery, window ) { +"use strict"; -jQuery.migrateVersion = "1.4.1"; +jQuery.migrateVersion = "3.0.0"; +( function() { + + // Support: IE9 only + // IE9 only creates console object when dev tools are first opened + // Also, avoid Function#bind here to simplify PhantomJS usage + var log = window.console && window.console.log && + function() { window.console.log.apply( window.console, arguments ); }, + rbadVersions = /^[12]\./; + + if ( !log ) { + return; + } + + // Need jQuery 3.0.0+ and no older Migrate loaded + if ( !jQuery || rbadVersions.test( jQuery.fn.jquery ) ) { + log( "JQMIGRATE: jQuery 3.0.0+ REQUIRED" ); + } + if ( jQuery.migrateWarnings ) { + log( "JQMIGRATE: Migrate plugin loaded multiple times" ); + } + + // Show a message on the console so devs know we're active + log( "JQMIGRATE: Migrate is installed" + + ( jQuery.migrateMute ? "" : " with logging active" ) + + ", version " + jQuery.migrateVersion ); + +} )(); + var warnedAbout = {}; // List of warnings already given; public read only jQuery.migrateWarnings = []; -// Set to true to prevent console output; migrateWarnings still maintained -// jQuery.migrateMute = false; - -// Show a message on the console so devs know we're active -if ( window.console && window.console.log ) { - window.console.log( "JQMIGRATE: Migrate is installed" + - ( jQuery.migrateMute ? "" : " with logging active" ) + - ", version " + jQuery.migrateVersion ); -} - // Set to false to disable traces that appear with warnings if ( jQuery.migrateTrace === undefined ) { jQuery.migrateTrace = true; @@ -36,7 +53,7 @@ jQuery.migrateReset = function() { jQuery.migrateWarnings.length = 0; }; -function migrateWarn( msg) { +function migrateWarn( msg ) { var console = window.console; if ( !warnedAbout[ msg ] ) { warnedAbout[ msg ] = true; @@ -51,209 +68,40 @@ function migrateWarn( msg) { } function migrateWarnProp( obj, prop, value, msg ) { - if ( Object.defineProperty ) { - // On ES5 browsers (non-oldIE), warn if the code tries to get prop; - // allow property to be overwritten in case some other plugin wants it - try { - Object.defineProperty( obj, prop, { - configurable: true, - enumerable: true, - get: function() { - migrateWarn( msg ); - return value; - }, - set: function( newValue ) { - migrateWarn( msg ); - value = newValue; - } - }); - return; - } catch( err ) { - // IE8 is a dope about Object.defineProperty, can't warn there + Object.defineProperty( obj, prop, { + configurable: true, + enumerable: true, + get: function() { + migrateWarn( msg ); + return value; } - } - - // Non-ES5 (or broken) browser; just set the property - jQuery._definePropertyBroken = true; - obj[ prop ] = value; + } ); } if ( document.compatMode === "BackCompat" ) { - // jQuery has never supported or tested Quirks Mode + + // JQuery has never supported or tested Quirks Mode migrateWarn( "jQuery is not compatible with Quirks Mode" ); } -var attrFn = jQuery( "", { size: 1 } ).attr("size") && jQuery.attrFn, - oldAttr = jQuery.attr, - valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get || - function() { return null; }, - valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set || - function() { return undefined; }, - rnoType = /^(?:input|button)$/i, - rnoAttrNodeType = /^[238]$/, - rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, - ruseDefault = /^(?:checked|selected)$/i; - -// jQuery.attrFn -migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" ); - -jQuery.attr = function( elem, name, value, pass ) { - var lowerName = name.toLowerCase(), - nType = elem && elem.nodeType; - - if ( pass ) { - // Since pass is used internally, we only warn for new jQuery - // versions where there isn't a pass arg in the formal params - if ( oldAttr.length < 4 ) { - migrateWarn("jQuery.fn.attr( props, pass ) is deprecated"); - } - if ( elem && !rnoAttrNodeType.test( nType ) && - (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) { - return jQuery( elem )[ name ]( value ); - } - } - - // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking - // for disconnected elements we don't warn on $( "
    \ - Powered by JSLitmus \ -
    '; - - /** - * The public API for creating and running tests - */ - window.JSLitmus = { - /** The list of all tests that have been registered with JSLitmus.test */ - _tests: [], - /** The queue of tests that need to be run */ - _queue: [], - - /** - * The parsed query parameters the current page URL. This is provided as a - * convenience for test functions - it's not used by JSLitmus proper - */ - params: {}, - - /** - * Initialize - */ - _init: function() { - // Parse query params into JSLitmus.params[] hash - var match = (location + '').match(/([^?#]*)(#.*)?$/); - if (match) { - var pairs = match[1].split('&'); - for (var i = 0; i < pairs.length; i++) { - var pair = pairs[i].split('='); - if (pair.length > 1) { - var key = pair.shift(); - var value = pair.length > 1 ? pair.join('=') : pair[0]; - this.params[key] = value; - } - } - } - - // Write out the stylesheet. We have to do this here because IE - // doesn't honor sheets written after the document has loaded. - document.write(STYLESHEET); - - // Setup the rest of the UI once the document is loaded - if (window.addEventListener) { - window.addEventListener('load', this._setup, false); - } else if (document.addEventListener) { - document.addEventListener('load', this._setup, false); - } else if (window.attachEvent) { - window.attachEvent('onload', this._setup); - } - - return this; - }, - - /** - * Set up the UI - */ - _setup: function() { - var el = jsl.$('jslitmus_container'); - if (!el) document.body.appendChild(el = document.createElement('div')); - - el.innerHTML = MARKUP; - - // Render the UI for all our tests - for (var i=0; i < JSLitmus._tests.length; i++) - JSLitmus.renderTest(JSLitmus._tests[i]); - }, - - /** - * (Re)render all the test results - */ - renderAll: function() { - for (var i = 0; i < JSLitmus._tests.length; i++) - JSLitmus.renderTest(JSLitmus._tests[i]); - JSLitmus.renderChart(); - }, - - /** - * (Re)render the chart graphics - */ - renderChart: function() { - var url = JSLitmus.chartUrl(); - jsl.$('chart_link').href = url; - jsl.$('chart_image').src = url; - jsl.$('chart').style.display = ''; - - // Update the tiny URL - jsl.$('tiny_url').src = 'http://tinyurl.com/api-create.php?url='+escape(url); - }, - - /** - * (Re)render the results for a specific test - */ - renderTest: function(test) { - // Make a new row if needed - if (!test._row) { - var trow = jsl.$('test_row_template'); - if (!trow) return; - - test._row = trow.cloneNode(true); - test._row.style.display = ''; - test._row.id = ''; - test._row.onclick = function() {JSLitmus._queueTest(test);}; - test._row.title = 'Run ' + test.name + ' test'; - trow.parentNode.appendChild(test._row); - test._row.cells[0].innerHTML = test.name; - } - - var cell = test._row.cells[1]; - var cns = [test.loopArg ? 'test_looping' : 'test_nonlooping']; - - if (test.error) { - cns.push('test_error'); - cell.innerHTML = - '
    ' + test.error + '
    ' + - '
    • ' + - jsl.join(test.error, ': ', '
    • ') + - '
    '; - } else { - if (test.running) { - cns.push('test_running'); - cell.innerHTML = 'running'; - } else if (jsl.indexOf(JSLitmus._queue, test) >= 0) { - cns.push('test_pending'); - cell.innerHTML = 'pending'; - } else if (test.count) { - cns.push('test_done'); - var hz = test.getHz(jsl.$('test_normalize').checked); - cell.innerHTML = hz != Infinity ? hz : '∞'; - } else { - cell.innerHTML = 'ready'; - } - } - cell.className = cns.join(' '); - }, - - /** - * Create a new test - */ - test: function(name, f) { - // Create the Test object - var test = new Test(name, f); - JSLitmus._tests.push(test); - - // Re-render if the test state changes - test.onChange = JSLitmus.renderTest; - - // Run the next test if this one finished - test.onStop = function(test) { - if (JSLitmus.onTestFinish) JSLitmus.onTestFinish(test); - JSLitmus.currentTest = null; - JSLitmus._nextTest(); - }; - - // Render the new test - this.renderTest(test); - }, - - /** - * Add all tests to the run queue - */ - runAll: function(e) { - e = e || window.event; - var reverse = e && e.shiftKey, len = JSLitmus._tests.length; - for (var i = 0; i < len; i++) { - JSLitmus._queueTest(JSLitmus._tests[!reverse ? i : (len - i - 1)]); - } - }, - - /** - * Remove all tests from the run queue. The current test has to finish on - * it's own though - */ - stop: function() { - while (JSLitmus._queue.length) { - var test = JSLitmus._queue.shift(); - JSLitmus.renderTest(test); - } - }, - - /** - * Run the next test in the run queue - */ - _nextTest: function() { - if (!JSLitmus.currentTest) { - var test = JSLitmus._queue.shift(); - if (test) { - jsl.$('stop_button').disabled = false; - JSLitmus.currentTest = test; - test.run(); - JSLitmus.renderTest(test); - if (JSLitmus.onTestStart) JSLitmus.onTestStart(test); - } else { - jsl.$('stop_button').disabled = true; - JSLitmus.renderChart(); - } - } - }, - - /** - * Add a test to the run queue - */ - _queueTest: function(test) { - if (jsl.indexOf(JSLitmus._queue, test) >= 0) return; - JSLitmus._queue.push(test); - JSLitmus.renderTest(test); - JSLitmus._nextTest(); - }, - - /** - * Generate a Google Chart URL that shows the data for all tests - */ - chartUrl: function() { - var n = JSLitmus._tests.length, markers = [], data = []; - var d, min = 0, max = -1e10; - var normalize = jsl.$('test_normalize').checked; - - // Gather test data - for (var i=0; i < JSLitmus._tests.length; i++) { - var test = JSLitmus._tests[i]; - if (test.count) { - var hz = test.getHz(normalize); - var v = hz != Infinity ? hz : 0; - data.push(v); - markers.push('t' + jsl.escape(test.name + '(' + jsl.toLabel(hz)+ ')') + ',000000,0,' + - markers.length + ',10'); - max = Math.max(v, max); - } - } - if (markers.length <= 0) return null; - - // Build chart title - var title = document.getElementsByTagName('title'); - title = (title && title.length) ? title[0].innerHTML : null; - var chart_title = []; - if (title) chart_title.push(title); - chart_title.push('Ops/sec (' + platform + ')'); - - // Build labels - var labels = [jsl.toLabel(min), jsl.toLabel(max)]; - - var w = 250, bw = 15; - var bs = 5; - var h = markers.length*(bw + bs) + 30 + chart_title.length*20; - - var params = { - chtt: escape(chart_title.join('|')), - chts: '000000,10', - cht: 'bhg', // chart type - chd: 't:' + data.join(','), // data set - chds: min + ',' + max, // max/min of data - chxt: 'x', // label axes - chxl: '0:|' + labels.join('|'), // labels - chsp: '0,1', - chm: markers.join('|'), // test names - chbh: [bw, 0, bs].join(','), // bar widths - // chf: 'bg,lg,0,eeeeee,0,eeeeee,.5,ffffff,1', // gradient - chs: w + 'x' + h - }; - return 'http://chart.apis.google.com/chart?' + jsl.join(params, '=', '&'); - } - }; - - JSLitmus._init(); -})(); \ No newline at end of file diff --git a/vendor/underscore/test/vendor/qunit-extras.js b/vendor/underscore/test/vendor/qunit-extras.js new file mode 100644 index 000000000..663d32489 --- /dev/null +++ b/vendor/underscore/test/vendor/qunit-extras.js @@ -0,0 +1,776 @@ +/*! + * QUnit Extras v1.4.1 + * Copyright 2011-2015 John-David Dalton + * Based on a gist by Jörn Zaefferer + * Available under MIT license + */ +;(function() { + + /** Used as a safe reference for `undefined` in pre ES5 environments. */ + var undefined; + + /** Used as a horizontal rule in console output. */ + var hr = '----------------------------------------'; + + /** Used for native method references. */ + var arrayProto = Array.prototype; + + /** Native method shortcut. */ + var push = arrayProto.push, + unshift = arrayProto.unshift; + + /** Used to match HTML entities. */ + var reEscapedHtml = /(&|<|>|"|')/g; + + /** Used to match parts of the assert message. */ + var reDied = /^Died on test #\d+/, + reMessage = /^([\s\S]*?)<\/span>/; + + /** Used to associate color names with their corresponding codes. */ + var ansiCodes = { + 'bold': 1, + 'green': 32, + 'magenta': 35, + 'red': 31 + }; + + /** Used to convert HTML entities to characters. */ + var htmlUnescapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" + }; + + /** Used to determine if values are of the language type Object. */ + var objectTypes = { + 'function': true, + 'object': true + }; + + /** Used as a reference to the global object. */ + var root = (objectTypes[typeof window] && window) || this; + + /** Detect free variable `exports`. */ + var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports; + + /** Detect free variable `module`. */ + var freeModule = objectTypes[typeof module] && module && !module.nodeType && module; + + /** Detect free variable `global` from Node.js or Browserified code and use it as `root`. */ + var freeGlobal = freeExports && freeModule && typeof global == 'object' && global; + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Checks if a given value is present in an array using strict equality + * for comparisons, i.e. `===`. + * + * @private + * @param {Array} array The array to iterate over. + * @param {*} value The value to check for. + * @returns {boolean} Returns `true` if the `value` is found, else `false`. + */ + function contains(array, value) { + var index = -1, + length = array ? array.length : 0; + + while (++index < length) { + if (array[index] === value) { + return true; + } + } + return false; + } + + /** + * Checks if `value` is the language type of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + */ + function isObject(value) { + var type = typeof value; + return type == 'function' || (value && type == 'object') || false; + } + + /** + * Creates a string with `text` repeated `n` number of times. + * + * @private + * @param {string} text The text to repeat. + * @param {number} n The number of times to repeat `text`. + * @returns {string} The created string. + */ + function repeat(text, n) { + return Array(n + 1).join(text); + } + + /** + * Resolves the value of property `key` on `object`. + * + * @private + * @param {Object} object The object to inspect. + * @param {string} key The name of the property to resolve. + * @returns {*} Returns the resolved value. + */ + function result(object, key) { + return object == null ? undefined : object[key]; + } + + /** + * Converts the HTML entities `&`, `<`, `>`, `"`, and `'` + * in `string` to their corresponding characters. + * + * @private + * @param {string} string The string to unescape. + * @returns {string} Returns the unescaped string. + */ + function unescape(string) { + return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar); + } + + /** + * Used by `unescape` to convert HTML entities to characters. + * + * @private + * @param {string} match The matched character to unescape. + * @returns {string} Returns the unescaped character. + */ + function unescapeHtmlChar(match) { + return htmlUnescapes[match]; + } + + /** + * Creates a function that provides `value` to the wrapper function as its + * first argument. Additional arguments provided to the function are appended + * to those provided to the wrapper function. The wrapper is executed with + * the `this` binding of the created function. + * + * @private + * @param {*} value The value to wrap. + * @param {Function} wrapper The wrapper function. + * @returns {Function} Returns the new function. + */ + function wrap(value, wrapper) { + return function() { + var args = [value]; + push.apply(args, arguments); + return wrapper.apply(this, args); + }; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Installs the QUnit additions on the given `context` object. + * + * @memberOf exports + * @param {Object} context The context object. + */ + function runInContext(context) { + + /** Object references. */ + var phantom = context.phantom, + define = context.define, + document = !phantom && context.document, + process = phantom || context.process, + amd = define && define.amd, + console = context.console, + java = !document && context.java, + print = context.print, + require = context.require; + + /** Detects if running on Node.js. */ + var isNode = isObject(process) && typeof process.on == 'function'; + + /** Detects if running in a PhantomJS web page. */ + var isPhantomPage = typeof context.callPhantom == 'function'; + + /** Detects if QUnit Extras should log to the console. */ + var isSilent = document && !isPhantomPage; + + /** Used to indicate if running in Windows. */ + var isWindows = isNode && process.platform == 'win32'; + + /** Used to indicate if ANSI escape codes are supported. */ + var isAnsiSupported = (function() { + if (isNode && process.stdout && !process.stdout.isTTY) { + return false; + } + if (isWindows || getEnv('COLORTERM')) { + return true; + } + return /^(?:ansi|cygwin|linux|screen|xterm|vt100)$|color/i.test(getEnv('TERM')); + }()); + + /** Used to display the wait throbber. */ + var throbberDelay = 500, + waitCount = -1; + + /** Shorten `context.QUnit.QUnit` to `context.QUnit`. */ + var QUnit = context.QUnit = context.QUnit.QUnit || context.QUnit; + + /*------------------------------------------------------------------------*/ + + /** + * Schedules timer-based callbacks. + * + * @private + * @param {Function|string} fn The function to call. + * @param {number} delay The number of milliseconds to delay the `fn` call. + * @param {Array} args Arguments to invoke `fn` with. + * @param {boolean} repeated A flag to specify whether `fn` is called repeatedly. + * @returns {number} The ID of the timeout. + */ + function schedule(fn, delay, args, repeated) { + // Rhino 1.7RC4 will error assigning `task` below. + // See https://bugzilla.mozilla.org/show_bug.cgi?id=775566. + var task = ids[++counter] = new JavaAdapter(java.util.TimerTask, { + 'run': function() { + fn.apply(context, args); + } + }); + // Support non-functions. + if (typeof fn != 'function') { + fn = (function(code) { + code = String(code); + return function() { eval(code); }; + }(fn)); + } + // Used by `setInterval`. + if (repeated) { + timer.schedule(task, delay, delay); + } + // Used by `setTimeout`. + else { + timer.schedule(task, delay); + } + return counter; + } + + /** + * Clears the delay set by `setInterval` or `setTimeout`. + * + * @memberOf context + * @param {number} id The ID of the timeout to be cleared. + */ + function clearTimer(id) { + if (ids[id]) { + ids[id].cancel(); + timer.purge(); + delete ids[id]; + } + } + + /** + * Executes a code snippet or function repeatedly, with a delay between each call. + * + * @memberOf context + * @param {Function|string} fn The function to call or string to evaluate. + * @param {number} delay The number of milliseconds to delay each `fn` call. + * @param {...*} [args] Arguments to invoke `fn` with. + * @returns {number} The ID of the timeout. + */ + function setInterval(fn, delay) { + return schedule(fn, delay, slice.call(arguments, 2), true); + } + + /** + * Executes a code snippet or a function after specified delay. + * + * @memberOf context + * @param {Function|string} fn The function to call or string to evaluate. + * @param {number} delay The number of milliseconds to delay the `fn` call. + * @param {...*} [args] Arguments to invoke `fn` with. + * @returns {number} The ID of the timeout. + */ + function setTimeout(fn, delay) { + return schedule(fn, delay, slice.call(arguments, 2)); + } + + /*------------------------------------------------------------------------*/ + + /** + * Gets the environment variable value by a given name. + * + * @private + * @param {string} name The name of the environment variable to get. + * @returns {*} Returns the environment variable value. + */ + function getEnv(name) { + if (isNode) { + return process.env[name]; + } + if (java) { + return java.lang.System.getenv(name); + } + if (!amd && typeof require == 'function') { + try { + return require('system').env[name]; + } catch(e) {} + } + } + + /** + * Adds text color to the terminal output of `string`. + * + * @private + * @param {string} colorName The name of the color to add. + * @param {string} string The string to add colors to. + * @returns {string} Returns the colored string. + */ + function color(colorName, string) { + return isAnsiSupported + ? ('\x1B[' + ansiCodes[colorName] + 'm' + string + '\x1B[0m') + : string; + } + + /** + * Writes an inline message to standard output. + * + * @private + * @param {string} [text=''] The text to log. + */ + var logInline = (function() { + if (!isNode || isWindows) { + return function() {}; + } + // Cleanup any inline logs when exited via `ctrl+c`. + process.on('SIGINT', function() { + logInline(); + process.exit(); + }); + + var prevLine = ''; + return function(text) { + var blankLine = repeat(' ', prevLine.length); + if (text == null) { + text = ''; + } + if (text.length > hr.length) { + text = text.slice(0, hr.length - 3) + '...'; + } + prevLine = text; + process.stdout.write(text + blankLine.slice(text.length) + '\r'); + } + }()); + + /** + * Writes the wait throbber to standard output. + * + * @private + */ + function logThrobber() { + logInline('Please wait' + repeat('.', (++waitCount % 3) + 1)); + } + + /*------------------------------------------------------------------------*/ + + /** + * The number of retries async tests have to succeed. + * + * @memberOf QUnit.config + * @type number + */ + QUnit.config.asyncRetries = 0; + + /** + * An object of excused tests and assertions. + * + * @memberOf QUnit.config + * @type Object + */ + QUnit.config.excused = {}; + + /** + * An object used to hold "extras" information about the current running test. + * + * @memberOf QUnit.config + * @type Object + */ + QUnit.config.extrasData = { + + /** + * The data object for the active test module. + * + * @memberOf QUnit.config.extrasData + * @type Object + */ + 'module': {}, + + /** + * The data object for Sauce Labs. + * + * @memberOf QUnit.config.extrasData + * @type Object + */ + 'sauce': { + + /** + * An array of failed test details. + * + * @memberOf QUnit.config.extrasData.sauce + * @type Array + */ + 'tests': [] + } + }; + + /** + * Converts an object into a string representation. + * + * @memberOf QUnit + * @type Function + * @param {Object} object The object to stringify. + * @returns {string} The result string. + */ + QUnit.jsDump.parsers.object = (function() { + var func = QUnit.jsDump.parsers.object; + if (isSilent) { + return func; + } + return function(object) { + if (typeof object.rhinoException != 'object') { + return func(object); + } + return object.name + + ' { message: "' + object.message + + '", fileName: "' + object.fileName + + '", lineNumber: ' + object.lineNumber + ' }'; + }; + }()); + + /*------------------------------------------------------------------------*/ + + // Add a callback to be triggered after every assertion. + QUnit.log(function(details) { + QUnit.config.extrasData.module.logs.push(details); + }); + + // Add a callback to be triggered at the start of every test module. + QUnit.moduleStart(function(details) { + var module = QUnit.config.extrasData.module; + module.name = details.name; + module.logs = []; + module.printed = false; + }); + + // Wrap old API to intercept `expected` and `message`. + if (QUnit.push) { + QUnit.push = wrap(QUnit.push, function(push, result, actual, expected, message) { + push.call(this, result, actual, expected, message); + + var asserts = QUnit.config.current.assertions, + item = asserts[asserts.length - 1]; + + item.expected = QUnit.jsDump.parse(expected); + item.text = message; + }); + } + // Wrap old API to intercept `message`. + if (QUnit.pushFailure) { + QUnit.pushFailure = wrap(QUnit.pushFailure, function(pushFailure, message, source, actual) { + pushFailure.call(this, message, source, actual); + + var asserts = QUnit.config.current.assertions, + item = asserts[asserts.length - 1]; + + item.expected = ''; + item.text = message; + }); + } + // Wrap to flag tests using `assert.async`. + if (QUnit.assert.async) { + QUnit.assert.async = wrap(QUnit.assert.async, function(async) { + this.test.usesAsync = true; + return async.call(this); + }); + } + // Add a callback to be triggered at the start of every test. + QUnit.testStart(function(details) { + var config = QUnit.config, + test = config.current; + + var excused = config.excused || {}, + excusedTests = excused[details.module], + excusedAsserts = excusedTests && excusedTests[details.name]; + + // Allow async tests to retry. + if (!test.retries) { + test.retries = 0; + test.finish = wrap(test.finish, function(finish) { + if (this.async || this.usesAsync) { + var asserts = this.assertions, + config = QUnit.config, + index = -1, + length = asserts.length, + logs = config.extrasData.module.logs, + queue = config.queue; + + while (++index < length) { + var assert = asserts[index]; + if (!assert.result && this.retries < config.asyncRetries) { + var oldLength = queue.length; + logs.length -= asserts.length; + asserts.length = 0; + + this.retries++; + this.queue(); + + unshift.apply(queue, queue.splice(oldLength, queue.length - oldLength)); + return; + } + } + } + finish.call(this); + }); + } + // Exit early when there is nothing to excuse. + if (!excusedAsserts) { + return; + } + // Excuse the entire test. + if (excusedAsserts === true) { + test.async = test.usesAsync = false; + test.callback = function() {}; + test.expected = 0; + return; + } + // Wrap to intercept `expected` and `message`. + if (test.push) { + test.push = wrap(test.push, function(push, result, actual, expected, message) { + push.call(this, result, actual, expected, message); + + var item = this.assertions[this.assertions.length - 1]; + item.expected = QUnit.jsDump.parse(expected); + item.text = message; + }); + } + // Wrap to intercept `message`. + if (test.pushFailure) { + test.pushFailure = wrap(test.pushFailure, function(pushFailure, message, source, actual) { + pushFailure.call(this, message, source, actual); + + var item = this.assertions[this.assertions.length - 1]; + item.expected = ''; + item.text = message; + }); + } + // Wrap to excuse specific assertions. + test.finish = wrap(test.finish, function(finish) { + var asserts = this.assertions, + config = QUnit.config, + expected = this.expected, + items = asserts.slice(), + length = items.length; + + if (expected == null) { + if (config.requireExpects) { + expected = length; + items.push('Expected number of assertions to be defined, but expect() was not called.'); + } else if (!length) { + expected = 1; + items.push('Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.'); + } + } else if (expected != length) { + items.push('Expected ' + expected + ' assertions, but ' + length + ' were run'); + } + var index = -1; + length = items.length; + + while (++index < length) { + var assert = items[index], + isStr = typeof assert == 'string'; + + var assertMessage = isStr ? assert : assert.text || unescape(result(reMessage.exec(assert.message), 1)), + assertValue = isStr ? assert : assert.expected, + assertDied = result(reDied.exec(assertMessage), 0); + + if ((assertMessage && contains(excusedAsserts, assertMessage)) || + (assertDied && contains(excusedAsserts, assertDied)) || + (assertValue && ( + contains(excusedAsserts, assertValue) || + contains(excusedAsserts, assertValue.replace(/\s+/g, '')) + ))) { + if (isStr) { + while (asserts.length < expected) { + asserts.push({ 'result': true }); + } + asserts.length = expected; + } + else { + assert.result = true; + } + } + } + finish.call(this); + }); + }); + + // Add a callback to be triggered after a test is completed. + QUnit.testDone(function(details) { + var config = QUnit.config, + data = config.extrasData, + failures = details.failed, + hidepassed = config.hidepassed, + module = data.module, + moduleLogs = module.logs, + sauceTests = data.sauce.tests; + + if (hidepassed && !failures) { + return; + } + if (!isSilent) { + logInline(); + if (!module.printed) { + module.printed = true; + console.log(hr); + console.log(color('bold', module.name)); + console.log(hr); + } + console.log(' ' + (failures ? color('red', 'FAIL') : color('green', 'PASS')) + ' - ' + details.name); + } + if (!failures) { + return; + } + var index = -1, + length = moduleLogs.length; + + while(++index < length) { + var entry = moduleLogs[index]; + if (hidepassed && entry.result) { + continue; + } + var expected = entry.expected, + result = entry.result, + type = typeof expected != 'undefined' ? 'EQ' : 'OK'; + + var message = [ + result ? color('green', 'PASS') : color('red', 'FAIL'), + type, + entry.message || 'ok' + ]; + + if (!result && type == 'EQ') { + message.push(color('magenta', 'Expected: ' + expected + ', Actual: ' + entry.actual)); + } + if (!isSilent) { + console.log(' ' + message.join(' | ')); + } + if (!entry.result) { + sauceTests.push(entry); + } + } + }); + + // Add a callback to be triggered when all testing has completed. + QUnit.done(function(details) { + var failures = details.failed, + statusColor = failures ? 'magenta' : 'green'; + + if (!isSilent) { + logInline(); + console.log(hr); + console.log(color(statusColor, ' PASS: ' + details.passed + ' FAIL: ' + failures + ' TOTAL: ' + details.total)); + console.log(color(statusColor, ' Finished in ' + details.runtime + ' milliseconds.')); + console.log(hr); + } + // Exit out of Node.js or PhantomJS. + try { + if (failures) { + process.exit(1); + } else { + process.exit(0); + } + } catch(e) {} + + // Exit out of Narwhal, Rhino, or RingoJS. + try { + if (failures) { + java.lang.System.exit(1); + } else { + quit(); + } + } catch(e) {} + + // Assign results to `global_test_results` for Sauce Labs. + details.tests = QUnit.config.extrasData.sauce.tests; + context.global_test_results = details; + }); + + /*------------------------------------------------------------------------*/ + + // Replace poisoned `raises` method. + context.raises = QUnit.raises = QUnit['throws'] || QUnit.raises; + + // Add CLI extras. + if (!document) { + // Timeout fallbacks based on the work of Andrea Giammarchi and Weston C. + // See https://github.com/WebReflection/wru/blob/master/src/rhinoTimers.js + // and http://stackoverflow.com/questions/2261705/how-to-run-a-javascript-function-asynchronously-without-using-settimeout. + try { + var counter = 0, + ids = {}, + slice = Array.prototype.slice, + timer = new java.util.Timer; + + (function() { + var getDescriptor = Object.getOwnPropertyDescriptor || function() { + return { 'writable': true }; + }; + + var descriptor; + if ((!context.clearInterval || ((descriptor = getDescriptor(context, 'clearInterval')) && (descriptor.writable || descriptor.set))) && + (!context.setInterval || ((descriptor = getDescriptor(context, 'setInterval')) && (descriptor.writable || descriptor.set)))) { + context.clearInterval = clearTimer; + context.setInterval = setInterval; + } + if ((!context.clearTimeout || ((descriptor = getDescriptor(context, 'clearTimeout')) && (descriptor.writable || descriptor.set))) && + (!context.setTimeout || ((descriptor = getDescriptor(context, 'setTimeout')) && (descriptor.writable || descriptor.set)))) { + context.clearTimeout = clearTimer; + context.setTimeout = setTimeout; + } + }()); + } catch(e) {} + + // Expose QUnit API on `context`. + // Exclude `module` because some environments have it as a built-in object. + ('asyncTest deepEqual equal equals expect notDeepEqual notEqual notStrictEqual ' + + 'ok raises same start stop strictEqual test throws').replace(/\S+/g, function(methodName) { + context[methodName] = QUnit[methodName]; + }); + + // Add `console.log` support to Narwhal, Rhino, and RingoJS. + if (!console) { + console = context.console = { 'log': function() {} }; + } + // RingoJS removes ANSI escape codes in `console.log`, but not in `print`. + if (java && typeof print == 'function') { + console.log = print; + } + // Start log throbber. + if (!isSilent) { + context.setInterval(logThrobber, throbberDelay); + } + // Must call `QUnit.start` in the test file if not loaded in a browser. + QUnit.config.autostart = false; + QUnit.init(); + } + } + + /*--------------------------------------------------------------------------*/ + + // Export QUnit Extras. + if (freeExports) { + freeExports.runInContext = runInContext; + } else { + runInContext(root); + } +}.call(this)); \ No newline at end of file diff --git a/vendor/underscore/test/vendor/qunit.css b/vendor/underscore/test/vendor/qunit.css index 7ba3f9a30..f1dcd4e1c 100644 --- a/vendor/underscore/test/vendor/qunit.css +++ b/vendor/underscore/test/vendor/qunit.css @@ -1,11 +1,12 @@ -/** - * QUnit v1.12.0 - A JavaScript Unit Testing Framework +/*! + * QUnit 1.18.0 + * http://qunitjs.com/ * - * http://qunitjs.com - * - * Copyright 2012 jQuery Foundation and other contributors - * Released under the MIT license. + * Copyright jQuery Foundation and other contributors + * Released under the MIT license * http://jquery.org/license + * + * Date: 2015-04-03T10:23Z */ /** Font Family and Sizes */ @@ -31,32 +32,29 @@ #qunit-header { padding: 0.5em 0 0.5em 1em; - color: #8699a4; - background-color: #0d3349; + color: #8699A4; + background-color: #0D3349; font-size: 1.5em; line-height: 1em; - font-weight: normal; + font-weight: 400; border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - -webkit-border-top-right-radius: 5px; - -webkit-border-top-left-radius: 5px; } #qunit-header a { text-decoration: none; - color: #c2ccd1; + color: #C2CCD1; } #qunit-header a:hover, #qunit-header a:focus { - color: #fff; + color: #FFF; } #qunit-testrunner-toolbar label { display: inline-block; - padding: 0 .5em 0 .1em; + padding: 0 0.5em 0 0.1em; } #qunit-banner { @@ -64,21 +62,33 @@ } #qunit-testrunner-toolbar { - padding: 0.5em 0 0.5em 2em; + padding: 0.5em 1em 0.5em 1em; color: #5E740B; - background-color: #eee; + background-color: #EEE; overflow: hidden; } #qunit-userAgent { - padding: 0.5em 0 0.5em 2.5em; - background-color: #2b81af; - color: #fff; + padding: 0.5em 1em 0.5em 1em; + background-color: #2B81AF; + color: #FFF; text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; } #qunit-modulefilter-container { float: right; + padding: 0.2em; +} + +.qunit-url-config { + display: inline-block; + padding: 0.1em; +} + +.qunit-filter { + display: block; + float: right; + margin-left: 1em; } /** Tests: Pass/Fail */ @@ -88,24 +98,51 @@ } #qunit-tests li { - padding: 0.4em 0.5em 0.4em 2.5em; - border-bottom: 1px solid #fff; + padding: 0.4em 1em 0.4em 1em; + border-bottom: 1px solid #FFF; list-style-position: inside; } -#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running { +#qunit-tests > li { display: none; } +#qunit-tests li.running, +#qunit-tests li.pass, +#qunit-tests li.fail, +#qunit-tests li.skipped { + display: list-item; +} + +#qunit-tests.hidepass li.running, +#qunit-tests.hidepass li.pass { + visibility: hidden; + position: absolute; + width: 0px; + height: 0px; + padding: 0; + border: 0; + margin: 0; +} + #qunit-tests li strong { cursor: pointer; } +#qunit-tests li.skipped strong { + cursor: default; +} + #qunit-tests li a { padding: 0.5em; - color: #c2ccd1; + color: #C2CCD1; text-decoration: none; } + +#qunit-tests li p a { + padding: 0.25em; + color: #6B6464; +} #qunit-tests li a:hover, #qunit-tests li a:focus { color: #000; @@ -120,11 +157,9 @@ margin-top: 0.5em; padding: 0.5em; - background-color: #fff; + background-color: #FFF; border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; } .qunit-collapsed { @@ -133,13 +168,13 @@ #qunit-tests table { border-collapse: collapse; - margin-top: .2em; + margin-top: 0.2em; } #qunit-tests th { text-align: right; vertical-align: top; - padding: 0 .5em 0 0; + padding: 0 0.5em 0 0; } #qunit-tests td { @@ -153,26 +188,26 @@ } #qunit-tests del { - background-color: #e0f2be; - color: #374e0c; + background-color: #E0F2BE; + color: #374E0C; text-decoration: none; } #qunit-tests ins { - background-color: #ffcaca; + background-color: #FFCACA; color: #500; text-decoration: none; } /*** Test Counts */ -#qunit-tests b.counts { color: black; } +#qunit-tests b.counts { color: #000; } #qunit-tests b.passed { color: #5E740B; } #qunit-tests b.failed { color: #710909; } #qunit-tests li li { padding: 5px; - background-color: #fff; + background-color: #FFF; border-bottom: none; list-style-position: inside; } @@ -180,8 +215,8 @@ /*** Passing Styles */ #qunit-tests li li.pass { - color: #3c510c; - background-color: #fff; + color: #3C510C; + background-color: #FFF; border-left: 10px solid #C6E746; } @@ -189,7 +224,7 @@ #qunit-tests .pass .test-name { color: #366097; } #qunit-tests .pass .test-actual, -#qunit-tests .pass .test-expected { color: #999999; } +#qunit-tests .pass .test-expected { color: #999; } #qunit-banner.qunit-pass { background-color: #C6E746; } @@ -197,40 +232,52 @@ #qunit-tests li li.fail { color: #710909; - background-color: #fff; + background-color: #FFF; border-left: 10px solid #EE5757; white-space: pre; } #qunit-tests > li:last-child { border-radius: 0 0 5px 5px; - -moz-border-radius: 0 0 5px 5px; - -webkit-border-bottom-right-radius: 5px; - -webkit-border-bottom-left-radius: 5px; } -#qunit-tests .fail { color: #000000; background-color: #EE5757; } +#qunit-tests .fail { color: #000; background-color: #EE5757; } #qunit-tests .fail .test-name, -#qunit-tests .fail .module-name { color: #000000; } +#qunit-tests .fail .module-name { color: #000; } #qunit-tests .fail .test-actual { color: #EE5757; } -#qunit-tests .fail .test-expected { color: green; } +#qunit-tests .fail .test-expected { color: #008000; } #qunit-banner.qunit-fail { background-color: #EE5757; } +/*** Skipped tests */ + +#qunit-tests .skipped { + background-color: #EBECE9; +} + +#qunit-tests .qunit-skipped-label { + background-color: #F4FF77; + display: inline-block; + font-style: normal; + color: #366097; + line-height: 1.8em; + padding: 0 0.5em; + margin: -0.4em 0.4em -0.4em 0; +} /** Result */ #qunit-testresult { - padding: 0.5em 0.5em 0.5em 2.5em; + padding: 0.5em 1em 0.5em 1em; - color: #2b81af; + color: #2B81AF; background-color: #D2E0E6; - border-bottom: 1px solid white; + border-bottom: 1px solid #FFF; } #qunit-testresult .module-name { - font-weight: bold; + font-weight: 700; } /** Fixture */ diff --git a/vendor/underscore/test/vendor/qunit.js b/vendor/underscore/test/vendor/qunit.js index 84c73907d..f3542ca9d 100644 --- a/vendor/underscore/test/vendor/qunit.js +++ b/vendor/underscore/test/vendor/qunit.js @@ -1,35 +1,42 @@ -/** - * QUnit v1.12.0 - A JavaScript Unit Testing Framework +/*! + * QUnit 1.18.0 + * http://qunitjs.com/ * - * http://qunitjs.com + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license * - * Copyright 2013 jQuery Foundation and other contributors - * Released under the MIT license. - * https://jquery.org/license/ + * Date: 2015-04-03T10:23Z */ (function( window ) { var QUnit, - assert, config, onErrorFnPrev, - testId = 0, - fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""), + loggingCallbacks = {}, + fileName = ( sourceFromStacktrace( 0 ) || "" ).replace( /(:\d+)+\)?/, "" ).replace( /.+\//, "" ), toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty, // Keep a local reference to Date (GH-283) Date = window.Date, + now = Date.now || function() { + return new Date().getTime(); + }, + globalStartCalled = false, + runStarted = false, setTimeout = window.setTimeout, + clearTimeout = window.clearTimeout, defined = { - setTimeout: typeof window.setTimeout !== "undefined", + document: window.document !== undefined, + setTimeout: window.setTimeout !== undefined, sessionStorage: (function() { var x = "qunit-test-string"; try { sessionStorage.setItem( x, x ); sessionStorage.removeItem( x ); return true; - } catch( e ) { + } catch ( e ) { return false; } }()) @@ -71,627 +78,18 @@ var QUnit, * @return {Object} New object with only the own properties (recursively). */ objectValues = function( obj ) { - // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392. - /*jshint newcap: false */ var key, val, vals = QUnit.is( "array", obj ) ? [] : {}; for ( key in obj ) { if ( hasOwn.call( obj, key ) ) { - val = obj[key]; - vals[key] = val === Object(val) ? objectValues(val) : val; + val = obj[ key ]; + vals[ key ] = val === Object( val ) ? objectValues( val ) : val; } } return vals; }; -function Test( settings ) { - extend( this, settings ); - this.assertions = []; - this.testNumber = ++Test.count; -} - -Test.count = 0; - -Test.prototype = { - init: function() { - var a, b, li, - tests = id( "qunit-tests" ); - - if ( tests ) { - b = document.createElement( "strong" ); - b.innerHTML = this.nameHtml; - - // `a` initialized at top of scope - a = document.createElement( "a" ); - a.innerHTML = "Rerun"; - a.href = QUnit.url({ testNumber: this.testNumber }); - - li = document.createElement( "li" ); - li.appendChild( b ); - li.appendChild( a ); - li.className = "running"; - li.id = this.id = "qunit-test-output" + testId++; - - tests.appendChild( li ); - } - }, - setup: function() { - if ( - // Emit moduleStart when we're switching from one module to another - this.module !== config.previousModule || - // They could be equal (both undefined) but if the previousModule property doesn't - // yet exist it means this is the first test in a suite that isn't wrapped in a - // module, in which case we'll just emit a moduleStart event for 'undefined'. - // Without this, reporters can get testStart before moduleStart which is a problem. - !hasOwn.call( config, "previousModule" ) - ) { - if ( hasOwn.call( config, "previousModule" ) ) { - runLoggingCallbacks( "moduleDone", QUnit, { - name: config.previousModule, - failed: config.moduleStats.bad, - passed: config.moduleStats.all - config.moduleStats.bad, - total: config.moduleStats.all - }); - } - config.previousModule = this.module; - config.moduleStats = { all: 0, bad: 0 }; - runLoggingCallbacks( "moduleStart", QUnit, { - name: this.module - }); - } - - config.current = this; - - this.testEnvironment = extend({ - setup: function() {}, - teardown: function() {} - }, this.moduleTestEnvironment ); - - this.started = +new Date(); - runLoggingCallbacks( "testStart", QUnit, { - name: this.testName, - module: this.module - }); - - /*jshint camelcase:false */ - - - /** - * Expose the current test environment. - * - * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead. - */ - QUnit.current_testEnvironment = this.testEnvironment; - - /*jshint camelcase:true */ - - if ( !config.pollution ) { - saveGlobal(); - } - if ( config.notrycatch ) { - this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert ); - return; - } - try { - this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert ); - } catch( e ) { - QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) ); - } - }, - run: function() { - config.current = this; - - var running = id( "qunit-testresult" ); - - if ( running ) { - running.innerHTML = "Running:
    " + this.nameHtml; - } - - if ( this.async ) { - QUnit.stop(); - } - - this.callbackStarted = +new Date(); - - if ( config.notrycatch ) { - this.callback.call( this.testEnvironment, QUnit.assert ); - this.callbackRuntime = +new Date() - this.callbackStarted; - return; - } - - try { - this.callback.call( this.testEnvironment, QUnit.assert ); - this.callbackRuntime = +new Date() - this.callbackStarted; - } catch( e ) { - this.callbackRuntime = +new Date() - this.callbackStarted; - - QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) ); - // else next test will carry the responsibility - saveGlobal(); - - // Restart the tests if they're blocking - if ( config.blocking ) { - QUnit.start(); - } - } - }, - teardown: function() { - config.current = this; - if ( config.notrycatch ) { - if ( typeof this.callbackRuntime === "undefined" ) { - this.callbackRuntime = +new Date() - this.callbackStarted; - } - this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert ); - return; - } else { - try { - this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert ); - } catch( e ) { - QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) ); - } - } - checkPollution(); - }, - finish: function() { - config.current = this; - if ( config.requireExpects && this.expected === null ) { - QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack ); - } else if ( this.expected !== null && this.expected !== this.assertions.length ) { - QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack ); - } else if ( this.expected === null && !this.assertions.length ) { - QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack ); - } - - var i, assertion, a, b, time, li, ol, - test = this, - good = 0, - bad = 0, - tests = id( "qunit-tests" ); - - this.runtime = +new Date() - this.started; - config.stats.all += this.assertions.length; - config.moduleStats.all += this.assertions.length; - - if ( tests ) { - ol = document.createElement( "ol" ); - ol.className = "qunit-assert-list"; - - for ( i = 0; i < this.assertions.length; i++ ) { - assertion = this.assertions[i]; - - li = document.createElement( "li" ); - li.className = assertion.result ? "pass" : "fail"; - li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" ); - ol.appendChild( li ); - - if ( assertion.result ) { - good++; - } else { - bad++; - config.stats.bad++; - config.moduleStats.bad++; - } - } - - // store result when possible - if ( QUnit.config.reorder && defined.sessionStorage ) { - if ( bad ) { - sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad ); - } else { - sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName ); - } - } - - if ( bad === 0 ) { - addClass( ol, "qunit-collapsed" ); - } - - // `b` initialized at top of scope - b = document.createElement( "strong" ); - b.innerHTML = this.nameHtml + " (" + bad + ", " + good + ", " + this.assertions.length + ")"; - - addEvent(b, "click", function() { - var next = b.parentNode.lastChild, - collapsed = hasClass( next, "qunit-collapsed" ); - ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" ); - }); - - addEvent(b, "dblclick", function( e ) { - var target = e && e.target ? e.target : window.event.srcElement; - if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) { - target = target.parentNode; - } - if ( window.location && target.nodeName.toLowerCase() === "strong" ) { - window.location = QUnit.url({ testNumber: test.testNumber }); - } - }); - - // `time` initialized at top of scope - time = document.createElement( "span" ); - time.className = "runtime"; - time.innerHTML = this.runtime + " ms"; - - // `li` initialized at top of scope - li = id( this.id ); - li.className = bad ? "fail" : "pass"; - li.removeChild( li.firstChild ); - a = li.firstChild; - li.appendChild( b ); - li.appendChild( a ); - li.appendChild( time ); - li.appendChild( ol ); - - } else { - for ( i = 0; i < this.assertions.length; i++ ) { - if ( !this.assertions[i].result ) { - bad++; - config.stats.bad++; - config.moduleStats.bad++; - } - } - } - - runLoggingCallbacks( "testDone", QUnit, { - name: this.testName, - module: this.module, - failed: bad, - passed: this.assertions.length - bad, - total: this.assertions.length, - duration: this.runtime - }); - - QUnit.reset(); - - config.current = undefined; - }, - - queue: function() { - var bad, - test = this; - - synchronize(function() { - test.init(); - }); - function run() { - // each of these can by async - synchronize(function() { - test.setup(); - }); - synchronize(function() { - test.run(); - }); - synchronize(function() { - test.teardown(); - }); - synchronize(function() { - test.finish(); - }); - } - - // `bad` initialized at top of scope - // defer when previous test run passed, if storage is available - bad = QUnit.config.reorder && defined.sessionStorage && - +sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName ); - - if ( bad ) { - run(); - } else { - synchronize( run, true ); - } - } -}; - -// Root QUnit object. -// `QUnit` initialized at top of scope -QUnit = { - - // call on start of module test to prepend name to all tests - module: function( name, testEnvironment ) { - config.currentModule = name; - config.currentModuleTestEnvironment = testEnvironment; - config.modules[name] = true; - }, - - asyncTest: function( testName, expected, callback ) { - if ( arguments.length === 2 ) { - callback = expected; - expected = null; - } - - QUnit.test( testName, expected, callback, true ); - }, - - test: function( testName, expected, callback, async ) { - var test, - nameHtml = "" + escapeText( testName ) + ""; - - if ( arguments.length === 2 ) { - callback = expected; - expected = null; - } - - if ( config.currentModule ) { - nameHtml = "" + escapeText( config.currentModule ) + ": " + nameHtml; - } - - test = new Test({ - nameHtml: nameHtml, - testName: testName, - expected: expected, - async: async, - callback: callback, - module: config.currentModule, - moduleTestEnvironment: config.currentModuleTestEnvironment, - stack: sourceFromStacktrace( 2 ) - }); - - if ( !validTest( test ) ) { - return; - } - - test.queue(); - }, - - // Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through. - expect: function( asserts ) { - if (arguments.length === 1) { - config.current.expected = asserts; - } else { - return config.current.expected; - } - }, - - start: function( count ) { - // QUnit hasn't been initialized yet. - // Note: RequireJS (et al) may delay onLoad - if ( config.semaphore === undefined ) { - QUnit.begin(function() { - // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first - setTimeout(function() { - QUnit.start( count ); - }); - }); - return; - } - - config.semaphore -= count || 1; - // don't start until equal number of stop-calls - if ( config.semaphore > 0 ) { - return; - } - // ignore if start is called more often then stop - if ( config.semaphore < 0 ) { - config.semaphore = 0; - QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) ); - return; - } - // A slight delay, to avoid any current callbacks - if ( defined.setTimeout ) { - setTimeout(function() { - if ( config.semaphore > 0 ) { - return; - } - if ( config.timeout ) { - clearTimeout( config.timeout ); - } - - config.blocking = false; - process( true ); - }, 13); - } else { - config.blocking = false; - process( true ); - } - }, - - stop: function( count ) { - config.semaphore += count || 1; - config.blocking = true; - - if ( config.testTimeout && defined.setTimeout ) { - clearTimeout( config.timeout ); - config.timeout = setTimeout(function() { - QUnit.ok( false, "Test timed out" ); - config.semaphore = 1; - QUnit.start(); - }, config.testTimeout ); - } - } -}; - -// `assert` initialized at top of scope -// Assert helpers -// All of these must either call QUnit.push() or manually do: -// - runLoggingCallbacks( "log", .. ); -// - config.current.assertions.push({ .. }); -// We attach it to the QUnit object *after* we expose the public API, -// otherwise `assert` will become a global variable in browsers (#341). -assert = { - /** - * Asserts rough true-ish result. - * @name ok - * @function - * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" ); - */ - ok: function( result, msg ) { - if ( !config.current ) { - throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) ); - } - result = !!result; - msg = msg || (result ? "okay" : "failed" ); - - var source, - details = { - module: config.current.module, - name: config.current.testName, - result: result, - message: msg - }; - - msg = "" + escapeText( msg ) + ""; - - if ( !result ) { - source = sourceFromStacktrace( 2 ); - if ( source ) { - details.source = source; - msg += "
    Source:
    " + escapeText( source ) + "
    "; - } - } - runLoggingCallbacks( "log", QUnit, details ); - config.current.assertions.push({ - result: result, - message: msg - }); - }, - - /** - * Assert that the first two arguments are equal, with an optional message. - * Prints out both actual and expected values. - * @name equal - * @function - * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" ); - */ - equal: function( actual, expected, message ) { - /*jshint eqeqeq:false */ - QUnit.push( expected == actual, actual, expected, message ); - }, - - /** - * @name notEqual - * @function - */ - notEqual: function( actual, expected, message ) { - /*jshint eqeqeq:false */ - QUnit.push( expected != actual, actual, expected, message ); - }, - - /** - * @name propEqual - * @function - */ - propEqual: function( actual, expected, message ) { - actual = objectValues(actual); - expected = objectValues(expected); - QUnit.push( QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name notPropEqual - * @function - */ - notPropEqual: function( actual, expected, message ) { - actual = objectValues(actual); - expected = objectValues(expected); - QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name deepEqual - * @function - */ - deepEqual: function( actual, expected, message ) { - QUnit.push( QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name notDeepEqual - * @function - */ - notDeepEqual: function( actual, expected, message ) { - QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name strictEqual - * @function - */ - strictEqual: function( actual, expected, message ) { - QUnit.push( expected === actual, actual, expected, message ); - }, - - /** - * @name notStrictEqual - * @function - */ - notStrictEqual: function( actual, expected, message ) { - QUnit.push( expected !== actual, actual, expected, message ); - }, - - "throws": function( block, expected, message ) { - var actual, - expectedOutput = expected, - ok = false; - - // 'expected' is optional - if ( typeof expected === "string" ) { - message = expected; - expected = null; - } - - config.current.ignoreGlobalErrors = true; - try { - block.call( config.current.testEnvironment ); - } catch (e) { - actual = e; - } - config.current.ignoreGlobalErrors = false; - - if ( actual ) { - // we don't want to validate thrown error - if ( !expected ) { - ok = true; - expectedOutput = null; - // expected is a regexp - } else if ( QUnit.objectType( expected ) === "regexp" ) { - ok = expected.test( errorString( actual ) ); - // expected is a constructor - } else if ( actual instanceof expected ) { - ok = true; - // expected is a validation function which returns true is validation passed - } else if ( expected.call( {}, actual ) === true ) { - expectedOutput = null; - ok = true; - } - - QUnit.push( ok, actual, expectedOutput, message ); - } else { - QUnit.pushFailure( message, null, "No exception was thrown." ); - } - } -}; - -/** - * @deprecated since 1.8.0 - * Kept assertion helpers in root for backwards compatibility. - */ -extend( QUnit, assert ); - -/** - * @deprecated since 1.9.0 - * Kept root "raises()" for backwards compatibility. - * (Note that we don't introduce assert.raises). - */ -QUnit.raises = assert[ "throws" ]; - -/** - * @deprecated since 1.0.0, replaced with error pushes since 1.3.0 - * Kept to avoid TypeErrors for undefined methods. - */ -QUnit.equals = function() { - QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" ); -}; -QUnit.same = function() { - QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" ); -}; - -// We want access to the constructor's prototype -(function() { - function F() {} - F.prototype = QUnit; - QUnit = new F(); - // Make F QUnit's constructor so that we can add to the prototype later - QUnit.constructor = F; -}()); +QUnit = {}; /** * Config object: Maintain internal state @@ -705,10 +103,6 @@ config = { // block until document ready blocking: true, - // when enabled, show only failing tests - // gets persisted through sessionStorage and can be changed in UI via checkbox - hidepassed: false, - // by default, run previously failed tests first // very useful in combination with "Hide passed tests" checked reorder: true, @@ -716,165 +110,233 @@ config = { // by default, modify document.title when suite is done altertitle: true, + // by default, scroll to top of the page when suite is done + scrolltop: true, + // when enabled, all tests must call expect() requireExpects: false, + // depth up-to which object will be dumped + maxDepth: 5, + // add checkboxes that are persisted in the query-string // when enabled, the id is set to `true` as a `QUnit.config` property urlConfig: [ + { + id: "hidepassed", + label: "Hide passed tests", + tooltip: "Only show tests and assertions that fail. Stored as query-strings." + }, { id: "noglobals", label: "Check for Globals", - tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings." + tooltip: "Enabling this will test if any test introduces new properties on the " + + "`window` object. Stored as query-strings." }, { id: "notrycatch", label: "No try-catch", - tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings." + tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging " + + "exceptions in IE reasonable. Stored as query-strings." } ], // Set of all modules. - modules: {}, + modules: [], - // logging callback queues - begin: [], - done: [], - log: [], - testStart: [], - testDone: [], - moduleStart: [], - moduleDone: [] + // The first unnamed module + currentModule: { + name: "", + tests: [] + }, + + callbacks: {} }; -// Export global variables, unless an 'exports' object exists, -// in that case we assume we're in CommonJS (dealt with on the bottom of the script) -if ( typeof exports === "undefined" ) { - extend( window, QUnit.constructor.prototype ); - - // Expose QUnit object - window.QUnit = QUnit; -} +// Push a loose unnamed module to the modules collection +config.modules.push( config.currentModule ); // Initialize more QUnit.config and QUnit.urlParams (function() { - var i, + var i, current, location = window.location || { search: "", protocol: "file:" }, params = location.search.slice( 1 ).split( "&" ), length = params.length, - urlParams = {}, - current; + urlParams = {}; if ( params[ 0 ] ) { for ( i = 0; i < length; i++ ) { current = params[ i ].split( "=" ); current[ 0 ] = decodeURIComponent( current[ 0 ] ); + // allow just a key to turn on a flag, e.g., test.html?noglobals current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true; - urlParams[ current[ 0 ] ] = current[ 1 ]; + if ( urlParams[ current[ 0 ] ] ) { + urlParams[ current[ 0 ] ] = [].concat( urlParams[ current[ 0 ] ], current[ 1 ] ); + } else { + urlParams[ current[ 0 ] ] = current[ 1 ]; + } } } + if ( urlParams.filter === true ) { + delete urlParams.filter; + } + QUnit.urlParams = urlParams; // String search anywhere in moduleName+testName config.filter = urlParams.filter; - // Exact match of the module name - config.module = urlParams.module; + if ( urlParams.maxDepth ) { + config.maxDepth = parseInt( urlParams.maxDepth, 10 ) === -1 ? + Number.POSITIVE_INFINITY : + urlParams.maxDepth; + } - config.testNumber = parseInt( urlParams.testNumber, 10 ) || null; + config.testId = []; + if ( urlParams.testId ) { + + // Ensure that urlParams.testId is an array + urlParams.testId = decodeURIComponent( urlParams.testId ).split( "," ); + for ( i = 0; i < urlParams.testId.length; i++ ) { + config.testId.push( urlParams.testId[ i ] ); + } + } // Figure out if we're running the tests from a server or not QUnit.isLocal = location.protocol === "file:"; + + // Expose the current QUnit version + QUnit.version = "1.18.0"; }()); -// Extend QUnit object, -// these after set here because they should not be exposed as global functions +// Root QUnit object. +// `QUnit` initialized at top of scope extend( QUnit, { - assert: assert, - config: config, + // call on start of module test to prepend name to all tests + module: function( name, testEnvironment ) { + var currentModule = { + name: name, + testEnvironment: testEnvironment, + tests: [] + }; - // Initialize the configuration options - init: function() { - extend( config, { - stats: { all: 0, bad: 0 }, - moduleStats: { all: 0, bad: 0 }, - started: +new Date(), - updateRate: 1000, - blocking: false, - autostart: true, - autorun: false, - filter: "", - queue: [], - semaphore: 1 + // DEPRECATED: handles setup/teardown functions, + // beforeEach and afterEach should be used instead + if ( testEnvironment && testEnvironment.setup ) { + testEnvironment.beforeEach = testEnvironment.setup; + delete testEnvironment.setup; + } + if ( testEnvironment && testEnvironment.teardown ) { + testEnvironment.afterEach = testEnvironment.teardown; + delete testEnvironment.teardown; + } + + config.modules.push( currentModule ); + config.currentModule = currentModule; + }, + + // DEPRECATED: QUnit.asyncTest() will be removed in QUnit 2.0. + asyncTest: function( testName, expected, callback ) { + if ( arguments.length === 2 ) { + callback = expected; + expected = null; + } + + QUnit.test( testName, expected, callback, true ); + }, + + test: function( testName, expected, callback, async ) { + var test; + + if ( arguments.length === 2 ) { + callback = expected; + expected = null; + } + + test = new Test({ + testName: testName, + expected: expected, + async: async, + callback: callback }); - var tests, banner, result, - qunit = id( "qunit" ); - - if ( qunit ) { - qunit.innerHTML = - "

    " + escapeText( document.title ) + "

    " + - "

    " + - "
    " + - "

    " + - "
      "; - } - - tests = id( "qunit-tests" ); - banner = id( "qunit-banner" ); - result = id( "qunit-testresult" ); - - if ( tests ) { - tests.innerHTML = ""; - } - - if ( banner ) { - banner.className = ""; - } - - if ( result ) { - result.parentNode.removeChild( result ); - } - - if ( tests ) { - result = document.createElement( "p" ); - result.id = "qunit-testresult"; - result.className = "result"; - tests.parentNode.insertBefore( result, tests ); - result.innerHTML = "Running...
       "; - } + test.queue(); }, - // Resets the test setup. Useful for tests that modify the DOM. - /* - DEPRECATED: Use multiple tests instead of resetting inside a test. - Use testStart or testDone for custom cleanup. - This method will throw an error in 2.0, and will be removed in 2.1 - */ - reset: function() { - var fixture = id( "qunit-fixture" ); - if ( fixture ) { - fixture.innerHTML = config.fixture; - } + skip: function( testName ) { + var test = new Test({ + testName: testName, + skip: true + }); + + test.queue(); }, - // Trigger an event on an element. - // @example triggerEvent( document.body, "click" ); - triggerEvent: function( elem, type, event ) { - if ( document.createEvent ) { - event = document.createEvent( "MouseEvents" ); - event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, - 0, 0, 0, 0, 0, false, false, false, false, 0, null); + // DEPRECATED: The functionality of QUnit.start() will be altered in QUnit 2.0. + // In QUnit 2.0, invoking it will ONLY affect the `QUnit.config.autostart` blocking behavior. + start: function( count ) { + var globalStartAlreadyCalled = globalStartCalled; - elem.dispatchEvent( event ); - } else if ( elem.fireEvent ) { - elem.fireEvent( "on" + type ); + if ( !config.current ) { + globalStartCalled = true; + + if ( runStarted ) { + throw new Error( "Called start() outside of a test context while already started" ); + } else if ( globalStartAlreadyCalled || count > 1 ) { + throw new Error( "Called start() outside of a test context too many times" ); + } else if ( config.autostart ) { + throw new Error( "Called start() outside of a test context when " + + "QUnit.config.autostart was true" ); + } else if ( !config.pageLoaded ) { + + // The page isn't completely loaded yet, so bail out and let `QUnit.load` handle it + config.autostart = true; + return; + } + } else { + + // If a test is running, adjust its semaphore + config.current.semaphore -= count || 1; + + // Don't start until equal number of stop-calls + if ( config.current.semaphore > 0 ) { + return; + } + + // throw an Error if start is called more often than stop + if ( config.current.semaphore < 0 ) { + config.current.semaphore = 0; + + QUnit.pushFailure( + "Called start() while already started (test's semaphore was 0 already)", + sourceFromStacktrace( 2 ) + ); + return; + } } + + resumeProcessing(); }, + // DEPRECATED: QUnit.stop() will be removed in QUnit 2.0. + stop: function( count ) { + + // If there isn't a test running, don't allow QUnit.stop() to be called + if ( !config.current ) { + throw new Error( "Called stop() outside of a test context" ); + } + + // If a test is running, adjust its semaphore + config.current.semaphore += count || 1; + + pauseProcessing(); + }, + + config: config, + // Safe object type checking is: function( type, obj ) { return QUnit.objectType( obj ) === type; @@ -882,19 +344,20 @@ extend( QUnit, { objectType: function( obj ) { if ( typeof obj === "undefined" ) { - return "undefined"; - // consider: typeof null === object - } - if ( obj === null ) { - return "null"; + return "undefined"; } - var match = toString.call( obj ).match(/^\[object\s(.*)\]$/), - type = match && match[1] || ""; + // Consider: typeof null === object + if ( obj === null ) { + return "null"; + } + + var match = toString.call( obj ).match( /^\[object\s(.*)\]$/ ), + type = match && match[ 1 ] || ""; switch ( type ) { case "Number": - if ( isNaN(obj) ) { + if ( isNaN( obj ) ) { return "nan"; } return "number"; @@ -912,308 +375,65 @@ extend( QUnit, { return undefined; }, - push: function( result, actual, expected, message ) { - if ( !config.current ) { - throw new Error( "assertion outside test context, was " + sourceFromStacktrace() ); - } - - var output, source, - details = { - module: config.current.module, - name: config.current.testName, - result: result, - message: message, - actual: actual, - expected: expected - }; - - message = escapeText( message ) || ( result ? "okay" : "failed" ); - message = "" + message + ""; - output = message; - - if ( !result ) { - expected = escapeText( QUnit.jsDump.parse(expected) ); - actual = escapeText( QUnit.jsDump.parse(actual) ); - output += ""; - - if ( actual !== expected ) { - output += ""; - output += ""; - } - - source = sourceFromStacktrace(); - - if ( source ) { - details.source = source; - output += ""; - } - - output += "
      Expected:
      " + expected + "
      Result:
      " + actual + "
      Diff:
      " + QUnit.diff( expected, actual ) + "
      Source:
      " + escapeText( source ) + "
      "; - } - - runLoggingCallbacks( "log", QUnit, details ); - - config.current.assertions.push({ - result: !!result, - message: output - }); - }, - - pushFailure: function( message, source, actual ) { - if ( !config.current ) { - throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) ); - } - - var output, - details = { - module: config.current.module, - name: config.current.testName, - result: false, - message: message - }; - - message = escapeText( message ) || "error"; - message = "" + message + ""; - output = message; - - output += ""; - - if ( actual ) { - output += ""; - } - - if ( source ) { - details.source = source; - output += ""; - } - - output += "
      Result:
      " + escapeText( actual ) + "
      Source:
      " + escapeText( source ) + "
      "; - - runLoggingCallbacks( "log", QUnit, details ); - - config.current.assertions.push({ - result: false, - message: output - }); - }, - - url: function( params ) { - params = extend( extend( {}, QUnit.urlParams ), params ); - var key, - querystring = "?"; - - for ( key in params ) { - if ( hasOwn.call( params, key ) ) { - querystring += encodeURIComponent( key ) + "=" + - encodeURIComponent( params[ key ] ) + "&"; - } - } - return window.location.protocol + "//" + window.location.host + - window.location.pathname + querystring.slice( 0, -1 ); - }, - extend: extend, - id: id, - addEvent: addEvent, - addClass: addClass, - hasClass: hasClass, - removeClass: removeClass - // load, equiv, jsDump, diff: Attached later + + load: function() { + config.pageLoaded = true; + + // Initialize the configuration options + extend( config, { + stats: { all: 0, bad: 0 }, + moduleStats: { all: 0, bad: 0 }, + started: 0, + updateRate: 1000, + autostart: true, + filter: "" + }, true ); + + config.blocking = false; + + if ( config.autostart ) { + resumeProcessing(); + } + } }); -/** - * @deprecated: Created for backwards compatibility with test runner that set the hook function - * into QUnit.{hook}, instead of invoking it and passing the hook function. - * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here. - * Doing this allows us to tell if the following methods have been overwritten on the actual - * QUnit object. - */ -extend( QUnit.constructor.prototype, { +// Register logging callbacks +(function() { + var i, l, key, + callbacks = [ "begin", "done", "log", "testStart", "testDone", + "moduleStart", "moduleDone" ]; - // Logging callbacks; all receive a single argument with the listed properties - // run test/logs.html for any related changes - begin: registerLoggingCallback( "begin" ), - - // done: { failed, passed, total, runtime } - done: registerLoggingCallback( "done" ), - - // log: { result, actual, expected, message } - log: registerLoggingCallback( "log" ), - - // testStart: { name } - testStart: registerLoggingCallback( "testStart" ), - - // testDone: { name, failed, passed, total, duration } - testDone: registerLoggingCallback( "testDone" ), - - // moduleStart: { name } - moduleStart: registerLoggingCallback( "moduleStart" ), - - // moduleDone: { name, failed, passed, total } - moduleDone: registerLoggingCallback( "moduleDone" ) -}); - -if ( typeof document === "undefined" || document.readyState === "complete" ) { - config.autorun = true; -} - -QUnit.load = function() { - runLoggingCallbacks( "begin", QUnit, {} ); - - // Initialize the config, saving the execution queue - var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, - urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter, - numModules = 0, - moduleNames = [], - moduleFilterHtml = "", - urlConfigHtml = "", - oldconfig = extend( {}, config ); - - QUnit.init(); - extend(config, oldconfig); - - config.blocking = false; - - len = config.urlConfig.length; - - for ( i = 0; i < len; i++ ) { - val = config.urlConfig[i]; - if ( typeof val === "string" ) { - val = { - id: val, - label: val, - tooltip: "[no tooltip available]" - }; - } - config[ val.id ] = QUnit.urlParams[ val.id ]; - urlConfigHtml += ""; - } - for ( i in config.modules ) { - if ( config.modules.hasOwnProperty( i ) ) { - moduleNames.push(i); - } - } - numModules = moduleNames.length; - moduleNames.sort( function( a, b ) { - return a.localeCompare( b ); - }); - moduleFilterHtml += ""; - - // `userAgent` initialized at top of scope - userAgent = id( "qunit-userAgent" ); - if ( userAgent ) { - userAgent.innerHTML = navigator.userAgent; - } - - // `banner` initialized at top of scope - banner = id( "qunit-header" ); - if ( banner ) { - banner.innerHTML = "" + banner.innerHTML + " "; - } - - // `toolbar` initialized at top of scope - toolbar = id( "qunit-testrunner-toolbar" ); - if ( toolbar ) { - // `filter` initialized at top of scope - filter = document.createElement( "input" ); - filter.type = "checkbox"; - filter.id = "qunit-filter-pass"; - - addEvent( filter, "click", function() { - var tmp, - ol = document.getElementById( "qunit-tests" ); - - if ( filter.checked ) { - ol.className = ol.className + " hidepass"; - } else { - tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " "; - ol.className = tmp.replace( / hidepass /, " " ); + function registerLoggingCallback( key ) { + var loggingCallback = function( callback ) { + if ( QUnit.objectType( callback ) !== "function" ) { + throw new Error( + "QUnit logging methods require a callback function as their first parameters." + ); } - if ( defined.sessionStorage ) { - if (filter.checked) { - sessionStorage.setItem( "qunit-filter-passed-tests", "true" ); - } else { - sessionStorage.removeItem( "qunit-filter-passed-tests" ); - } - } - }); - if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) { - filter.checked = true; - // `ol` initialized at top of scope - ol = document.getElementById( "qunit-tests" ); - ol.className = ol.className + " hidepass"; + config.callbacks[ key ].push( callback ); + }; + + // DEPRECATED: This will be removed on QUnit 2.0.0+ + // Stores the registered functions allowing restoring + // at verifyLoggingCallbacks() if modified + loggingCallbacks[ key ] = loggingCallback; + + return loggingCallback; + } + + for ( i = 0, l = callbacks.length; i < l; i++ ) { + key = callbacks[ i ]; + + // Initialize key collection of logging callback + if ( QUnit.objectType( config.callbacks[ key ] ) === "undefined" ) { + config.callbacks[ key ] = []; } - toolbar.appendChild( filter ); - // `label` initialized at top of scope - label = document.createElement( "label" ); - label.setAttribute( "for", "qunit-filter-pass" ); - label.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." ); - label.innerHTML = "Hide passed tests"; - toolbar.appendChild( label ); - - urlConfigCheckboxesContainer = document.createElement("span"); - urlConfigCheckboxesContainer.innerHTML = urlConfigHtml; - urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input"); - // For oldIE support: - // * Add handlers to the individual elements instead of the container - // * Use "click" instead of "change" - // * Fallback from event.target to event.srcElement - addEvents( urlConfigCheckboxes, "click", function( event ) { - var params = {}, - target = event.target || event.srcElement; - params[ target.name ] = target.checked ? true : undefined; - window.location = QUnit.url( params ); - }); - toolbar.appendChild( urlConfigCheckboxesContainer ); - - if (numModules > 1) { - moduleFilter = document.createElement( "span" ); - moduleFilter.setAttribute( "id", "qunit-modulefilter-container" ); - moduleFilter.innerHTML = moduleFilterHtml; - addEvent( moduleFilter.lastChild, "change", function() { - var selectBox = moduleFilter.getElementsByTagName("select")[0], - selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value); - - window.location = QUnit.url({ - module: ( selectedModule === "" ) ? undefined : selectedModule, - // Remove any existing filters - filter: undefined, - testNumber: undefined - }); - }); - toolbar.appendChild(moduleFilter); - } + QUnit[ key ] = registerLoggingCallback( key ); } - - // `main` initialized at top of scope - main = id( "qunit-fixture" ); - if ( main ) { - config.fixture = main.innerHTML; - } - - if ( config.autostart ) { - QUnit.start(); - } -}; - -addEvent( window, "load", QUnit.load ); +})(); // `onErrorFnPrev` initialized at top of scope // Preserve other handlers @@ -1222,7 +442,7 @@ onErrorFnPrev = window.onerror; // Cover uncaught exceptions // Returning true will suppress the default browser handler, // returning false will let it run. -window.onerror = function ( error, filePath, linerNr ) { +window.onerror = function( error, filePath, linerNr ) { var ret = false; if ( onErrorFnPrev ) { ret = onErrorFnPrev( error, filePath, linerNr ); @@ -1237,9 +457,9 @@ window.onerror = function ( error, filePath, linerNr ) { } QUnit.pushFailure( error, filePath + ":" + linerNr ); } else { - QUnit.test( "global failure", extend( function() { + QUnit.test( "global failure", extend(function() { QUnit.pushFailure( error, filePath + ":" + linerNr ); - }, { validTest: validTest } ) ); + }, { validTest: true } ) ); } return false; } @@ -1248,71 +468,27 @@ window.onerror = function ( error, filePath, linerNr ) { }; function done() { + var runtime, passed; + config.autorun = true; // Log the last module results - if ( config.currentModule ) { - runLoggingCallbacks( "moduleDone", QUnit, { - name: config.currentModule, + if ( config.previousModule ) { + runLoggingCallbacks( "moduleDone", { + name: config.previousModule.name, + tests: config.previousModule.tests, failed: config.moduleStats.bad, passed: config.moduleStats.all - config.moduleStats.bad, - total: config.moduleStats.all + total: config.moduleStats.all, + runtime: now() - config.moduleStats.started }); } delete config.previousModule; - var i, key, - banner = id( "qunit-banner" ), - tests = id( "qunit-tests" ), - runtime = +new Date() - config.started, - passed = config.stats.all - config.stats.bad, - html = [ - "Tests completed in ", - runtime, - " milliseconds.
      ", - "", - passed, - " assertions of ", - config.stats.all, - " passed, ", - config.stats.bad, - " failed." - ].join( "" ); + runtime = now() - config.started; + passed = config.stats.all - config.stats.bad; - if ( banner ) { - banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" ); - } - - if ( tests ) { - id( "qunit-testresult" ).innerHTML = html; - } - - if ( config.altertitle && typeof document !== "undefined" && document.title ) { - // show ✖ for good, ✔ for bad suite result in title - // use escape sequences in case file gets loaded with non-utf-8-charset - document.title = [ - ( config.stats.bad ? "\u2716" : "\u2714" ), - document.title.replace( /^[\u2714\u2716] /i, "" ) - ].join( " " ); - } - - // clear own sessionStorage items if all tests passed - if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) { - // `key` & `i` initialized at top of scope - for ( i = 0; i < sessionStorage.length; i++ ) { - key = sessionStorage.key( i++ ); - if ( key.indexOf( "qunit-test-" ) === 0 ) { - sessionStorage.removeItem( key ); - } - } - } - - // scroll back to top to show results - if ( window.scrollTo ) { - window.scrollTo(0, 0); - } - - runLoggingCallbacks( "done", QUnit, { + runLoggingCallbacks( "done", { failed: config.stats.bad, passed: passed, total: config.stats.all, @@ -1320,60 +496,16 @@ function done() { }); } -/** @return Boolean: true if this test should be ran */ -function validTest( test ) { - var include, - filter = config.filter && config.filter.toLowerCase(), - module = config.module && config.module.toLowerCase(), - fullName = (test.module + ": " + test.testName).toLowerCase(); - - // Internally-generated tests are always valid - if ( test.callback && test.callback.validTest === validTest ) { - delete test.callback.validTest; - return true; - } - - if ( config.testNumber ) { - return test.testNumber === config.testNumber; - } - - if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) { - return false; - } - - if ( !filter ) { - return true; - } - - include = filter.charAt( 0 ) !== "!"; - if ( !include ) { - filter = filter.slice( 1 ); - } - - // If the filter matches, we need to honour include - if ( fullName.indexOf( filter ) !== -1 ) { - return include; - } - - // Otherwise, do the opposite - return !include; -} - -// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions) -// Later Safari and IE10 are supposed to support error.stack as well +// Doesn't support IE6 to IE9, it will return undefined on these browsers // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack function extractStacktrace( e, offset ) { - offset = offset === undefined ? 3 : offset; + offset = offset === undefined ? 4 : offset; var stack, include, i; - if ( e.stacktrace ) { - // Opera - return e.stacktrace.split( "\n" )[ offset + 3 ]; - } else if ( e.stack ) { - // Firefox, Chrome + if ( e.stack ) { stack = e.stack.split( "\n" ); - if (/^error$/i.test( stack[0] ) ) { + if ( /^error$/i.test( stack[ 0 ] ) ) { stack.shift(); } if ( fileName ) { @@ -1389,51 +521,43 @@ function extractStacktrace( e, offset ) { } } return stack[ offset ]; + + // Support: Safari <=6 only } else if ( e.sourceURL ) { - // Safari, PhantomJS - // hopefully one day Safari provides actual stacktraces + // exclude useless self-reference for generated Error objects if ( /qunit.js$/.test( e.sourceURL ) ) { return; } + // for actual exceptions, this is useful return e.sourceURL + ":" + e.line; } } -function sourceFromStacktrace( offset ) { - try { - throw new Error(); - } catch ( e ) { - return extractStacktrace( e, offset ); - } -} -/** - * Escape text for attribute or text content. - */ -function escapeText( s ) { - if ( !s ) { - return ""; - } - s = s + ""; - // Both single quotes and double quotes (for attributes) - return s.replace( /['"<>&]/g, function( s ) { - switch( s ) { - case "'": - return "'"; - case "\"": - return """; - case "<": - return "<"; - case ">": - return ">"; - case "&": - return "&"; +function sourceFromStacktrace( offset ) { + var error = new Error(); + + // Support: Safari <=7 only, IE <=10 - 11 only + // Not all browsers generate the `stack` property for `new Error()`, see also #636 + if ( !error.stack ) { + try { + throw error; + } catch ( err ) { + error = err; } - }); + } + + return extractStacktrace( error, offset ); } function synchronize( callback, last ) { + if ( QUnit.objectType( callback ) === "array" ) { + while ( callback.length ) { + synchronize( callback.shift() ); + } + return; + } config.queue.push( callback ); if ( config.autorun && !config.blocking ) { @@ -1445,11 +569,17 @@ function process( last ) { function next() { process( last ); } - var start = new Date().getTime(); - config.depth = config.depth ? config.depth + 1 : 1; + var start = now(); + config.depth = ( config.depth || 0 ) + 1; while ( config.queue.length && !config.blocking ) { - if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) { + if ( !defined.setTimeout || config.updateRate <= 0 || + ( ( now() - start ) < config.updateRate ) ) { + if ( config.current ) { + + // Reset async tracking for each phase of the Test lifecycle + config.current.usedAsync = false; + } config.queue.shift()(); } else { setTimeout( next, 13 ); @@ -1462,6 +592,79 @@ function process( last ) { } } +function begin() { + var i, l, + modulesLog = []; + + // If the test run hasn't officially begun yet + if ( !config.started ) { + + // Record the time of the test run's beginning + config.started = now(); + + verifyLoggingCallbacks(); + + // Delete the loose unnamed module if unused. + if ( config.modules[ 0 ].name === "" && config.modules[ 0 ].tests.length === 0 ) { + config.modules.shift(); + } + + // Avoid unnecessary information by not logging modules' test environments + for ( i = 0, l = config.modules.length; i < l; i++ ) { + modulesLog.push({ + name: config.modules[ i ].name, + tests: config.modules[ i ].tests + }); + } + + // The test run is officially beginning now + runLoggingCallbacks( "begin", { + totalTests: Test.count, + modules: modulesLog + }); + } + + config.blocking = false; + process( true ); +} + +function resumeProcessing() { + runStarted = true; + + // A slight delay to allow this iteration of the event loop to finish (more assertions, etc.) + if ( defined.setTimeout ) { + setTimeout(function() { + if ( config.current && config.current.semaphore > 0 ) { + return; + } + if ( config.timeout ) { + clearTimeout( config.timeout ); + } + + begin(); + }, 13 ); + } else { + begin(); + } +} + +function pauseProcessing() { + config.blocking = true; + + if ( config.testTimeout && defined.setTimeout ) { + clearTimeout( config.timeout ); + config.timeout = setTimeout(function() { + if ( config.current ) { + config.current.semaphore = 0; + QUnit.pushFailure( "Test timed out", sourceFromStacktrace( 2 ) ); + } else { + throw new Error( "Test timed out" ); + } + resumeProcessing(); + }, config.testTimeout ); + } +} + function saveGlobal() { config.pollution = []; @@ -1487,12 +690,12 @@ function checkPollution() { newGlobals = diff( config.pollution, old ); if ( newGlobals.length > 0 ) { - QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") ); + QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join( ", " ) ); } deletedGlobals = diff( old, config.pollution ); if ( deletedGlobals.length > 0 ) { - QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") ); + QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join( ", " ) ); } } @@ -1503,7 +706,7 @@ function diff( a, b ) { for ( i = 0; i < result.length; i++ ) { for ( j = 0; j < b.length; j++ ) { - if ( result[i] === b[j] ) { + if ( result[ i ] === b[ j ] ) { result.splice( i, 1 ); i--; break; @@ -1513,14 +716,15 @@ function diff( a, b ) { return result; } -function extend( a, b ) { +function extend( a, b, undefOnly ) { for ( var prop in b ) { if ( hasOwn.call( b, prop ) ) { + // Avoid "Member not found" error in IE8 caused by messing with window.constructor if ( !( prop === "constructor" && a === window ) ) { if ( b[ prop ] === undefined ) { delete a[ prop ]; - } else { + } else if ( !( undefOnly && typeof a[ prop ] !== "undefined" ) ) { a[ prop ] = b[ prop ]; } } @@ -1530,77 +734,680 @@ function extend( a, b ) { return a; } -/** - * @param {HTMLElement} elem - * @param {string} type - * @param {Function} fn - */ -function addEvent( elem, type, fn ) { - // Standards-based browsers - if ( elem.addEventListener ) { - elem.addEventListener( type, fn, false ); - // IE - } else { - elem.attachEvent( "on" + type, fn ); +function runLoggingCallbacks( key, args ) { + var i, l, callbacks; + + callbacks = config.callbacks[ key ]; + for ( i = 0, l = callbacks.length; i < l; i++ ) { + callbacks[ i ]( args ); } } -/** - * @param {Array|NodeList} elems - * @param {string} type - * @param {Function} fn - */ -function addEvents( elems, type, fn ) { - var i = elems.length; - while ( i-- ) { - addEvent( elems[i], type, fn ); - } -} +// DEPRECATED: This will be removed on 2.0.0+ +// This function verifies if the loggingCallbacks were modified by the user +// If so, it will restore it, assign the given callback and print a console warning +function verifyLoggingCallbacks() { + var loggingCallback, userCallback; -function hasClass( elem, name ) { - return (" " + elem.className + " ").indexOf(" " + name + " ") > -1; -} + for ( loggingCallback in loggingCallbacks ) { + if ( QUnit[ loggingCallback ] !== loggingCallbacks[ loggingCallback ] ) { -function addClass( elem, name ) { - if ( !hasClass( elem, name ) ) { - elem.className += (elem.className ? " " : "") + name; - } -} + userCallback = QUnit[ loggingCallback ]; -function removeClass( elem, name ) { - var set = " " + elem.className + " "; - // Class name may appear multiple times - while ( set.indexOf(" " + name + " ") > -1 ) { - set = set.replace(" " + name + " " , " "); - } - // If possible, trim it for prettiness, but not necessarily - elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, ""); -} + // Restore the callback function + QUnit[ loggingCallback ] = loggingCallbacks[ loggingCallback ]; -function id( name ) { - return !!( typeof document !== "undefined" && document && document.getElementById ) && - document.getElementById( name ); -} + // Assign the deprecated given callback + QUnit[ loggingCallback ]( userCallback ); -function registerLoggingCallback( key ) { - return function( callback ) { - config[key].push( callback ); - }; -} - -// Supports deprecated method of completely overwriting logging callbacks -function runLoggingCallbacks( key, scope, args ) { - var i, callbacks; - if ( QUnit.hasOwnProperty( key ) ) { - QUnit[ key ].call(scope, args ); - } else { - callbacks = config[ key ]; - for ( i = 0; i < callbacks.length; i++ ) { - callbacks[ i ].call( scope, args ); + if ( window.console && window.console.warn ) { + window.console.warn( + "QUnit." + loggingCallback + " was replaced with a new value.\n" + + "Please, check out the documentation on how to apply logging callbacks.\n" + + "Reference: http://api.qunitjs.com/category/callbacks/" + ); + } } } } +// from jquery.js +function inArray( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; +} + +function Test( settings ) { + var i, l; + + ++Test.count; + + extend( this, settings ); + this.assertions = []; + this.semaphore = 0; + this.usedAsync = false; + this.module = config.currentModule; + this.stack = sourceFromStacktrace( 3 ); + + // Register unique strings + for ( i = 0, l = this.module.tests; i < l.length; i++ ) { + if ( this.module.tests[ i ].name === this.testName ) { + this.testName += " "; + } + } + + this.testId = generateHash( this.module.name, this.testName ); + + this.module.tests.push({ + name: this.testName, + testId: this.testId + }); + + if ( settings.skip ) { + + // Skipped tests will fully ignore any sent callback + this.callback = function() {}; + this.async = false; + this.expected = 0; + } else { + this.assert = new Assert( this ); + } +} + +Test.count = 0; + +Test.prototype = { + before: function() { + if ( + + // Emit moduleStart when we're switching from one module to another + this.module !== config.previousModule || + + // They could be equal (both undefined) but if the previousModule property doesn't + // yet exist it means this is the first test in a suite that isn't wrapped in a + // module, in which case we'll just emit a moduleStart event for 'undefined'. + // Without this, reporters can get testStart before moduleStart which is a problem. + !hasOwn.call( config, "previousModule" ) + ) { + if ( hasOwn.call( config, "previousModule" ) ) { + runLoggingCallbacks( "moduleDone", { + name: config.previousModule.name, + tests: config.previousModule.tests, + failed: config.moduleStats.bad, + passed: config.moduleStats.all - config.moduleStats.bad, + total: config.moduleStats.all, + runtime: now() - config.moduleStats.started + }); + } + config.previousModule = this.module; + config.moduleStats = { all: 0, bad: 0, started: now() }; + runLoggingCallbacks( "moduleStart", { + name: this.module.name, + tests: this.module.tests + }); + } + + config.current = this; + + this.testEnvironment = extend( {}, this.module.testEnvironment ); + delete this.testEnvironment.beforeEach; + delete this.testEnvironment.afterEach; + + this.started = now(); + runLoggingCallbacks( "testStart", { + name: this.testName, + module: this.module.name, + testId: this.testId + }); + + if ( !config.pollution ) { + saveGlobal(); + } + }, + + run: function() { + var promise; + + config.current = this; + + if ( this.async ) { + QUnit.stop(); + } + + this.callbackStarted = now(); + + if ( config.notrycatch ) { + promise = this.callback.call( this.testEnvironment, this.assert ); + this.resolvePromise( promise ); + return; + } + + try { + promise = this.callback.call( this.testEnvironment, this.assert ); + this.resolvePromise( promise ); + } catch ( e ) { + this.pushFailure( "Died on test #" + ( this.assertions.length + 1 ) + " " + + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) ); + + // else next test will carry the responsibility + saveGlobal(); + + // Restart the tests if they're blocking + if ( config.blocking ) { + QUnit.start(); + } + } + }, + + after: function() { + checkPollution(); + }, + + queueHook: function( hook, hookName ) { + var promise, + test = this; + return function runHook() { + config.current = test; + if ( config.notrycatch ) { + promise = hook.call( test.testEnvironment, test.assert ); + test.resolvePromise( promise, hookName ); + return; + } + try { + promise = hook.call( test.testEnvironment, test.assert ); + test.resolvePromise( promise, hookName ); + } catch ( error ) { + test.pushFailure( hookName + " failed on " + test.testName + ": " + + ( error.message || error ), extractStacktrace( error, 0 ) ); + } + }; + }, + + // Currently only used for module level hooks, can be used to add global level ones + hooks: function( handler ) { + var hooks = []; + + // Hooks are ignored on skipped tests + if ( this.skip ) { + return hooks; + } + + if ( this.module.testEnvironment && + QUnit.objectType( this.module.testEnvironment[ handler ] ) === "function" ) { + hooks.push( this.queueHook( this.module.testEnvironment[ handler ], handler ) ); + } + + return hooks; + }, + + finish: function() { + config.current = this; + if ( config.requireExpects && this.expected === null ) { + this.pushFailure( "Expected number of assertions to be defined, but expect() was " + + "not called.", this.stack ); + } else if ( this.expected !== null && this.expected !== this.assertions.length ) { + this.pushFailure( "Expected " + this.expected + " assertions, but " + + this.assertions.length + " were run", this.stack ); + } else if ( this.expected === null && !this.assertions.length ) { + this.pushFailure( "Expected at least one assertion, but none were run - call " + + "expect(0) to accept zero assertions.", this.stack ); + } + + var i, + bad = 0; + + this.runtime = now() - this.started; + config.stats.all += this.assertions.length; + config.moduleStats.all += this.assertions.length; + + for ( i = 0; i < this.assertions.length; i++ ) { + if ( !this.assertions[ i ].result ) { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + + runLoggingCallbacks( "testDone", { + name: this.testName, + module: this.module.name, + skipped: !!this.skip, + failed: bad, + passed: this.assertions.length - bad, + total: this.assertions.length, + runtime: this.runtime, + + // HTML Reporter use + assertions: this.assertions, + testId: this.testId, + + // DEPRECATED: this property will be removed in 2.0.0, use runtime instead + duration: this.runtime + }); + + // QUnit.reset() is deprecated and will be replaced for a new + // fixture reset function on QUnit 2.0/2.1. + // It's still called here for backwards compatibility handling + QUnit.reset(); + + config.current = undefined; + }, + + queue: function() { + var bad, + test = this; + + if ( !this.valid() ) { + return; + } + + function run() { + + // each of these can by async + synchronize([ + function() { + test.before(); + }, + + test.hooks( "beforeEach" ), + + function() { + test.run(); + }, + + test.hooks( "afterEach" ).reverse(), + + function() { + test.after(); + }, + function() { + test.finish(); + } + ]); + } + + // `bad` initialized at top of scope + // defer when previous test run passed, if storage is available + bad = QUnit.config.reorder && defined.sessionStorage && + +sessionStorage.getItem( "qunit-test-" + this.module.name + "-" + this.testName ); + + if ( bad ) { + run(); + } else { + synchronize( run, true ); + } + }, + + push: function( result, actual, expected, message ) { + var source, + details = { + module: this.module.name, + name: this.testName, + result: result, + message: message, + actual: actual, + expected: expected, + testId: this.testId, + runtime: now() - this.started + }; + + if ( !result ) { + source = sourceFromStacktrace(); + + if ( source ) { + details.source = source; + } + } + + runLoggingCallbacks( "log", details ); + + this.assertions.push({ + result: !!result, + message: message + }); + }, + + pushFailure: function( message, source, actual ) { + if ( !this instanceof Test ) { + throw new Error( "pushFailure() assertion outside test context, was " + + sourceFromStacktrace( 2 ) ); + } + + var details = { + module: this.module.name, + name: this.testName, + result: false, + message: message || "error", + actual: actual || null, + testId: this.testId, + runtime: now() - this.started + }; + + if ( source ) { + details.source = source; + } + + runLoggingCallbacks( "log", details ); + + this.assertions.push({ + result: false, + message: message + }); + }, + + resolvePromise: function( promise, phase ) { + var then, message, + test = this; + if ( promise != null ) { + then = promise.then; + if ( QUnit.objectType( then ) === "function" ) { + QUnit.stop(); + then.call( + promise, + QUnit.start, + function( error ) { + message = "Promise rejected " + + ( !phase ? "during" : phase.replace( /Each$/, "" ) ) + + " " + test.testName + ": " + ( error.message || error ); + test.pushFailure( message, extractStacktrace( error, 0 ) ); + + // else next test will carry the responsibility + saveGlobal(); + + // Unblock + QUnit.start(); + } + ); + } + } + }, + + valid: function() { + var include, + filter = config.filter && config.filter.toLowerCase(), + module = QUnit.urlParams.module && QUnit.urlParams.module.toLowerCase(), + fullName = ( this.module.name + ": " + this.testName ).toLowerCase(); + + // Internally-generated tests are always valid + if ( this.callback && this.callback.validTest ) { + return true; + } + + if ( config.testId.length > 0 && inArray( this.testId, config.testId ) < 0 ) { + return false; + } + + if ( module && ( !this.module.name || this.module.name.toLowerCase() !== module ) ) { + return false; + } + + if ( !filter ) { + return true; + } + + include = filter.charAt( 0 ) !== "!"; + if ( !include ) { + filter = filter.slice( 1 ); + } + + // If the filter matches, we need to honour include + if ( fullName.indexOf( filter ) !== -1 ) { + return include; + } + + // Otherwise, do the opposite + return !include; + } + +}; + +// Resets the test setup. Useful for tests that modify the DOM. +/* +DEPRECATED: Use multiple tests instead of resetting inside a test. +Use testStart or testDone for custom cleanup. +This method will throw an error in 2.0, and will be removed in 2.1 +*/ +QUnit.reset = function() { + + // Return on non-browser environments + // This is necessary to not break on node tests + if ( typeof window === "undefined" ) { + return; + } + + var fixture = defined.document && document.getElementById && + document.getElementById( "qunit-fixture" ); + + if ( fixture ) { + fixture.innerHTML = config.fixture; + } +}; + +QUnit.pushFailure = function() { + if ( !QUnit.config.current ) { + throw new Error( "pushFailure() assertion outside test context, in " + + sourceFromStacktrace( 2 ) ); + } + + // Gets current test obj + var currentTest = QUnit.config.current; + + return currentTest.pushFailure.apply( currentTest, arguments ); +}; + +// Based on Java's String.hashCode, a simple but not +// rigorously collision resistant hashing function +function generateHash( module, testName ) { + var hex, + i = 0, + hash = 0, + str = module + "\x1C" + testName, + len = str.length; + + for ( ; i < len; i++ ) { + hash = ( ( hash << 5 ) - hash ) + str.charCodeAt( i ); + hash |= 0; + } + + // Convert the possibly negative integer hash code into an 8 character hex string, which isn't + // strictly necessary but increases user understanding that the id is a SHA-like hash + hex = ( 0x100000000 + hash ).toString( 16 ); + if ( hex.length < 8 ) { + hex = "0000000" + hex; + } + + return hex.slice( -8 ); +} + +function Assert( testContext ) { + this.test = testContext; +} + +// Assert helpers +QUnit.assert = Assert.prototype = { + + // Specify the number of expected assertions to guarantee that failed test + // (no assertions are run at all) don't slip through. + expect: function( asserts ) { + if ( arguments.length === 1 ) { + this.test.expected = asserts; + } else { + return this.test.expected; + } + }, + + // Increment this Test's semaphore counter, then return a single-use function that + // decrements that counter a maximum of once. + async: function() { + var test = this.test, + popped = false; + + test.semaphore += 1; + test.usedAsync = true; + pauseProcessing(); + + return function done() { + if ( !popped ) { + test.semaphore -= 1; + popped = true; + resumeProcessing(); + } else { + test.pushFailure( "Called the callback returned from `assert.async` more than once", + sourceFromStacktrace( 2 ) ); + } + }; + }, + + // Exports test.push() to the user API + push: function( /* result, actual, expected, message */ ) { + var assert = this, + currentTest = ( assert instanceof Assert && assert.test ) || QUnit.config.current; + + // Backwards compatibility fix. + // Allows the direct use of global exported assertions and QUnit.assert.* + // Although, it's use is not recommended as it can leak assertions + // to other tests from async tests, because we only get a reference to the current test, + // not exactly the test where assertion were intended to be called. + if ( !currentTest ) { + throw new Error( "assertion outside test context, in " + sourceFromStacktrace( 2 ) ); + } + + if ( currentTest.usedAsync === true && currentTest.semaphore === 0 ) { + currentTest.pushFailure( "Assertion after the final `assert.async` was resolved", + sourceFromStacktrace( 2 ) ); + + // Allow this assertion to continue running anyway... + } + + if ( !( assert instanceof Assert ) ) { + assert = currentTest.assert; + } + return assert.test.push.apply( assert.test, arguments ); + }, + + ok: function( result, message ) { + message = message || ( result ? "okay" : "failed, expected argument to be truthy, was: " + + QUnit.dump.parse( result ) ); + this.push( !!result, result, true, message ); + }, + + notOk: function( result, message ) { + message = message || ( !result ? "okay" : "failed, expected argument to be falsy, was: " + + QUnit.dump.parse( result ) ); + this.push( !result, result, false, message ); + }, + + equal: function( actual, expected, message ) { + /*jshint eqeqeq:false */ + this.push( expected == actual, actual, expected, message ); + }, + + notEqual: function( actual, expected, message ) { + /*jshint eqeqeq:false */ + this.push( expected != actual, actual, expected, message ); + }, + + propEqual: function( actual, expected, message ) { + actual = objectValues( actual ); + expected = objectValues( expected ); + this.push( QUnit.equiv( actual, expected ), actual, expected, message ); + }, + + notPropEqual: function( actual, expected, message ) { + actual = objectValues( actual ); + expected = objectValues( expected ); + this.push( !QUnit.equiv( actual, expected ), actual, expected, message ); + }, + + deepEqual: function( actual, expected, message ) { + this.push( QUnit.equiv( actual, expected ), actual, expected, message ); + }, + + notDeepEqual: function( actual, expected, message ) { + this.push( !QUnit.equiv( actual, expected ), actual, expected, message ); + }, + + strictEqual: function( actual, expected, message ) { + this.push( expected === actual, actual, expected, message ); + }, + + notStrictEqual: function( actual, expected, message ) { + this.push( expected !== actual, actual, expected, message ); + }, + + "throws": function( block, expected, message ) { + var actual, expectedType, + expectedOutput = expected, + ok = false, + currentTest = ( this instanceof Assert && this.test ) || QUnit.config.current; + + // 'expected' is optional unless doing string comparison + if ( message == null && typeof expected === "string" ) { + message = expected; + expected = null; + } + + currentTest.ignoreGlobalErrors = true; + try { + block.call( currentTest.testEnvironment ); + } catch (e) { + actual = e; + } + currentTest.ignoreGlobalErrors = false; + + if ( actual ) { + expectedType = QUnit.objectType( expected ); + + // we don't want to validate thrown error + if ( !expected ) { + ok = true; + expectedOutput = null; + + // expected is a regexp + } else if ( expectedType === "regexp" ) { + ok = expected.test( errorString( actual ) ); + + // expected is a string + } else if ( expectedType === "string" ) { + ok = expected === errorString( actual ); + + // expected is a constructor, maybe an Error constructor + } else if ( expectedType === "function" && actual instanceof expected ) { + ok = true; + + // expected is an Error object + } else if ( expectedType === "object" ) { + ok = actual instanceof expected.constructor && + actual.name === expected.name && + actual.message === expected.message; + + // expected is a validation function which returns true if validation passed + } else if ( expectedType === "function" && expected.call( {}, actual ) === true ) { + expectedOutput = null; + ok = true; + } + } + + currentTest.assert.push( ok, actual, expectedOutput, message ); + } +}; + +// Provide an alternative to assert.throws(), for enviroments that consider throws a reserved word +// Known to us are: Closure Compiler, Narwhal +(function() { + /*jshint sub:true */ + Assert.prototype.raises = Assert.prototype[ "throws" ]; +}()); + // Test for equality any JavaScript type. // Author: Philippe Rathé QUnit.equiv = (function() { @@ -1619,22 +1426,26 @@ QUnit.equiv = (function() { // the real equiv function var innerEquiv, + // stack to decide between skip/abort functions callers = [], + // stack to avoiding loops from circular referencing parents = [], parentsB = [], - getProto = Object.getPrototypeOf || function ( obj ) { - /*jshint camelcase:false */ + getProto = Object.getPrototypeOf || function( obj ) { + /* jshint camelcase: false, proto: true */ return obj.__proto__; }, - callbacks = (function () { + callbacks = (function() { // for string, boolean, number and null function useStrictEquality( b, a ) { + /*jshint eqeqeq:false */ if ( b instanceof a.constructor || a instanceof b.constructor ) { + // to catch short annotation VS 'new' annotation of a // declaration // e.g. var i = 1; @@ -1662,10 +1473,13 @@ QUnit.equiv = (function() { "regexp": function( b, a ) { return QUnit.objectType( b ) === "regexp" && + // the regex itself a.source === b.source && + // and its modifiers a.global === b.global && + // (gmi) ... a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && @@ -1676,7 +1490,7 @@ QUnit.equiv = (function() { // - abort otherwise, // initial === would have catch identical references anyway "function": function() { - var caller = callers[callers.length - 1]; + var caller = callers[ callers.length - 1 ]; return caller !== Object && typeof caller !== "undefined"; }, @@ -1700,10 +1514,10 @@ QUnit.equiv = (function() { for ( i = 0; i < len; i++ ) { loop = false; for ( j = 0; j < parents.length; j++ ) { - aCircular = parents[j] === a[i]; - bCircular = parentsB[j] === b[i]; + aCircular = parents[ j ] === a[ i ]; + bCircular = parentsB[ j ] === b[ i ]; if ( aCircular || bCircular ) { - if ( a[i] === b[i] || aCircular && bCircular ) { + if ( a[ i ] === b[ i ] || aCircular && bCircular ) { loop = true; } else { parents.pop(); @@ -1712,7 +1526,7 @@ QUnit.equiv = (function() { } } } - if ( !loop && !innerEquiv(a[i], b[i]) ) { + if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) { parents.pop(); parentsB.pop(); return false; @@ -1724,6 +1538,7 @@ QUnit.equiv = (function() { }, "object": function( b, a ) { + /*jshint forin:false */ var i, j, loop, aCircular, bCircular, // Default to true @@ -1734,11 +1549,12 @@ QUnit.equiv = (function() { // comparing constructors is more strict than using // instanceof if ( a.constructor !== b.constructor ) { + // Allow objects with no prototype to be equivalent to // objects with Object as their constructor. - if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) || - ( getProto(b) === null && getProto(a) === Object.prototype ) ) ) { - return false; + if ( !( ( getProto( a ) === null && getProto( b ) === Object.prototype ) || + ( getProto( b ) === null && getProto( a ) === Object.prototype ) ) ) { + return false; } } @@ -1753,10 +1569,10 @@ QUnit.equiv = (function() { for ( i in a ) { loop = false; for ( j = 0; j < parents.length; j++ ) { - aCircular = parents[j] === a[i]; - bCircular = parentsB[j] === b[i]; + aCircular = parents[ j ] === a[ i ]; + bCircular = parentsB[ j ] === b[ i ]; if ( aCircular || bCircular ) { - if ( a[i] === b[i] || aCircular && bCircular ) { + if ( a[ i ] === b[ i ] || aCircular && bCircular ) { loop = true; } else { eq = false; @@ -1764,8 +1580,8 @@ QUnit.equiv = (function() { } } } - aProperties.push(i); - if ( !loop && !innerEquiv(a[i], b[i]) ) { + aProperties.push( i ); + if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) { eq = false; break; } @@ -1791,35 +1607,30 @@ QUnit.equiv = (function() { return true; // end transition } - return (function( a, b ) { + return ( (function( a, b ) { if ( a === b ) { return true; // catch the most you can } else if ( a === null || b === null || typeof a === "undefined" || typeof b === "undefined" || - QUnit.objectType(a) !== QUnit.objectType(b) ) { - return false; // don't lose time with error prone cases + QUnit.objectType( a ) !== QUnit.objectType( b ) ) { + + // don't lose time with error prone cases + return false; } else { - return bindCallbacks(a, callbacks, [ b, a ]); + return bindCallbacks( a, callbacks, [ b, a ] ); } // apply transition with (1..n) arguments - }( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) ); + }( args[ 0 ], args[ 1 ] ) ) && + innerEquiv.apply( this, args.splice( 1, args.length - 1 ) ) ); }; return innerEquiv; }()); -/** - * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | - * http://flesler.blogspot.com Licensed under BSD - * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008 - * - * @projectDescription Advanced and extensible data dumping for Javascript. - * @version 1.0.0 - * @author Ariel Flesler - * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html} - */ -QUnit.jsDump = (function() { +// Based on jsDump by Ariel Flesler +// http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html +QUnit.dump = (function() { function quote( str ) { return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\""; } @@ -1827,48 +1638,57 @@ QUnit.jsDump = (function() { return o + ""; } function join( pre, arr, post ) { - var s = jsDump.separator(), - base = jsDump.indent(), - inner = jsDump.indent(1); + var s = dump.separator(), + base = dump.indent(), + inner = dump.indent( 1 ); if ( arr.join ) { arr = arr.join( "," + s + inner ); } if ( !arr ) { return pre + post; } - return [ pre, inner + arr, base + post ].join(s); + return [ pre, inner + arr, base + post ].join( s ); } function array( arr, stack ) { - var i = arr.length, ret = new Array(i); + var i = arr.length, + ret = new Array( i ); + + if ( dump.maxDepth && dump.depth > dump.maxDepth ) { + return "[object Array]"; + } + this.up(); while ( i-- ) { - ret[i] = this.parse( arr[i] , undefined , stack); + ret[ i ] = this.parse( arr[ i ], undefined, stack ); } this.down(); return join( "[", ret, "]" ); } var reName = /^function (\w+)/, - jsDump = { - // type is used mostly internally, you can fix a (custom)type in advance - parse: function( obj, type, stack ) { - stack = stack || [ ]; - var inStack, res, - parser = this.parsers[ type || this.typeOf(obj) ]; + dump = { - type = typeof parser; - inStack = inArray( obj, stack ); + // objType is used mostly internally, you can fix a (custom) type in advance + parse: function( obj, objType, stack ) { + stack = stack || []; + var res, parser, parserType, + inStack = inArray( obj, stack ); if ( inStack !== -1 ) { - return "recursion(" + (inStack - stack.length) + ")"; + return "recursion(" + ( inStack - stack.length ) + ")"; } - if ( type === "function" ) { + + objType = objType || this.typeOf( obj ); + parser = this.parsers[ objType ]; + parserType = typeof parser; + + if ( parserType === "function" ) { stack.push( obj ); res = parser.call( this, obj, stack ); stack.pop(); return res; } - return ( type === "string" ) ? parser : this.parsers.error; + return ( parserType === "string" ) ? parser : this.parsers.error; }, typeOf: function( obj ) { var type; @@ -1876,23 +1696,29 @@ QUnit.jsDump = (function() { type = "null"; } else if ( typeof obj === "undefined" ) { type = "undefined"; - } else if ( QUnit.is( "regexp", obj) ) { + } else if ( QUnit.is( "regexp", obj ) ) { type = "regexp"; - } else if ( QUnit.is( "date", obj) ) { + } else if ( QUnit.is( "date", obj ) ) { type = "date"; - } else if ( QUnit.is( "function", obj) ) { + } else if ( QUnit.is( "function", obj ) ) { type = "function"; - } else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) { + } else if ( obj.setInterval !== undefined && + obj.document !== undefined && + obj.nodeType === undefined ) { type = "window"; } else if ( obj.nodeType === 9 ) { type = "document"; } else if ( obj.nodeType ) { type = "node"; } else if ( + // native arrays toString.call( obj ) === "[object Array]" || + // NodeList objects - ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) ) + ( typeof obj.length === "number" && obj.item !== undefined && + ( obj.length ? obj.item( 0 ) === obj[ 0 ] : ( obj.item( 0 ) === null && + obj[ 0 ] === undefined ) ) ) ) { type = "array"; } else if ( obj.constructor === Error.prototype.constructor ) { @@ -1903,7 +1729,7 @@ QUnit.jsDump = (function() { return type; }, separator: function() { - return this.multiline ? this.HTML ? "
      " : "\n" : this.HTML ? " " : " "; + return this.multiline ? this.HTML ? "
      " : "\n" : this.HTML ? " " : " "; }, // extra can be a number, shortcut for increasing-calling-decreasing indent: function( extra ) { @@ -1912,9 +1738,9 @@ QUnit.jsDump = (function() { } var chr = this.indentChar; if ( this.HTML ) { - chr = chr.replace( /\t/g, " " ).replace( / /g, " " ); + chr = chr.replace( /\t/g, " " ).replace( / /g, " " ); } - return new Array( this.depth + ( extra || 0 ) ).join(chr); + return new Array( this.depth + ( extra || 0 ) ).join( chr ); }, up: function( a ) { this.depth += a || 1; @@ -1923,7 +1749,7 @@ QUnit.jsDump = (function() { this.depth -= a || 1; }, setParser: function( name, parser ) { - this.parsers[name] = parser; + this.parsers[ name ] = parser; }, // The next 3 are exposed so you can use them quote: quote, @@ -1931,11 +1757,13 @@ QUnit.jsDump = (function() { join: join, // depth: 1, - // This is the list of parsers, to modify them, use jsDump.setParser + maxDepth: QUnit.config.maxDepth, + + // This is the list of parsers, to modify them, use dump.setParser parsers: { window: "[Window]", document: "[Document]", - error: function(error) { + error: function( error ) { return "Error(\"" + error.message + "\")"; }, unknown: "[Unknown]", @@ -1943,52 +1771,71 @@ QUnit.jsDump = (function() { "undefined": "undefined", "function": function( fn ) { var ret = "function", + // functions never have name in IE - name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1]; + name = "name" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ]; if ( name ) { ret += " " + name; } ret += "( "; - ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" ); - return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" ); + ret = [ ret, dump.parse( fn, "functionArgs" ), "){" ].join( "" ); + return join( ret, dump.parse( fn, "functionCode" ), "}" ); }, array: array, nodelist: array, "arguments": array, object: function( map, stack ) { - /*jshint forin:false */ - var ret = [ ], keys, key, val, i; - QUnit.jsDump.up(); + var keys, key, val, i, nonEnumerableProperties, + ret = []; + + if ( dump.maxDepth && dump.depth > dump.maxDepth ) { + return "[object Object]"; + } + + dump.up(); keys = []; for ( key in map ) { keys.push( key ); } + + // Some properties are not always enumerable on Error objects. + nonEnumerableProperties = [ "message", "name" ]; + for ( i in nonEnumerableProperties ) { + key = nonEnumerableProperties[ i ]; + if ( key in map && inArray( key, keys ) < 0 ) { + keys.push( key ); + } + } keys.sort(); for ( i = 0; i < keys.length; i++ ) { key = keys[ i ]; val = map[ key ]; - ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) ); + ret.push( dump.parse( key, "key" ) + ": " + + dump.parse( val, undefined, stack ) ); } - QUnit.jsDump.down(); + dump.down(); return join( "{", ret, "}" ); }, node: function( node ) { var len, i, val, - open = QUnit.jsDump.HTML ? "<" : "<", - close = QUnit.jsDump.HTML ? ">" : ">", + open = dump.HTML ? "<" : "<", + close = dump.HTML ? ">" : ">", tag = node.nodeName.toLowerCase(), ret = open + tag, attrs = node.attributes; if ( attrs ) { for ( i = 0, len = attrs.length; i < len; i++ ) { - val = attrs[i].nodeValue; - // IE6 includes all attributes in .attributes, even ones not explicitly set. - // Those have values like undefined, null, 0, false, "" or "inherit". + val = attrs[ i ].nodeValue; + + // IE6 includes all attributes in .attributes, even ones not explicitly + // set. Those have values like undefined, null, 0, false, "" or + // "inherit". if ( val && val !== "inherit" ) { - ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" ); + ret += " " + attrs[ i ].nodeName + "=" + + dump.parse( val, "attribute" ); } } } @@ -2001,6 +1848,7 @@ QUnit.jsDump = (function() { return ret + open + "/" + tag + close; }, + // function calls it internally, it's the arguments part of the function functionArgs: function( fn ) { var args, @@ -2010,10 +1858,11 @@ QUnit.jsDump = (function() { return ""; } - args = new Array(l); + args = new Array( l ); while ( l-- ) { + // 97 is 'a' - args[l] = String.fromCharCode(97+l); + args[ l ] = String.fromCharCode( 97 + l ); } return " " + args.join( ", " ) + " "; }, @@ -2037,176 +1886,1943 @@ QUnit.jsDump = (function() { multiline: true }; - return jsDump; + return dump; }()); -// from jquery.js -function inArray( elem, array ) { - if ( array.indexOf ) { - return array.indexOf( elem ); - } +// back compat +QUnit.jsDump = QUnit.dump; - for ( var i = 0, length = array.length; i < length; i++ ) { - if ( array[ i ] === elem ) { - return i; +// For browser, export only select globals +if ( typeof window !== "undefined" ) { + + // Deprecated + // Extend assert methods to QUnit and Global scope through Backwards compatibility + (function() { + var i, + assertions = Assert.prototype; + + function applyCurrent( current ) { + return function() { + var assert = new Assert( QUnit.config.current ); + current.apply( assert, arguments ); + }; } - } - return -1; + for ( i in assertions ) { + QUnit[ i ] = applyCurrent( assertions[ i ] ); + } + })(); + + (function() { + var i, l, + keys = [ + "test", + "module", + "expect", + "asyncTest", + "start", + "stop", + "ok", + "notOk", + "equal", + "notEqual", + "propEqual", + "notPropEqual", + "deepEqual", + "notDeepEqual", + "strictEqual", + "notStrictEqual", + "throws" + ]; + + for ( i = 0, l = keys.length; i < l; i++ ) { + window[ keys[ i ] ] = QUnit[ keys[ i ] ]; + } + })(); + + window.QUnit = QUnit; } +// For nodejs +if ( typeof module !== "undefined" && module && module.exports ) { + module.exports = QUnit; + + // For consistency with CommonJS environments' exports + module.exports.QUnit = QUnit; +} + +// For CommonJS with exports, but without module.exports, like Rhino +if ( typeof exports !== "undefined" && exports ) { + exports.QUnit = QUnit; +} + +if ( typeof define === "function" && define.amd ) { + define( function() { + return QUnit; + } ); + QUnit.config.autostart = false; +} + +// Get a reference to the global object, like window in browsers +}( (function() { + return this; +})() )); + +/*istanbul ignore next */ +// jscs:disable maximumLineLength /* - * Javascript Diff Algorithm - * By John Resig (http://ejohn.org/) - * Modified by Chu Alan "sprite" + * This file is a modified version of google-diff-match-patch's JavaScript implementation + * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js), + * modifications are licensed as more fully set forth in LICENSE.txt. * - * Released under the MIT license. + * The original source of google-diff-match-patch is attributable and licensed as follows: + * + * Copyright 2006 Google Inc. + * http://code.google.com/p/google-diff-match-patch/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * More Info: - * http://ejohn.org/projects/javascript-diff-algorithm/ + * https://code.google.com/p/google-diff-match-patch/ * * Usage: QUnit.diff(expected, actual) * - * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the quick brown fox jumped jumps over" + * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) === "the quick brown fox jumpsed 0; i-- ) { - if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null && - n[ i - 1 ] == o[ n[i].row - 1 ]) { + /** + * Find the differences between two texts. Simplifies the problem by stripping + * any common prefix or suffix off the texts before diffing. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {boolean=} optChecklines Optional speedup flag. If present and false, + * then don't run a line-level diff first to identify the changed areas. + * Defaults to true, which does a faster, slightly less optimal diff. + * @param {number} optDeadline Optional time when the diff should be complete + * by. Used internally for recursive calls. Users should set DiffTimeout + * instead. + * @return {!Array.} Array of diff tuples. + */ + DiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines, optDeadline ) { + var deadline, checklines, commonlength, + commonprefix, commonsuffix, diffs; + // Set a deadline by which time the diff must be complete. + if ( typeof optDeadline === "undefined" ) { + if ( this.DiffTimeout <= 0 ) { + optDeadline = Number.MAX_VALUE; + } else { + optDeadline = ( new Date() ).getTime() + this.DiffTimeout * 1000; + } + } + deadline = optDeadline; - n[ i - 1 ] = { - text: n[ i - 1 ], - row: n[i].row - 1 - }; - o[ n[i].row - 1 ] = { - text: o[ n[i].row - 1 ], - row: i - 1 - }; - } - } + // Check for null inputs. + if ( text1 === null || text2 === null ) { + throw new Error( "Null input. (DiffMain)" ); + } - return { - o: o, - n: n - }; + // Check for equality (speedup). + if ( text1 === text2 ) { + if ( text1 ) { + return [ + [ DIFF_EQUAL, text1 ] + ]; + } + return []; + } + + if ( typeof optChecklines === "undefined" ) { + optChecklines = true; + } + + checklines = optChecklines; + + // Trim off common prefix (speedup). + commonlength = this.diffCommonPrefix( text1, text2 ); + commonprefix = text1.substring( 0, commonlength ); + text1 = text1.substring( commonlength ); + text2 = text2.substring( commonlength ); + + // Trim off common suffix (speedup). + ///////// + commonlength = this.diffCommonSuffix( text1, text2 ); + commonsuffix = text1.substring( text1.length - commonlength ); + text1 = text1.substring( 0, text1.length - commonlength ); + text2 = text2.substring( 0, text2.length - commonlength ); + + // Compute the diff on the middle block. + diffs = this.diffCompute( text1, text2, checklines, deadline ); + + // Restore the prefix and suffix. + if ( commonprefix ) { + diffs.unshift( [ DIFF_EQUAL, commonprefix ] ); + } + if ( commonsuffix ) { + diffs.push( [ DIFF_EQUAL, commonsuffix ] ); + } + this.diffCleanupMerge( diffs ); + return diffs; + }; + + /** + * Reduce the number of edits by eliminating operationally trivial equalities. + * @param {!Array.} diffs Array of diff tuples. + */ + DiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) { + var changes, equalities, equalitiesLength, lastequality, + pointer, preIns, preDel, postIns, postDel; + changes = false; + equalities = []; // Stack of indices where equalities are found. + equalitiesLength = 0; // Keeping our own length var is faster in JS. + /** @type {?string} */ + lastequality = null; + // Always equal to diffs[equalities[equalitiesLength - 1]][1] + pointer = 0; // Index of current position. + // Is there an insertion operation before the last equality. + preIns = false; + // Is there a deletion operation before the last equality. + preDel = false; + // Is there an insertion operation after the last equality. + postIns = false; + // Is there a deletion operation after the last equality. + postDel = false; + while ( pointer < diffs.length ) { + if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found. + if ( diffs[ pointer ][ 1 ].length < this.DiffEditCost && ( postIns || postDel ) ) { + // Candidate found. + equalities[ equalitiesLength++ ] = pointer; + preIns = postIns; + preDel = postDel; + lastequality = diffs[ pointer ][ 1 ]; + } else { + // Not a candidate, and can never become one. + equalitiesLength = 0; + lastequality = null; + } + postIns = postDel = false; + } else { // An insertion or deletion. + if ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) { + postDel = true; + } else { + postIns = true; + } + /* + * Five types to be split: + * ABXYCD + * AXCD + * ABXC + * AXCD + * ABXC + */ + if ( lastequality && ( ( preIns && preDel && postIns && postDel ) || + ( ( lastequality.length < this.DiffEditCost / 2 ) && + ( preIns + preDel + postIns + postDel ) === 3 ) ) ) { + // Duplicate record. + diffs.splice( equalities[equalitiesLength - 1], 0, [ DIFF_DELETE, lastequality ] ); + // Change second copy to insert. + diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT; + equalitiesLength--; // Throw away the equality we just deleted; + lastequality = null; + if (preIns && preDel) { + // No changes made which could affect previous entry, keep going. + postIns = postDel = true; + equalitiesLength = 0; + } else { + equalitiesLength--; // Throw away the previous equality. + pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1; + postIns = postDel = false; + } + changes = true; + } + } + pointer++; + } + + if ( changes ) { + this.diffCleanupMerge( diffs ); + } + }; + + /** + * Convert a diff array into a pretty HTML report. + * @param {!Array.} diffs Array of diff tuples. + * @param {integer} string to be beautified. + * @return {string} HTML representation. + */ + DiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) { + var op, data, x, html = []; + for ( x = 0; x < diffs.length; x++ ) { + op = diffs[x][0]; // Operation (insert, delete, equal) + data = diffs[x][1]; // Text of change. + switch ( op ) { + case DIFF_INSERT: + html[x] = "" + data + ""; + break; + case DIFF_DELETE: + html[x] = "" + data + ""; + break; + case DIFF_EQUAL: + html[x] = "" + data + ""; + break; + } + } + return html.join(""); + }; + + /** + * Determine the common prefix of two strings. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the start of each + * string. + */ + DiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) { + var pointermid, pointermax, pointermin, pointerstart; + // Quick check for common null cases. + if ( !text1 || !text2 || text1.charAt(0) !== text2.charAt(0) ) { + return 0; + } + // Binary search. + // Performance analysis: http://neil.fraser.name/news/2007/10/09/ + pointermin = 0; + pointermax = Math.min( text1.length, text2.length ); + pointermid = pointermax; + pointerstart = 0; + while ( pointermin < pointermid ) { + if ( text1.substring( pointerstart, pointermid ) === text2.substring( pointerstart, pointermid ) ) { + pointermin = pointermid; + pointerstart = pointermin; + } else { + pointermax = pointermid; + } + pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin ); + } + return pointermid; + }; + + /** + * Determine the common suffix of two strings. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the end of each string. + */ + DiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) { + var pointermid, pointermax, pointermin, pointerend; + // Quick check for common null cases. + if (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) { + return 0; + } + // Binary search. + // Performance analysis: http://neil.fraser.name/news/2007/10/09/ + pointermin = 0; + pointermax = Math.min(text1.length, text2.length); + pointermid = pointermax; + pointerend = 0; + while ( pointermin < pointermid ) { + if (text1.substring( text1.length - pointermid, text1.length - pointerend ) === + text2.substring( text2.length - pointermid, text2.length - pointerend ) ) { + pointermin = pointermid; + pointerend = pointermin; + } else { + pointermax = pointermid; + } + pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin ); + } + return pointermid; + }; + + /** + * Find the differences between two texts. Assumes that the texts do not + * have any common prefix or suffix. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {boolean} checklines Speedup flag. If false, then don't run a + * line-level diff first to identify the changed areas. + * If true, then run a faster, slightly less optimal diff. + * @param {number} deadline Time when the diff should be complete by. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) { + var diffs, longtext, shorttext, i, hm, + text1A, text2A, text1B, text2B, + midCommon, diffsA, diffsB; + + if ( !text1 ) { + // Just add some text (speedup). + return [ + [ DIFF_INSERT, text2 ] + ]; + } + + if (!text2) { + // Just delete some text (speedup). + return [ + [ DIFF_DELETE, text1 ] + ]; + } + + longtext = text1.length > text2.length ? text1 : text2; + shorttext = text1.length > text2.length ? text2 : text1; + i = longtext.indexOf( shorttext ); + if ( i !== -1 ) { + // Shorter text is inside the longer text (speedup). + diffs = [ + [ DIFF_INSERT, longtext.substring( 0, i ) ], + [ DIFF_EQUAL, shorttext ], + [ DIFF_INSERT, longtext.substring( i + shorttext.length ) ] + ]; + // Swap insertions for deletions if diff is reversed. + if ( text1.length > text2.length ) { + diffs[0][0] = diffs[2][0] = DIFF_DELETE; + } + return diffs; + } + + if ( shorttext.length === 1 ) { + // Single character string. + // After the previous speedup, the character can't be an equality. + return [ + [ DIFF_DELETE, text1 ], + [ DIFF_INSERT, text2 ] + ]; + } + + // Check to see if the problem can be split in two. + hm = this.diffHalfMatch(text1, text2); + if (hm) { + // A half-match was found, sort out the return data. + text1A = hm[0]; + text1B = hm[1]; + text2A = hm[2]; + text2B = hm[3]; + midCommon = hm[4]; + // Send both pairs off for separate processing. + diffsA = this.DiffMain(text1A, text2A, checklines, deadline); + diffsB = this.DiffMain(text1B, text2B, checklines, deadline); + // Merge the results. + return diffsA.concat([ + [ DIFF_EQUAL, midCommon ] + ], diffsB); + } + + if (checklines && text1.length > 100 && text2.length > 100) { + return this.diffLineMode(text1, text2, deadline); + } + + return this.diffBisect(text1, text2, deadline); + }; + + /** + * Do the two texts share a substring which is at least half the length of the + * longer text? + * This speedup can produce non-minimal diffs. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {Array.} Five element Array, containing the prefix of + * text1, the suffix of text1, the prefix of text2, the suffix of + * text2 and the common middle. Or null if there was no match. + * @private + */ + DiffMatchPatch.prototype.diffHalfMatch = function(text1, text2) { + var longtext, shorttext, dmp, + text1A, text2B, text2A, text1B, midCommon, + hm1, hm2, hm; + if (this.DiffTimeout <= 0) { + // Don't risk returning a non-optimal diff if we have unlimited time. + return null; + } + longtext = text1.length > text2.length ? text1 : text2; + shorttext = text1.length > text2.length ? text2 : text1; + if (longtext.length < 4 || shorttext.length * 2 < longtext.length) { + return null; // Pointless. + } + dmp = this; // 'this' becomes 'window' in a closure. + + /** + * Does a substring of shorttext exist within longtext such that the substring + * is at least half the length of longtext? + * Closure, but does not reference any external variables. + * @param {string} longtext Longer string. + * @param {string} shorttext Shorter string. + * @param {number} i Start index of quarter length substring within longtext. + * @return {Array.} Five element Array, containing the prefix of + * longtext, the suffix of longtext, the prefix of shorttext, the suffix + * of shorttext and the common middle. Or null if there was no match. + * @private + */ + function diffHalfMatchI(longtext, shorttext, i) { + var seed, j, bestCommon, prefixLength, suffixLength, + bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB; + // Start with a 1/4 length substring at position i as a seed. + seed = longtext.substring(i, i + Math.floor(longtext.length / 4)); + j = -1; + bestCommon = ""; + while ((j = shorttext.indexOf(seed, j + 1)) !== -1) { + prefixLength = dmp.diffCommonPrefix(longtext.substring(i), + shorttext.substring(j)); + suffixLength = dmp.diffCommonSuffix(longtext.substring(0, i), + shorttext.substring(0, j)); + if (bestCommon.length < suffixLength + prefixLength) { + bestCommon = shorttext.substring(j - suffixLength, j) + + shorttext.substring(j, j + prefixLength); + bestLongtextA = longtext.substring(0, i - suffixLength); + bestLongtextB = longtext.substring(i + prefixLength); + bestShorttextA = shorttext.substring(0, j - suffixLength); + bestShorttextB = shorttext.substring(j + prefixLength); + } + } + if (bestCommon.length * 2 >= longtext.length) { + return [ bestLongtextA, bestLongtextB, + bestShorttextA, bestShorttextB, bestCommon + ]; + } else { + return null; + } + } + + // First check if the second quarter is the seed for a half-match. + hm1 = diffHalfMatchI(longtext, shorttext, + Math.ceil(longtext.length / 4)); + // Check again based on the third quarter. + hm2 = diffHalfMatchI(longtext, shorttext, + Math.ceil(longtext.length / 2)); + if (!hm1 && !hm2) { + return null; + } else if (!hm2) { + hm = hm1; + } else if (!hm1) { + hm = hm2; + } else { + // Both matched. Select the longest. + hm = hm1[4].length > hm2[4].length ? hm1 : hm2; + } + + // A half-match was found, sort out the return data. + text1A, text1B, text2A, text2B; + if (text1.length > text2.length) { + text1A = hm[0]; + text1B = hm[1]; + text2A = hm[2]; + text2B = hm[3]; + } else { + text2A = hm[0]; + text2B = hm[1]; + text1A = hm[2]; + text1B = hm[3]; + } + midCommon = hm[4]; + return [ text1A, text1B, text2A, text2B, midCommon ]; + }; + + /** + * Do a quick line-level diff on both strings, then rediff the parts for + * greater accuracy. + * This speedup can produce non-minimal diffs. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} deadline Time when the diff should be complete by. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffLineMode = function(text1, text2, deadline) { + var a, diffs, linearray, pointer, countInsert, + countDelete, textInsert, textDelete, j; + // Scan the text on a line-by-line basis first. + a = this.diffLinesToChars(text1, text2); + text1 = a.chars1; + text2 = a.chars2; + linearray = a.lineArray; + + diffs = this.DiffMain(text1, text2, false, deadline); + + // Convert the diff back to original text. + this.diffCharsToLines(diffs, linearray); + // Eliminate freak matches (e.g. blank lines) + this.diffCleanupSemantic(diffs); + + // Rediff any replacement blocks, this time character-by-character. + // Add a dummy entry at the end. + diffs.push( [ DIFF_EQUAL, "" ] ); + pointer = 0; + countDelete = 0; + countInsert = 0; + textDelete = ""; + textInsert = ""; + while (pointer < diffs.length) { + switch ( diffs[pointer][0] ) { + case DIFF_INSERT: + countInsert++; + textInsert += diffs[pointer][1]; + break; + case DIFF_DELETE: + countDelete++; + textDelete += diffs[pointer][1]; + break; + case DIFF_EQUAL: + // Upon reaching an equality, check for prior redundancies. + if (countDelete >= 1 && countInsert >= 1) { + // Delete the offending records and add the merged ones. + diffs.splice(pointer - countDelete - countInsert, + countDelete + countInsert); + pointer = pointer - countDelete - countInsert; + a = this.DiffMain(textDelete, textInsert, false, deadline); + for (j = a.length - 1; j >= 0; j--) { + diffs.splice( pointer, 0, a[j] ); + } + pointer = pointer + a.length; + } + countInsert = 0; + countDelete = 0; + textDelete = ""; + textInsert = ""; + break; + } + pointer++; + } + diffs.pop(); // Remove the dummy entry at the end. + + return diffs; + }; + + /** + * Find the 'middle snake' of a diff, split the problem in two + * and return the recursively constructed diff. + * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} deadline Time at which to bail if not yet complete. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffBisect = function(text1, text2, deadline) { + var text1Length, text2Length, maxD, vOffset, vLength, + v1, v2, x, delta, front, k1start, k1end, k2start, + k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2; + // Cache the text lengths to prevent multiple calls. + text1Length = text1.length; + text2Length = text2.length; + maxD = Math.ceil((text1Length + text2Length) / 2); + vOffset = maxD; + vLength = 2 * maxD; + v1 = new Array(vLength); + v2 = new Array(vLength); + // Setting all elements to -1 is faster in Chrome & Firefox than mixing + // integers and undefined. + for (x = 0; x < vLength; x++) { + v1[x] = -1; + v2[x] = -1; + } + v1[vOffset + 1] = 0; + v2[vOffset + 1] = 0; + delta = text1Length - text2Length; + // If the total number of characters is odd, then the front path will collide + // with the reverse path. + front = (delta % 2 !== 0); + // Offsets for start and end of k loop. + // Prevents mapping of space beyond the grid. + k1start = 0; + k1end = 0; + k2start = 0; + k2end = 0; + for (d = 0; d < maxD; d++) { + // Bail out if deadline is reached. + if ((new Date()).getTime() > deadline) { + break; + } + + // Walk the front path one step. + for (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) { + k1Offset = vOffset + k1; + if ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) { + x1 = v1[k1Offset + 1]; + } else { + x1 = v1[k1Offset - 1] + 1; + } + y1 = x1 - k1; + while (x1 < text1Length && y1 < text2Length && + text1.charAt(x1) === text2.charAt(y1)) { + x1++; + y1++; + } + v1[k1Offset] = x1; + if (x1 > text1Length) { + // Ran off the right of the graph. + k1end += 2; + } else if (y1 > text2Length) { + // Ran off the bottom of the graph. + k1start += 2; + } else if (front) { + k2Offset = vOffset + delta - k1; + if (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) { + // Mirror x2 onto top-left coordinate system. + x2 = text1Length - v2[k2Offset]; + if (x1 >= x2) { + // Overlap detected. + return this.diffBisectSplit(text1, text2, x1, y1, deadline); + } + } + } + } + + // Walk the reverse path one step. + for (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) { + k2Offset = vOffset + k2; + if ( k2 === -d || (k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) { + x2 = v2[k2Offset + 1]; + } else { + x2 = v2[k2Offset - 1] + 1; + } + y2 = x2 - k2; + while (x2 < text1Length && y2 < text2Length && + text1.charAt(text1Length - x2 - 1) === + text2.charAt(text2Length - y2 - 1)) { + x2++; + y2++; + } + v2[k2Offset] = x2; + if (x2 > text1Length) { + // Ran off the left of the graph. + k2end += 2; + } else if (y2 > text2Length) { + // Ran off the top of the graph. + k2start += 2; + } else if (!front) { + k1Offset = vOffset + delta - k2; + if (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) { + x1 = v1[k1Offset]; + y1 = vOffset + x1 - k1Offset; + // Mirror x2 onto top-left coordinate system. + x2 = text1Length - x2; + if (x1 >= x2) { + // Overlap detected. + return this.diffBisectSplit(text1, text2, x1, y1, deadline); + } + } + } + } + } + // Diff took too long and hit the deadline or + // number of diffs equals number of characters, no commonality at all. + return [ + [ DIFF_DELETE, text1 ], + [ DIFF_INSERT, text2 ] + ]; + }; + + /** + * Given the location of the 'middle snake', split the diff in two parts + * and recurse. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} x Index of split point in text1. + * @param {number} y Index of split point in text2. + * @param {number} deadline Time at which to bail if not yet complete. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) { + var text1a, text1b, text2a, text2b, diffs, diffsb; + text1a = text1.substring(0, x); + text2a = text2.substring(0, y); + text1b = text1.substring(x); + text2b = text2.substring(y); + + // Compute both diffs serially. + diffs = this.DiffMain(text1a, text2a, false, deadline); + diffsb = this.DiffMain(text1b, text2b, false, deadline); + + return diffs.concat(diffsb); + }; + + /** + * Reduce the number of edits by eliminating semantically trivial equalities. + * @param {!Array.} diffs Array of diff tuples. + */ + DiffMatchPatch.prototype.diffCleanupSemantic = function(diffs) { + var changes, equalities, equalitiesLength, lastequality, + pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1, + lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2; + changes = false; + equalities = []; // Stack of indices where equalities are found. + equalitiesLength = 0; // Keeping our own length var is faster in JS. + /** @type {?string} */ + lastequality = null; + // Always equal to diffs[equalities[equalitiesLength - 1]][1] + pointer = 0; // Index of current position. + // Number of characters that changed prior to the equality. + lengthInsertions1 = 0; + lengthDeletions1 = 0; + // Number of characters that changed after the equality. + lengthInsertions2 = 0; + lengthDeletions2 = 0; + while (pointer < diffs.length) { + if (diffs[pointer][0] === DIFF_EQUAL) { // Equality found. + equalities[equalitiesLength++] = pointer; + lengthInsertions1 = lengthInsertions2; + lengthDeletions1 = lengthDeletions2; + lengthInsertions2 = 0; + lengthDeletions2 = 0; + lastequality = diffs[pointer][1]; + } else { // An insertion or deletion. + if (diffs[pointer][0] === DIFF_INSERT) { + lengthInsertions2 += diffs[pointer][1].length; + } else { + lengthDeletions2 += diffs[pointer][1].length; + } + // Eliminate an equality that is smaller or equal to the edits on both + // sides of it. + if (lastequality && (lastequality.length <= + Math.max(lengthInsertions1, lengthDeletions1)) && + (lastequality.length <= Math.max(lengthInsertions2, + lengthDeletions2))) { + // Duplicate record. + diffs.splice( equalities[ equalitiesLength - 1 ], 0, [ DIFF_DELETE, lastequality ] ); + // Change second copy to insert. + diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT; + // Throw away the equality we just deleted. + equalitiesLength--; + // Throw away the previous equality (it needs to be reevaluated). + equalitiesLength--; + pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1; + lengthInsertions1 = 0; // Reset the counters. + lengthDeletions1 = 0; + lengthInsertions2 = 0; + lengthDeletions2 = 0; + lastequality = null; + changes = true; + } + } + pointer++; + } + + // Normalize the diff. + if (changes) { + this.diffCleanupMerge(diffs); + } + + // Find any overlaps between deletions and insertions. + // e.g: abcxxxxxxdef + // -> abcxxxdef + // e.g: xxxabcdefxxx + // -> defxxxabc + // Only extract an overlap if it is as big as the edit ahead or behind it. + pointer = 1; + while (pointer < diffs.length) { + if (diffs[pointer - 1][0] === DIFF_DELETE && + diffs[pointer][0] === DIFF_INSERT) { + deletion = diffs[pointer - 1][1]; + insertion = diffs[pointer][1]; + overlapLength1 = this.diffCommonOverlap(deletion, insertion); + overlapLength2 = this.diffCommonOverlap(insertion, deletion); + if (overlapLength1 >= overlapLength2) { + if (overlapLength1 >= deletion.length / 2 || + overlapLength1 >= insertion.length / 2) { + // Overlap found. Insert an equality and trim the surrounding edits. + diffs.splice( pointer, 0, [ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ] ); + diffs[pointer - 1][1] = + deletion.substring(0, deletion.length - overlapLength1); + diffs[pointer + 1][1] = insertion.substring(overlapLength1); + pointer++; + } + } else { + if (overlapLength2 >= deletion.length / 2 || + overlapLength2 >= insertion.length / 2) { + // Reverse overlap found. + // Insert an equality and swap and trim the surrounding edits. + diffs.splice( pointer, 0, [ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ] ); + diffs[pointer - 1][0] = DIFF_INSERT; + diffs[pointer - 1][1] = + insertion.substring(0, insertion.length - overlapLength2); + diffs[pointer + 1][0] = DIFF_DELETE; + diffs[pointer + 1][1] = + deletion.substring(overlapLength2); + pointer++; + } + } + pointer++; + } + pointer++; + } + }; + + /** + * Determine if the suffix of one string is the prefix of another. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the end of the first + * string and the start of the second string. + * @private + */ + DiffMatchPatch.prototype.diffCommonOverlap = function(text1, text2) { + var text1Length, text2Length, textLength, + best, length, pattern, found; + // Cache the text lengths to prevent multiple calls. + text1Length = text1.length; + text2Length = text2.length; + // Eliminate the null case. + if (text1Length === 0 || text2Length === 0) { + return 0; + } + // Truncate the longer string. + if (text1Length > text2Length) { + text1 = text1.substring(text1Length - text2Length); + } else if (text1Length < text2Length) { + text2 = text2.substring(0, text1Length); + } + textLength = Math.min(text1Length, text2Length); + // Quick check for the worst case. + if (text1 === text2) { + return textLength; + } + + // Start by looking for a single character match + // and increase length until no match is found. + // Performance analysis: http://neil.fraser.name/news/2010/11/04/ + best = 0; + length = 1; + while (true) { + pattern = text1.substring(textLength - length); + found = text2.indexOf(pattern); + if (found === -1) { + return best; + } + length += found; + if (found === 0 || text1.substring(textLength - length) === + text2.substring(0, length)) { + best = length; + length++; + } + } + }; + + /** + * Split two texts into an array of strings. Reduce the texts to a string of + * hashes where each Unicode character represents one line. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {{chars1: string, chars2: string, lineArray: !Array.}} + * An object containing the encoded text1, the encoded text2 and + * the array of unique strings. + * The zeroth element of the array of unique strings is intentionally blank. + * @private + */ + DiffMatchPatch.prototype.diffLinesToChars = function(text1, text2) { + var lineArray, lineHash, chars1, chars2; + lineArray = []; // e.g. lineArray[4] === 'Hello\n' + lineHash = {}; // e.g. lineHash['Hello\n'] === 4 + + // '\x00' is a valid character, but various debuggers don't like it. + // So we'll insert a junk entry to avoid generating a null character. + lineArray[0] = ""; + + /** + * Split a text into an array of strings. Reduce the texts to a string of + * hashes where each Unicode character represents one line. + * Modifies linearray and linehash through being a closure. + * @param {string} text String to encode. + * @return {string} Encoded string. + * @private + */ + function diffLinesToCharsMunge(text) { + var chars, lineStart, lineEnd, lineArrayLength, line; + chars = ""; + // Walk the text, pulling out a substring for each line. + // text.split('\n') would would temporarily double our memory footprint. + // Modifying text would create many large strings to garbage collect. + lineStart = 0; + lineEnd = -1; + // Keeping our own length variable is faster than looking it up. + lineArrayLength = lineArray.length; + while (lineEnd < text.length - 1) { + lineEnd = text.indexOf("\n", lineStart); + if (lineEnd === -1) { + lineEnd = text.length - 1; + } + line = text.substring(lineStart, lineEnd + 1); + lineStart = lineEnd + 1; + + if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : + (lineHash[line] !== undefined)) { + chars += String.fromCharCode( lineHash[ line ] ); + } else { + chars += String.fromCharCode(lineArrayLength); + lineHash[line] = lineArrayLength; + lineArray[lineArrayLength++] = line; + } + } + return chars; + } + + chars1 = diffLinesToCharsMunge(text1); + chars2 = diffLinesToCharsMunge(text2); + return { + chars1: chars1, + chars2: chars2, + lineArray: lineArray + }; + }; + + /** + * Rehydrate the text in a diff from a string of line hashes to real lines of + * text. + * @param {!Array.} diffs Array of diff tuples. + * @param {!Array.} lineArray Array of unique strings. + * @private + */ + DiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) { + var x, chars, text, y; + for ( x = 0; x < diffs.length; x++ ) { + chars = diffs[x][1]; + text = []; + for ( y = 0; y < chars.length; y++ ) { + text[y] = lineArray[chars.charCodeAt(y)]; + } + diffs[x][1] = text.join(""); + } + }; + + /** + * Reorder and merge like edit sections. Merge equalities. + * Any edit section can move as long as it doesn't cross an equality. + * @param {!Array.} diffs Array of diff tuples. + */ + DiffMatchPatch.prototype.diffCleanupMerge = function(diffs) { + var pointer, countDelete, countInsert, textInsert, textDelete, + commonlength, changes; + diffs.push( [ DIFF_EQUAL, "" ] ); // Add a dummy entry at the end. + pointer = 0; + countDelete = 0; + countInsert = 0; + textDelete = ""; + textInsert = ""; + commonlength; + while (pointer < diffs.length) { + switch ( diffs[ pointer ][ 0 ] ) { + case DIFF_INSERT: + countInsert++; + textInsert += diffs[pointer][1]; + pointer++; + break; + case DIFF_DELETE: + countDelete++; + textDelete += diffs[pointer][1]; + pointer++; + break; + case DIFF_EQUAL: + // Upon reaching an equality, check for prior redundancies. + if (countDelete + countInsert > 1) { + if (countDelete !== 0 && countInsert !== 0) { + // Factor out any common prefixies. + commonlength = this.diffCommonPrefix(textInsert, textDelete); + if (commonlength !== 0) { + if ((pointer - countDelete - countInsert) > 0 && + diffs[pointer - countDelete - countInsert - 1][0] === + DIFF_EQUAL) { + diffs[pointer - countDelete - countInsert - 1][1] += + textInsert.substring(0, commonlength); + } else { + diffs.splice( 0, 0, [ DIFF_EQUAL, + textInsert.substring( 0, commonlength ) + ] ); + pointer++; + } + textInsert = textInsert.substring(commonlength); + textDelete = textDelete.substring(commonlength); + } + // Factor out any common suffixies. + commonlength = this.diffCommonSuffix(textInsert, textDelete); + if (commonlength !== 0) { + diffs[pointer][1] = textInsert.substring(textInsert.length - + commonlength) + diffs[pointer][1]; + textInsert = textInsert.substring(0, textInsert.length - + commonlength); + textDelete = textDelete.substring(0, textDelete.length - + commonlength); + } + } + // Delete the offending records and add the merged ones. + if (countDelete === 0) { + diffs.splice( pointer - countInsert, + countDelete + countInsert, [ DIFF_INSERT, textInsert ] ); + } else if (countInsert === 0) { + diffs.splice( pointer - countDelete, + countDelete + countInsert, [ DIFF_DELETE, textDelete ] ); + } else { + diffs.splice( pointer - countDelete - countInsert, + countDelete + countInsert, [ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ] ); + } + pointer = pointer - countDelete - countInsert + + (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1; + } else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) { + // Merge this equality with the previous one. + diffs[pointer - 1][1] += diffs[pointer][1]; + diffs.splice(pointer, 1); + } else { + pointer++; + } + countInsert = 0; + countDelete = 0; + textDelete = ""; + textInsert = ""; + break; + } + } + if (diffs[diffs.length - 1][1] === "") { + diffs.pop(); // Remove the dummy entry at the end. + } + + // Second pass: look for single edits surrounded on both sides by equalities + // which can be shifted sideways to eliminate an equality. + // e.g: ABAC -> ABAC + changes = false; + pointer = 1; + // Intentionally ignore the first and last element (don't need checking). + while (pointer < diffs.length - 1) { + if (diffs[pointer - 1][0] === DIFF_EQUAL && + diffs[pointer + 1][0] === DIFF_EQUAL) { + // This is a single edit surrounded by equalities. + if ( diffs[ pointer ][ 1 ].substring( diffs[ pointer ][ 1 ].length - + diffs[ pointer - 1 ][ 1 ].length ) === diffs[ pointer - 1 ][ 1 ] ) { + // Shift the edit over the previous equality. + diffs[pointer][1] = diffs[pointer - 1][1] + + diffs[pointer][1].substring(0, diffs[pointer][1].length - + diffs[pointer - 1][1].length); + diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1]; + diffs.splice(pointer - 1, 1); + changes = true; + } else if ( diffs[ pointer ][ 1 ].substring( 0, diffs[ pointer + 1 ][ 1 ].length ) === + diffs[ pointer + 1 ][ 1 ] ) { + // Shift the edit over the next equality. + diffs[pointer - 1][1] += diffs[pointer + 1][1]; + diffs[pointer][1] = + diffs[pointer][1].substring(diffs[pointer + 1][1].length) + + diffs[pointer + 1][1]; + diffs.splice(pointer + 1, 1); + changes = true; + } + } + pointer++; + } + // If shifts were made, the diff needs reordering and another shift sweep. + if (changes) { + this.diffCleanupMerge(diffs); + } + }; + + return function(o, n) { + var diff, output, text; + diff = new DiffMatchPatch(); + output = diff.DiffMain(o, n); + //console.log(output); + diff.diffCleanupEfficiency(output); + text = diff.diffPrettyHtml(output); + + return text; + }; +}()); +// jscs:enable + +(function() { + +// Deprecated QUnit.init - Ref #530 +// Re-initialize the configuration options +QUnit.init = function() { + var tests, banner, result, qunit, + config = QUnit.config; + + config.stats = { all: 0, bad: 0 }; + config.moduleStats = { all: 0, bad: 0 }; + config.started = 0; + config.updateRate = 1000; + config.blocking = false; + config.autostart = true; + config.autorun = false; + config.filter = ""; + config.queue = []; + + // Return on non-browser environments + // This is necessary to not break on node tests + if ( typeof window === "undefined" ) { + return; } - return function( o, n ) { - o = o.replace( /\s+$/, "" ); - n = n.replace( /\s+$/, "" ); + qunit = id( "qunit" ); + if ( qunit ) { + qunit.innerHTML = + "

      " + escapeText( document.title ) + "

      " + + "

      " + + "
      " + + "

      " + + "
        "; + } - var i, pre, - str = "", - out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ), - oSpace = o.match(/\s+/g), - nSpace = n.match(/\s+/g); + tests = id( "qunit-tests" ); + banner = id( "qunit-banner" ); + result = id( "qunit-testresult" ); - if ( oSpace == null ) { - oSpace = [ " " ]; - } - else { - oSpace.push( " " ); - } + if ( tests ) { + tests.innerHTML = ""; + } - if ( nSpace == null ) { - nSpace = [ " " ]; - } - else { - nSpace.push( " " ); - } + if ( banner ) { + banner.className = ""; + } - if ( out.n.length === 0 ) { - for ( i = 0; i < out.o.length; i++ ) { - str += "" + out.o[i] + oSpace[i] + ""; - } - } - else { - if ( out.n[0].text == null ) { - for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) { - str += "" + out.o[n] + oSpace[n] + ""; - } - } + if ( result ) { + result.parentNode.removeChild( result ); + } - for ( i = 0; i < out.n.length; i++ ) { - if (out.n[i].text == null) { - str += "" + out.n[i] + nSpace[i] + ""; - } - else { - // `pre` initialized at top of scope - pre = ""; + if ( tests ) { + result = document.createElement( "p" ); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore( result, tests ); + result.innerHTML = "Running...
         "; + } +}; - for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) { - pre += "" + out.o[n] + oSpace[n] + ""; - } - str += " " + out.n[i].text + nSpace[i] + pre; - } - } - } - - return str; - }; -}()); - -// for CommonJS environments, export everything -if ( typeof exports !== "undefined" ) { - extend( exports, QUnit.constructor.prototype ); +// Don't load the HTML Reporter on non-Browser environments +if ( typeof window === "undefined" ) { + return; } -// get at whatever the global object is, like window in browsers -}( (function() {return this;}.call()) )); +var config = QUnit.config, + hasOwn = Object.prototype.hasOwnProperty, + defined = { + document: window.document !== undefined, + sessionStorage: (function() { + var x = "qunit-test-string"; + try { + sessionStorage.setItem( x, x ); + sessionStorage.removeItem( x ); + return true; + } catch ( e ) { + return false; + } + }()) + }, + modulesList = []; + +/** +* Escape text for attribute or text content. +*/ +function escapeText( s ) { + if ( !s ) { + return ""; + } + s = s + ""; + + // Both single quotes and double quotes (for attributes) + return s.replace( /['"<>&]/g, function( s ) { + switch ( s ) { + case "'": + return "'"; + case "\"": + return """; + case "<": + return "<"; + case ">": + return ">"; + case "&": + return "&"; + } + }); +} + +/** + * @param {HTMLElement} elem + * @param {string} type + * @param {Function} fn + */ +function addEvent( elem, type, fn ) { + if ( elem.addEventListener ) { + + // Standards-based browsers + elem.addEventListener( type, fn, false ); + } else if ( elem.attachEvent ) { + + // support: IE <9 + elem.attachEvent( "on" + type, function() { + var event = window.event; + if ( !event.target ) { + event.target = event.srcElement || document; + } + + fn.call( elem, event ); + }); + } +} + +/** + * @param {Array|NodeList} elems + * @param {string} type + * @param {Function} fn + */ +function addEvents( elems, type, fn ) { + var i = elems.length; + while ( i-- ) { + addEvent( elems[ i ], type, fn ); + } +} + +function hasClass( elem, name ) { + return ( " " + elem.className + " " ).indexOf( " " + name + " " ) >= 0; +} + +function addClass( elem, name ) { + if ( !hasClass( elem, name ) ) { + elem.className += ( elem.className ? " " : "" ) + name; + } +} + +function toggleClass( elem, name ) { + if ( hasClass( elem, name ) ) { + removeClass( elem, name ); + } else { + addClass( elem, name ); + } +} + +function removeClass( elem, name ) { + var set = " " + elem.className + " "; + + // Class name may appear multiple times + while ( set.indexOf( " " + name + " " ) >= 0 ) { + set = set.replace( " " + name + " ", " " ); + } + + // trim for prettiness + elem.className = typeof set.trim === "function" ? set.trim() : set.replace( /^\s+|\s+$/g, "" ); +} + +function id( name ) { + return defined.document && document.getElementById && document.getElementById( name ); +} + +function getUrlConfigHtml() { + var i, j, val, + escaped, escapedTooltip, + selection = false, + len = config.urlConfig.length, + urlConfigHtml = ""; + + for ( i = 0; i < len; i++ ) { + val = config.urlConfig[ i ]; + if ( typeof val === "string" ) { + val = { + id: val, + label: val + }; + } + + escaped = escapeText( val.id ); + escapedTooltip = escapeText( val.tooltip ); + + if ( config[ val.id ] === undefined ) { + config[ val.id ] = QUnit.urlParams[ val.id ]; + } + + if ( !val.value || typeof val.value === "string" ) { + urlConfigHtml += ""; + } else { + urlConfigHtml += ""; + } + } + + return urlConfigHtml; +} + +// Handle "click" events on toolbar checkboxes and "change" for select menus. +// Updates the URL with the new state of `config.urlConfig` values. +function toolbarChanged() { + var updatedUrl, value, + field = this, + params = {}; + + // Detect if field is a select menu or a checkbox + if ( "selectedIndex" in field ) { + value = field.options[ field.selectedIndex ].value || undefined; + } else { + value = field.checked ? ( field.defaultValue || true ) : undefined; + } + + params[ field.name ] = value; + updatedUrl = setUrl( params ); + + if ( "hidepassed" === field.name && "replaceState" in window.history ) { + config[ field.name ] = value || false; + if ( value ) { + addClass( id( "qunit-tests" ), "hidepass" ); + } else { + removeClass( id( "qunit-tests" ), "hidepass" ); + } + + // It is not necessary to refresh the whole page + window.history.replaceState( null, "", updatedUrl ); + } else { + window.location = updatedUrl; + } +} + +function setUrl( params ) { + var key, + querystring = "?"; + + params = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params ); + + for ( key in params ) { + if ( hasOwn.call( params, key ) ) { + if ( params[ key ] === undefined ) { + continue; + } + querystring += encodeURIComponent( key ); + if ( params[ key ] !== true ) { + querystring += "=" + encodeURIComponent( params[ key ] ); + } + querystring += "&"; + } + } + return location.protocol + "//" + location.host + + location.pathname + querystring.slice( 0, -1 ); +} + +function applyUrlParams() { + var selectedModule, + modulesList = id( "qunit-modulefilter" ), + filter = id( "qunit-filter-input" ).value; + + selectedModule = modulesList ? + decodeURIComponent( modulesList.options[ modulesList.selectedIndex ].value ) : + undefined; + + window.location = setUrl({ + module: ( selectedModule === "" ) ? undefined : selectedModule, + filter: ( filter === "" ) ? undefined : filter, + + // Remove testId filter + testId: undefined + }); +} + +function toolbarUrlConfigContainer() { + var urlConfigContainer = document.createElement( "span" ); + + urlConfigContainer.innerHTML = getUrlConfigHtml(); + addClass( urlConfigContainer, "qunit-url-config" ); + + // For oldIE support: + // * Add handlers to the individual elements instead of the container + // * Use "click" instead of "change" for checkboxes + addEvents( urlConfigContainer.getElementsByTagName( "input" ), "click", toolbarChanged ); + addEvents( urlConfigContainer.getElementsByTagName( "select" ), "change", toolbarChanged ); + + return urlConfigContainer; +} + +function toolbarLooseFilter() { + var filter = document.createElement( "form" ), + label = document.createElement( "label" ), + input = document.createElement( "input" ), + button = document.createElement( "button" ); + + addClass( filter, "qunit-filter" ); + + label.innerHTML = "Filter: "; + + input.type = "text"; + input.value = config.filter || ""; + input.name = "filter"; + input.id = "qunit-filter-input"; + + button.innerHTML = "Go"; + + label.appendChild( input ); + + filter.appendChild( label ); + filter.appendChild( button ); + addEvent( filter, "submit", function( ev ) { + applyUrlParams(); + + if ( ev && ev.preventDefault ) { + ev.preventDefault(); + } + + return false; + }); + + return filter; +} + +function toolbarModuleFilterHtml() { + var i, + moduleFilterHtml = ""; + + if ( !modulesList.length ) { + return false; + } + + modulesList.sort(function( a, b ) { + return a.localeCompare( b ); + }); + + moduleFilterHtml += "" + + ""; + + return moduleFilterHtml; +} + +function toolbarModuleFilter() { + var toolbar = id( "qunit-testrunner-toolbar" ), + moduleFilter = document.createElement( "span" ), + moduleFilterHtml = toolbarModuleFilterHtml(); + + if ( !toolbar || !moduleFilterHtml ) { + return false; + } + + moduleFilter.setAttribute( "id", "qunit-modulefilter-container" ); + moduleFilter.innerHTML = moduleFilterHtml; + + addEvent( moduleFilter.lastChild, "change", applyUrlParams ); + + toolbar.appendChild( moduleFilter ); +} + +function appendToolbar() { + var toolbar = id( "qunit-testrunner-toolbar" ); + + if ( toolbar ) { + toolbar.appendChild( toolbarUrlConfigContainer() ); + toolbar.appendChild( toolbarLooseFilter() ); + } +} + +function appendHeader() { + var header = id( "qunit-header" ); + + if ( header ) { + header.innerHTML = "" + header.innerHTML + " "; + } +} + +function appendBanner() { + var banner = id( "qunit-banner" ); + + if ( banner ) { + banner.className = ""; + } +} + +function appendTestResults() { + var tests = id( "qunit-tests" ), + result = id( "qunit-testresult" ); + + if ( result ) { + result.parentNode.removeChild( result ); + } + + if ( tests ) { + tests.innerHTML = ""; + result = document.createElement( "p" ); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore( result, tests ); + result.innerHTML = "Running...
         "; + } +} + +function storeFixture() { + var fixture = id( "qunit-fixture" ); + if ( fixture ) { + config.fixture = fixture.innerHTML; + } +} + +function appendUserAgent() { + var userAgent = id( "qunit-userAgent" ); + + if ( userAgent ) { + userAgent.innerHTML = ""; + userAgent.appendChild( + document.createTextNode( + "QUnit " + QUnit.version + "; " + navigator.userAgent + ) + ); + } +} + +function appendTestsList( modules ) { + var i, l, x, z, test, moduleObj; + + for ( i = 0, l = modules.length; i < l; i++ ) { + moduleObj = modules[ i ]; + + if ( moduleObj.name ) { + modulesList.push( moduleObj.name ); + } + + for ( x = 0, z = moduleObj.tests.length; x < z; x++ ) { + test = moduleObj.tests[ x ]; + + appendTest( test.name, test.testId, moduleObj.name ); + } + } +} + +function appendTest( name, testId, moduleName ) { + var title, rerunTrigger, testBlock, assertList, + tests = id( "qunit-tests" ); + + if ( !tests ) { + return; + } + + title = document.createElement( "strong" ); + title.innerHTML = getNameHtml( name, moduleName ); + + rerunTrigger = document.createElement( "a" ); + rerunTrigger.innerHTML = "Rerun"; + rerunTrigger.href = setUrl({ testId: testId }); + + testBlock = document.createElement( "li" ); + testBlock.appendChild( title ); + testBlock.appendChild( rerunTrigger ); + testBlock.id = "qunit-test-output-" + testId; + + assertList = document.createElement( "ol" ); + assertList.className = "qunit-assert-list"; + + testBlock.appendChild( assertList ); + + tests.appendChild( testBlock ); +} + +// HTML Reporter initialization and load +QUnit.begin(function( details ) { + var qunit = id( "qunit" ); + + // Fixture is the only one necessary to run without the #qunit element + storeFixture(); + + if ( qunit ) { + qunit.innerHTML = + "

        " + escapeText( document.title ) + "

        " + + "

        " + + "
        " + + "

        " + + "
          "; + } + + appendHeader(); + appendBanner(); + appendTestResults(); + appendUserAgent(); + appendToolbar(); + appendTestsList( details.modules ); + toolbarModuleFilter(); + + if ( qunit && config.hidepassed ) { + addClass( qunit.lastChild, "hidepass" ); + } +}); + +QUnit.done(function( details ) { + var i, key, + banner = id( "qunit-banner" ), + tests = id( "qunit-tests" ), + html = [ + "Tests completed in ", + details.runtime, + " milliseconds.
          ", + "", + details.passed, + " assertions of ", + details.total, + " passed, ", + details.failed, + " failed." + ].join( "" ); + + if ( banner ) { + banner.className = details.failed ? "qunit-fail" : "qunit-pass"; + } + + if ( tests ) { + id( "qunit-testresult" ).innerHTML = html; + } + + if ( config.altertitle && defined.document && document.title ) { + + // show ✖ for good, ✔ for bad suite result in title + // use escape sequences in case file gets loaded with non-utf-8-charset + document.title = [ + ( details.failed ? "\u2716" : "\u2714" ), + document.title.replace( /^[\u2714\u2716] /i, "" ) + ].join( " " ); + } + + // clear own sessionStorage items if all tests passed + if ( config.reorder && defined.sessionStorage && details.failed === 0 ) { + for ( i = 0; i < sessionStorage.length; i++ ) { + key = sessionStorage.key( i++ ); + if ( key.indexOf( "qunit-test-" ) === 0 ) { + sessionStorage.removeItem( key ); + } + } + } + + // scroll back to top to show results + if ( config.scrolltop && window.scrollTo ) { + window.scrollTo( 0, 0 ); + } +}); + +function getNameHtml( name, module ) { + var nameHtml = ""; + + if ( module ) { + nameHtml = "" + escapeText( module ) + ": "; + } + + nameHtml += "" + escapeText( name ) + ""; + + return nameHtml; +} + +QUnit.testStart(function( details ) { + var running, testBlock, bad; + + testBlock = id( "qunit-test-output-" + details.testId ); + if ( testBlock ) { + testBlock.className = "running"; + } else { + + // Report later registered tests + appendTest( details.name, details.testId, details.module ); + } + + running = id( "qunit-testresult" ); + if ( running ) { + bad = QUnit.config.reorder && defined.sessionStorage && + +sessionStorage.getItem( "qunit-test-" + details.module + "-" + details.name ); + + running.innerHTML = ( bad ? + "Rerunning previously failed test:
          " : + "Running:
          " ) + + getNameHtml( details.name, details.module ); + } + +}); + +QUnit.log(function( details ) { + var assertList, assertLi, + message, expected, actual, + testItem = id( "qunit-test-output-" + details.testId ); + + if ( !testItem ) { + return; + } + + message = escapeText( details.message ) || ( details.result ? "okay" : "failed" ); + message = "" + message + ""; + message += "@ " + details.runtime + " ms"; + + // pushFailure doesn't provide details.expected + // when it calls, it's implicit to also not show expected and diff stuff + // Also, we need to check details.expected existence, as it can exist and be undefined + if ( !details.result && hasOwn.call( details, "expected" ) ) { + expected = escapeText( QUnit.dump.parse( details.expected ) ); + actual = escapeText( QUnit.dump.parse( details.actual ) ); + message += ""; + + if ( actual !== expected ) { + message += "" + + ""; + } else { + if ( expected.indexOf( "[object Array]" ) !== -1 || + expected.indexOf( "[object Object]" ) !== -1 ) { + message += ""; + } + } + + if ( details.source ) { + message += ""; + } + + message += "
          Expected:
          " +
          +			expected +
          +			"
          Result:
          " +
          +				actual + "
          Diff:
          " +
          +				QUnit.diff( expected, actual ) + "
          Message: " + + "Diff suppressed as the depth of object is more than current max depth (" + + QUnit.config.maxDepth + ").

          Hint: Use QUnit.dump.maxDepth to " + + " run with a higher max depth or " + + "Rerun without max depth.

          Source:
          " +
          +				escapeText( details.source ) + "
          "; + + // this occours when pushFailure is set and we have an extracted stack trace + } else if ( !details.result && details.source ) { + message += "" + + "" + + "
          Source:
          " +
          +			escapeText( details.source ) + "
          "; + } + + assertList = testItem.getElementsByTagName( "ol" )[ 0 ]; + + assertLi = document.createElement( "li" ); + assertLi.className = details.result ? "pass" : "fail"; + assertLi.innerHTML = message; + assertList.appendChild( assertLi ); +}); + +QUnit.testDone(function( details ) { + var testTitle, time, testItem, assertList, + good, bad, testCounts, skipped, + tests = id( "qunit-tests" ); + + if ( !tests ) { + return; + } + + testItem = id( "qunit-test-output-" + details.testId ); + + assertList = testItem.getElementsByTagName( "ol" )[ 0 ]; + + good = details.passed; + bad = details.failed; + + // store result when possible + if ( config.reorder && defined.sessionStorage ) { + if ( bad ) { + sessionStorage.setItem( "qunit-test-" + details.module + "-" + details.name, bad ); + } else { + sessionStorage.removeItem( "qunit-test-" + details.module + "-" + details.name ); + } + } + + if ( bad === 0 ) { + addClass( assertList, "qunit-collapsed" ); + } + + // testItem.firstChild is the test name + testTitle = testItem.firstChild; + + testCounts = bad ? + "" + bad + ", " + "" + good + ", " : + ""; + + testTitle.innerHTML += " (" + testCounts + + details.assertions.length + ")"; + + if ( details.skipped ) { + testItem.className = "skipped"; + skipped = document.createElement( "em" ); + skipped.className = "qunit-skipped-label"; + skipped.innerHTML = "skipped"; + testItem.insertBefore( skipped, testTitle ); + } else { + addEvent( testTitle, "click", function() { + toggleClass( assertList, "qunit-collapsed" ); + }); + + testItem.className = bad ? "fail" : "pass"; + + time = document.createElement( "span" ); + time.className = "runtime"; + time.innerHTML = details.runtime + " ms"; + testItem.insertBefore( time, assertList ); + } +}); + +if ( defined.document ) { + if ( document.readyState === "complete" ) { + QUnit.load(); + } else { + addEvent( window, "load", QUnit.load ); + } +} else { + config.pageLoaded = true; + config.autorun = true; +} + +})(); diff --git a/vendor/underscore/test/vendor/runner.js b/vendor/underscore/test/vendor/runner.js deleted file mode 100644 index 4b1d38b1b..000000000 --- a/vendor/underscore/test/vendor/runner.js +++ /dev/null @@ -1,127 +0,0 @@ -/* - * QtWebKit-powered headless test runner using PhantomJS - * - * PhantomJS binaries: http://phantomjs.org/download.html - * Requires PhantomJS 1.6+ (1.7+ recommended) - * - * Run with: - * phantomjs runner.js [url-of-your-qunit-testsuite] - * - * e.g. - * phantomjs runner.js http://localhost/qunit/test/index.html - */ - -/*jshint latedef:false */ -/*global phantom:false, require:false, console:false, window:false, QUnit:false */ - -(function() { - 'use strict'; - - var args = require('system').args; - - // arg[0]: scriptName, args[1...]: arguments - if (args.length !== 2) { - console.error('Usage:\n phantomjs runner.js [url-of-your-qunit-testsuite]'); - phantom.exit(1); - } - - var url = args[1], - page = require('webpage').create(); - - // Route `console.log()` calls from within the Page context to the main Phantom context (i.e. current `this`) - page.onConsoleMessage = function(msg) { - console.log(msg); - }; - - page.onInitialized = function() { - page.evaluate(addLogging); - }; - - page.onCallback = function(message) { - var result, - failed; - - if (message) { - if (message.name === 'QUnit.done') { - result = message.data; - failed = !result || result.failed; - - phantom.exit(failed ? 1 : 0); - } - } - }; - - page.open(url, function(status) { - if (status !== 'success') { - console.error('Unable to access network: ' + status); - phantom.exit(1); - } else { - // Cannot do this verification with the 'DOMContentLoaded' handler because it - // will be too late to attach it if a page does not have any script tags. - var qunitMissing = page.evaluate(function() { return (typeof QUnit === 'undefined' || !QUnit); }); - if (qunitMissing) { - console.error('The `QUnit` object is not present on this page.'); - phantom.exit(1); - } - - // Do nothing... the callback mechanism will handle everything! - } - }); - - function addLogging() { - window.document.addEventListener('DOMContentLoaded', function() { - var current_test_assertions = []; - - QUnit.log(function(details) { - var response; - - // Ignore passing assertions - if (details.result) { - return; - } - - response = details.message || ''; - - if (typeof details.expected !== 'undefined') { - if (response) { - response += ', '; - } - - response += 'expected: ' + details.expected + ', but was: ' + details.actual; - if (details.source) { - response += "\n" + details.source; - } - } - - current_test_assertions.push('Failed assertion: ' + response); - }); - - QUnit.testDone(function(result) { - var i, - len, - name = result.module + ': ' + result.name; - - if (result.failed) { - console.log('Test failed: ' + name); - - for (i = 0, len = current_test_assertions.length; i < len; i++) { - console.log(' ' + current_test_assertions[i]); - } - } - - current_test_assertions.length = 0; - }); - - QUnit.done(function(result) { - console.log('Took ' + result.runtime + 'ms to run ' + result.total + ' tests. ' + result.passed + ' passed, ' + result.failed + ' failed.'); - - if (typeof window.callPhantom === 'function') { - window.callPhantom({ - 'name': 'QUnit.done', - 'data': result - }); - } - }); - }, false); - } -})(); diff --git a/vendor/underscore/underscore-min.js b/vendor/underscore/underscore-min.js index d22f881bc..f01025b7b 100644 --- a/vendor/underscore/underscore-min.js +++ b/vendor/underscore/underscore-min.js @@ -1,6 +1,6 @@ -// Underscore.js 1.5.2 +// Underscore.js 1.8.3 // http://underscorejs.org -// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license. -(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?(this._wrapped=n,void 0):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.5.2";var A=j.each=j.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a=j.keys(n),u=0,i=a.length;i>u;u++)if(t.call(e,n[a[u]],a[u],n)===r)return};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var E="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(E);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(E);return r},j.find=j.detect=function(n,t,r){var e;return O(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var O=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:O(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,function(n){return n[t]})},j.where=function(n,t,r){return j.isEmpty(t)?r?void 0:[]:j[r?"find":"filter"](n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},j.findWhere=function(n,t){return j.where(n,t,!0)},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);if(!t&&j.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>e.computed&&(e={value:n,computed:a})}),e.value},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);if(!t&&j.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;ae||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={},i=null==r?j.identity:k(r);return A(t,function(r,a){var o=i.call(e,r,a,t);n(u,o,r)}),u}};j.groupBy=F(function(n,t,r){(j.has(n,t)?n[t]:n[t]=[]).push(r)}),j.indexBy=F(function(n,t,r){n[t]=r}),j.countBy=F(function(n,t){j.has(n,t)?n[t]++:n[t]=1}),j.sortedIndex=function(n,t,r,e){r=null==r?j.identity:k(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])=0})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var R=function(){};j.bind=function(n,t){var r,e;if(_&&n.bind===_)return _.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));R.prototype=n.prototype;var u=new R;R.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){return n.apply(this,t.concat(o.call(arguments)))}},j.bindAll=function(n){var t=o.call(arguments,1);if(0===t.length)throw new Error("bindAll must be passed function names");return A(t,function(t){n[t]=j.bind(n[t],n)}),n},j.memoize=function(n,t){var r={};return t||(t=j.identity),function(){var e=t.apply(this,arguments);return j.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},j.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},j.defer=function(n){return j.delay.apply(j,[n,1].concat(o.call(arguments,1)))},j.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var c=function(){o=r.leading===!1?0:new Date,a=null,i=n.apply(e,u)};return function(){var l=new Date;o||r.leading!==!1||(o=l);var f=t-(l-o);return e=this,u=arguments,0>=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u)):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u,i,a,o;return function(){i=this,u=arguments,a=new Date;var c=function(){var l=new Date-a;t>l?e=setTimeout(c,t-l):(e=null,r||(o=n.apply(i,u)))},l=r&&!e;return e||(e=setTimeout(c,t)),l&&(o=n.apply(i,u)),o}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=w||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},j.pairs=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},j.invert=function(n){for(var t={},r=j.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))};var I={escape:{"&":"&","<":"<",">":">",'"':""","'":"'"}};I.unescape=j.invert(I.escape);var T={escape:new RegExp("["+j.keys(I.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(I.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(T[n],function(t){return I[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(D,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var z=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this); +(function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if("number"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.hasOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):u._=m,m.VERSION="1.8.3";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}},j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w("length"),k=function(n){var t=O(n);return"number"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),("number"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.call(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return function(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t),i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return"[object Array]"===s.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return s.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var K=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,L=function(n){return"\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||"obj";return c.source="function("+f+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each(["concat","join","slice"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this); //# sourceMappingURL=underscore-min.map \ No newline at end of file diff --git a/vendor/underscore/underscore-min.map b/vendor/underscore/underscore-min.map index 4fbe0ba3c..cf356bf9a 100644 --- a/vendor/underscore/underscore-min.map +++ b/vendor/underscore/underscore-min.map @@ -1 +1 @@ -{"version":3,"file":"underscore-min.js","sources":["underscore.js"],"names":["root","this","previousUnderscore","_","breaker","ArrayProto","Array","prototype","ObjProto","Object","FuncProto","Function","push","slice","concat","toString","hasOwnProperty","nativeForEach","forEach","nativeMap","map","nativeReduce","reduce","nativeReduceRight","reduceRight","nativeFilter","filter","nativeEvery","every","nativeSome","some","nativeIndexOf","indexOf","nativeLastIndexOf","lastIndexOf","nativeIsArray","isArray","nativeKeys","keys","nativeBind","bind","obj","_wrapped","exports","module","VERSION","each","iterator","context","length","i","call","collect","results","value","index","list","reduceError","foldl","inject","memo","initial","arguments","TypeError","foldr","find","detect","result","any","select","reject","all","identity","contains","include","target","invoke","method","args","isFunc","isFunction","apply","pluck","key","where","attrs","first","isEmpty","findWhere","max","Math","Infinity","computed","min","shuffle","rand","shuffled","random","sample","n","guard","lookupIterator","sortBy","criteria","sort","left","right","a","b","group","behavior","groupBy","has","indexBy","countBy","sortedIndex","array","low","high","mid","toArray","values","size","head","take","last","rest","tail","drop","compact","flatten","input","shallow","output","isArguments","without","difference","uniq","unique","isSorted","seen","union","intersection","item","other","zip","object","from","hasIndex","range","start","stop","step","ceil","idx","ctor","func","bound","self","partial","bindAll","funcs","Error","f","memoize","hasher","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","Date","now","remaining","clearTimeout","trailing","debounce","immediate","timestamp","callNow","once","ran","wrap","wrapper","compose","after","times","pairs","invert","functions","methods","names","extend","source","prop","pick","copy","omit","defaults","clone","isObject","tap","interceptor","eq","aStack","bStack","className","String","global","multiline","ignoreCase","aCtor","constructor","bCtor","pop","isEqual","isString","isElement","nodeType","name","isFinite","isNaN","parseFloat","isNumber","isBoolean","isNull","isUndefined","noConflict","accum","floor","entityMap","escape","&","<",">","\"","'","unescape","entityRegexes","RegExp","join","string","replace","match","property","mixin","idCounter","uniqueId","prefix","id","templateSettings","evaluate","interpolate","noMatch","escapes","\\","\r","\n","\t","
","
","escaper","template","text","data","settings","render","matcher","offset","variable","e","chain","_chain"],"mappings":";;;;CAKA,WAME,GAAIA,GAAOC,KAGPC,EAAqBF,EAAKG,EAG1BC,KAGAC,EAAaC,MAAMC,UAAWC,EAAWC,OAAOF,UAAWG,EAAYC,SAASJ,UAIlFK,EAAmBP,EAAWO,KAC9BC,EAAmBR,EAAWQ,MAC9BC,EAAmBT,EAAWS,OAC9BC,EAAmBP,EAASO,SAC5BC,EAAmBR,EAASQ,eAK5BC,EAAqBZ,EAAWa,QAChCC,EAAqBd,EAAWe,IAChCC,EAAqBhB,EAAWiB,OAChCC,EAAqBlB,EAAWmB,YAChCC,EAAqBpB,EAAWqB,OAChCC,EAAqBtB,EAAWuB,MAChCC,EAAqBxB,EAAWyB,KAChCC,EAAqB1B,EAAW2B,QAChCC,EAAqB5B,EAAW6B,YAChCC,EAAqB7B,MAAM8B,QAC3BC,EAAqB5B,OAAO6B,KAC5BC,EAAqB7B,EAAU8B,KAG7BrC,EAAI,SAASsC,GACf,MAAIA,aAAetC,GAAUsC,EACvBxC,eAAgBE,IACtBF,KAAKyC,SAAWD,EAAhBxC,QADiC,GAAIE,GAAEsC,GAQlB,oBAAZE,UACa,mBAAXC,SAA0BA,OAAOD,UAC1CA,QAAUC,OAAOD,QAAUxC,GAE7BwC,QAAQxC,EAAIA,GAEZH,EAAKG,EAAIA,EAIXA,EAAE0C,QAAU,OAQZ,IAAIC,GAAO3C,EAAE2C,KAAO3C,EAAEe,QAAU,SAASuB,EAAKM,EAAUC,GACtD,GAAW,MAAPP,EACJ,GAAIxB,GAAiBwB,EAAIvB,UAAYD,EACnCwB,EAAIvB,QAAQ6B,EAAUC,OACjB,IAAIP,EAAIQ,UAAYR,EAAIQ,QAC7B,IAAK,GAAIC,GAAI,EAAGD,EAASR,EAAIQ,OAAYA,EAAJC,EAAYA,IAC/C,GAAIH,EAASI,KAAKH,EAASP,EAAIS,GAAIA,EAAGT,KAASrC,EAAS,WAI1D,KAAK,GADDkC,GAAOnC,EAAEmC,KAAKG,GACTS,EAAI,EAAGD,EAASX,EAAKW,OAAYA,EAAJC,EAAYA,IAChD,GAAIH,EAASI,KAAKH,EAASP,EAAIH,EAAKY,IAAKZ,EAAKY,GAAIT,KAASrC,EAAS,OAO1ED,GAAEiB,IAAMjB,EAAEiD,QAAU,SAASX,EAAKM,EAAUC,GAC1C,GAAIK,KACJ,OAAW,OAAPZ,EAAoBY,EACpBlC,GAAasB,EAAIrB,MAAQD,EAAkBsB,EAAIrB,IAAI2B,EAAUC,IACjEF,EAAKL,EAAK,SAASa,EAAOC,EAAOC,GAC/BH,EAAQzC,KAAKmC,EAASI,KAAKH,EAASM,EAAOC,EAAOC,MAE7CH,GAGT,IAAII,GAAc,6CAIlBtD,GAAEmB,OAASnB,EAAEuD,MAAQvD,EAAEwD,OAAS,SAASlB,EAAKM,EAAUa,EAAMZ,GAC5D,GAAIa,GAAUC,UAAUb,OAAS,CAEjC,IADW,MAAPR,IAAaA,MACbpB,GAAgBoB,EAAInB,SAAWD,EAEjC,MADI2B,KAASD,EAAW5C,EAAEqC,KAAKO,EAAUC,IAClCa,EAAUpB,EAAInB,OAAOyB,EAAUa,GAAQnB,EAAInB,OAAOyB,EAU3D,IARAD,EAAKL,EAAK,SAASa,EAAOC,EAAOC,GAC1BK,EAIHD,EAAOb,EAASI,KAAKH,EAASY,EAAMN,EAAOC,EAAOC,IAHlDI,EAAON,EACPO,GAAU,MAKTA,EAAS,KAAM,IAAIE,WAAUN,EAClC,OAAOG,IAKTzD,EAAEqB,YAAcrB,EAAE6D,MAAQ,SAASvB,EAAKM,EAAUa,EAAMZ,GACtD,GAAIa,GAAUC,UAAUb,OAAS,CAEjC,IADW,MAAPR,IAAaA,MACblB,GAAqBkB,EAAIjB,cAAgBD,EAE3C,MADIyB,KAASD,EAAW5C,EAAEqC,KAAKO,EAAUC,IAClCa,EAAUpB,EAAIjB,YAAYuB,EAAUa,GAAQnB,EAAIjB,YAAYuB,EAErE,IAAIE,GAASR,EAAIQ,MACjB,IAAIA,KAAYA,EAAQ,CACtB,GAAIX,GAAOnC,EAAEmC,KAAKG,EAClBQ,GAASX,EAAKW,OAWhB,GATAH,EAAKL,EAAK,SAASa,EAAOC,EAAOC,GAC/BD,EAAQjB,EAAOA,IAAOW,KAAYA,EAC7BY,EAIHD,EAAOb,EAASI,KAAKH,EAASY,EAAMnB,EAAIc,GAAQA,EAAOC,IAHvDI,EAAOnB,EAAIc,GACXM,GAAU,MAKTA,EAAS,KAAM,IAAIE,WAAUN,EAClC,OAAOG,IAITzD,EAAE8D,KAAO9D,EAAE+D,OAAS,SAASzB,EAAKM,EAAUC,GAC1C,GAAImB,EAOJ,OANAC,GAAI3B,EAAK,SAASa,EAAOC,EAAOC,GAC9B,MAAIT,GAASI,KAAKH,EAASM,EAAOC,EAAOC,IACvCW,EAASb,GACF,GAFT,SAKKa,GAMThE,EAAEuB,OAASvB,EAAEkE,OAAS,SAAS5B,EAAKM,EAAUC,GAC5C,GAAIK,KACJ,OAAW,OAAPZ,EAAoBY,EACpB5B,GAAgBgB,EAAIf,SAAWD,EAAqBgB,EAAIf,OAAOqB,EAAUC,IAC7EF,EAAKL,EAAK,SAASa,EAAOC,EAAOC,GAC3BT,EAASI,KAAKH,EAASM,EAAOC,EAAOC,IAAOH,EAAQzC,KAAK0C,KAExDD,IAITlD,EAAEmE,OAAS,SAAS7B,EAAKM,EAAUC,GACjC,MAAO7C,GAAEuB,OAAOe,EAAK,SAASa,EAAOC,EAAOC,GAC1C,OAAQT,EAASI,KAAKH,EAASM,EAAOC,EAAOC,IAC5CR,IAML7C,EAAEyB,MAAQzB,EAAEoE,IAAM,SAAS9B,EAAKM,EAAUC,GACxCD,IAAaA,EAAW5C,EAAEqE,SAC1B,IAAIL,IAAS,CACb,OAAW,OAAP1B,EAAoB0B,EACpBxC,GAAec,EAAIb,QAAUD,EAAoBc,EAAIb,MAAMmB,EAAUC,IACzEF,EAAKL,EAAK,SAASa,EAAOC,EAAOC,GAC/B,OAAMW,EAASA,GAAUpB,EAASI,KAAKH,EAASM,EAAOC,EAAOC,IAA9D,OAA6EpD,MAEtE+D,GAMX,IAAIC,GAAMjE,EAAE2B,KAAO3B,EAAEiE,IAAM,SAAS3B,EAAKM,EAAUC,GACjDD,IAAaA,EAAW5C,EAAEqE,SAC1B,IAAIL,IAAS,CACb,OAAW,OAAP1B,EAAoB0B,EACpBtC,GAAcY,EAAIX,OAASD,EAAmBY,EAAIX,KAAKiB,EAAUC,IACrEF,EAAKL,EAAK,SAASa,EAAOC,EAAOC,GAC/B,MAAIW,KAAWA,EAASpB,EAASI,KAAKH,EAASM,EAAOC,EAAOC,IAAepD,EAA5E,WAEO+D,GAKXhE,GAAEsE,SAAWtE,EAAEuE,QAAU,SAASjC,EAAKkC,GACrC,MAAW,OAAPlC,GAAoB,EACpBV,GAAiBU,EAAIT,UAAYD,EAAsBU,EAAIT,QAAQ2C,KAAY,EAC5EP,EAAI3B,EAAK,SAASa,GACvB,MAAOA,KAAUqB,KAKrBxE,EAAEyE,OAAS,SAASnC,EAAKoC,GACvB,GAAIC,GAAOjE,EAAMsC,KAAKW,UAAW,GAC7BiB,EAAS5E,EAAE6E,WAAWH,EAC1B,OAAO1E,GAAEiB,IAAIqB,EAAK,SAASa,GACzB,OAAQyB,EAASF,EAASvB,EAAMuB,IAASI,MAAM3B,EAAOwB,MAK1D3E,EAAE+E,MAAQ,SAASzC,EAAK0C,GACtB,MAAOhF,GAAEiB,IAAIqB,EAAK,SAASa,GAAQ,MAAOA,GAAM6B,MAKlDhF,EAAEiF,MAAQ,SAAS3C,EAAK4C,EAAOC,GAC7B,MAAInF,GAAEoF,QAAQF,GAAeC,MAAa,MACnCnF,EAAEmF,EAAQ,OAAS,UAAU7C,EAAK,SAASa,GAChD,IAAK,GAAI6B,KAAOE,GACd,GAAIA,EAAMF,KAAS7B,EAAM6B,GAAM,OAAO,CAExC,QAAO,KAMXhF,EAAEqF,UAAY,SAAS/C,EAAK4C,GAC1B,MAAOlF,GAAEiF,MAAM3C,EAAK4C,GAAO,IAM7BlF,EAAEsF,IAAM,SAAShD,EAAKM,EAAUC,GAC9B,IAAKD,GAAY5C,EAAEiC,QAAQK,IAAQA,EAAI,MAAQA,EAAI,IAAMA,EAAIQ,OAAS,MACpE,MAAOyC,MAAKD,IAAIR,MAAMS,KAAMjD,EAE9B,KAAKM,GAAY5C,EAAEoF,QAAQ9C,GAAM,OAAQkD,GACzC,IAAIxB,IAAUyB,UAAYD,IAAUrC,OAAQqC,IAK5C,OAJA7C,GAAKL,EAAK,SAASa,EAAOC,EAAOC,GAC/B,GAAIoC,GAAW7C,EAAWA,EAASI,KAAKH,EAASM,EAAOC,EAAOC,GAAQF,CACvEsC,GAAWzB,EAAOyB,WAAazB,GAAUb,MAAQA,EAAOsC,SAAWA,MAE9DzB,EAAOb,OAIhBnD,EAAE0F,IAAM,SAASpD,EAAKM,EAAUC,GAC9B,IAAKD,GAAY5C,EAAEiC,QAAQK,IAAQA,EAAI,MAAQA,EAAI,IAAMA,EAAIQ,OAAS,MACpE,MAAOyC,MAAKG,IAAIZ,MAAMS,KAAMjD,EAE9B,KAAKM,GAAY5C,EAAEoF,QAAQ9C,GAAM,MAAOkD,IACxC,IAAIxB,IAAUyB,SAAWD,IAAUrC,MAAOqC,IAK1C,OAJA7C,GAAKL,EAAK,SAASa,EAAOC,EAAOC,GAC/B,GAAIoC,GAAW7C,EAAWA,EAASI,KAAKH,EAASM,EAAOC,EAAOC,GAAQF,CACvEsC,GAAWzB,EAAOyB,WAAazB,GAAUb,MAAQA,EAAOsC,SAAWA,MAE9DzB,EAAOb,OAKhBnD,EAAE2F,QAAU,SAASrD,GACnB,GAAIsD,GACAxC,EAAQ,EACRyC,IAMJ,OALAlD,GAAKL,EAAK,SAASa,GACjByC,EAAO5F,EAAE8F,OAAO1C,KAChByC,EAASzC,EAAQ,GAAKyC,EAASD,GAC/BC,EAASD,GAAQzC,IAEZ0C,GAMT7F,EAAE+F,OAAS,SAASzD,EAAK0D,EAAGC,GAC1B,MAAItC,WAAUb,OAAS,GAAKmD,EACnB3D,EAAItC,EAAE8F,OAAOxD,EAAIQ,OAAS,IAE5B9C,EAAE2F,QAAQrD,GAAK5B,MAAM,EAAG6E,KAAKD,IAAI,EAAGU,IAI7C,IAAIE,GAAiB,SAAS/C,GAC5B,MAAOnD,GAAE6E,WAAW1B,GAASA,EAAQ,SAASb,GAAM,MAAOA,GAAIa,IAIjEnD,GAAEmG,OAAS,SAAS7D,EAAKa,EAAON,GAC9B,GAAID,GAAWsD,EAAe/C,EAC9B,OAAOnD,GAAE+E,MAAM/E,EAAEiB,IAAIqB,EAAK,SAASa,EAAOC,EAAOC,GAC/C,OACEF,MAAOA,EACPC,MAAOA,EACPgD,SAAUxD,EAASI,KAAKH,EAASM,EAAOC,EAAOC,MAEhDgD,KAAK,SAASC,EAAMC,GACrB,GAAIC,GAAIF,EAAKF,SACTK,EAAIF,EAAMH,QACd,IAAII,IAAMC,EAAG,CACX,GAAID,EAAIC,GAAKD,QAAW,GAAG,MAAO,EAClC,IAAQC,EAAJD,GAASC,QAAW,GAAG,OAAQ,EAErC,MAAOH,GAAKlD,MAAQmD,EAAMnD,QACxB,SAIN,IAAIsD,GAAQ,SAASC,GACnB,MAAO,UAASrE,EAAKa,EAAON,GAC1B,GAAImB,MACApB,EAAoB,MAATO,EAAgBnD,EAAEqE,SAAW6B,EAAe/C,EAK3D,OAJAR,GAAKL,EAAK,SAASa,EAAOC,GACxB,GAAI4B,GAAMpC,EAASI,KAAKH,EAASM,EAAOC,EAAOd,EAC/CqE,GAAS3C,EAAQgB,EAAK7B,KAEjBa,GAMXhE,GAAE4G,QAAUF,EAAM,SAAS1C,EAAQgB,EAAK7B,IACrCnD,EAAE6G,IAAI7C,EAAQgB,GAAOhB,EAAOgB,GAAQhB,EAAOgB,OAAYvE,KAAK0C,KAK/DnD,EAAE8G,QAAUJ,EAAM,SAAS1C,EAAQgB,EAAK7B,GACtCa,EAAOgB,GAAO7B,IAMhBnD,EAAE+G,QAAUL,EAAM,SAAS1C,EAAQgB,GACjChF,EAAE6G,IAAI7C,EAAQgB,GAAOhB,EAAOgB,KAAShB,EAAOgB,GAAO,IAKrDhF,EAAEgH,YAAc,SAASC,EAAO3E,EAAKM,EAAUC,GAC7CD,EAAuB,MAAZA,EAAmB5C,EAAEqE,SAAW6B,EAAetD,EAG1D,KAFA,GAAIO,GAAQP,EAASI,KAAKH,EAASP,GAC/B4E,EAAM,EAAGC,EAAOF,EAAMnE,OACbqE,EAAND,GAAY,CACjB,GAAIE,GAAOF,EAAMC,IAAU,CAC3BvE,GAASI,KAAKH,EAASoE,EAAMG,IAAQjE,EAAQ+D,EAAME,EAAM,EAAID,EAAOC,EAEtE,MAAOF,IAITlH,EAAEqH,QAAU,SAAS/E,GACnB,MAAKA,GACDtC,EAAEiC,QAAQK,GAAa5B,EAAMsC,KAAKV,GAClCA,EAAIQ,UAAYR,EAAIQ,OAAe9C,EAAEiB,IAAIqB,EAAKtC,EAAEqE,UAC7CrE,EAAEsH,OAAOhF,OAIlBtC,EAAEuH,KAAO,SAASjF,GAChB,MAAW,OAAPA,EAAoB,EAChBA,EAAIQ,UAAYR,EAAIQ,OAAUR,EAAIQ,OAAS9C,EAAEmC,KAAKG,GAAKQ,QASjE9C,EAAEmF,MAAQnF,EAAEwH,KAAOxH,EAAEyH,KAAO,SAASR,EAAOjB,EAAGC,GAC7C,MAAa,OAATgB,MAA2B,GAClB,MAALjB,GAAcC,EAAQgB,EAAM,GAAKvG,EAAMsC,KAAKiE,EAAO,EAAGjB,IAOhEhG,EAAE0D,QAAU,SAASuD,EAAOjB,EAAGC,GAC7B,MAAOvF,GAAMsC,KAAKiE,EAAO,EAAGA,EAAMnE,QAAgB,MAALkD,GAAcC,EAAQ,EAAID,KAKzEhG,EAAE0H,KAAO,SAAST,EAAOjB,EAAGC,GAC1B,MAAa,OAATgB,MAA2B,GACrB,MAALjB,GAAcC,EACVgB,EAAMA,EAAMnE,OAAS,GAErBpC,EAAMsC,KAAKiE,EAAO1B,KAAKD,IAAI2B,EAAMnE,OAASkD,EAAG,KAQxDhG,EAAE2H,KAAO3H,EAAE4H,KAAO5H,EAAE6H,KAAO,SAASZ,EAAOjB,EAAGC,GAC5C,MAAOvF,GAAMsC,KAAKiE,EAAa,MAALjB,GAAcC,EAAQ,EAAID,IAItDhG,EAAE8H,QAAU,SAASb,GACnB,MAAOjH,GAAEuB,OAAO0F,EAAOjH,EAAEqE,UAI3B,IAAI0D,GAAU,SAASC,EAAOC,EAASC,GACrC,MAAID,IAAWjI,EAAEyB,MAAMuG,EAAOhI,EAAEiC,SACvBtB,EAAOmE,MAAMoD,EAAQF,IAE9BrF,EAAKqF,EAAO,SAAS7E,GACfnD,EAAEiC,QAAQkB,IAAUnD,EAAEmI,YAAYhF,GACpC8E,EAAUxH,EAAKqE,MAAMoD,EAAQ/E,GAAS4E,EAAQ5E,EAAO8E,EAASC,GAE9DA,EAAOzH,KAAK0C,KAGT+E,GAITlI,GAAE+H,QAAU,SAASd,EAAOgB,GAC1B,MAAOF,GAAQd,EAAOgB,OAIxBjI,EAAEoI,QAAU,SAASnB,GACnB,MAAOjH,GAAEqI,WAAWpB,EAAOvG,EAAMsC,KAAKW,UAAW,KAMnD3D,EAAEsI,KAAOtI,EAAEuI,OAAS,SAAStB,EAAOuB,EAAU5F,EAAUC,GAClD7C,EAAE6E,WAAW2D,KACf3F,EAAUD,EACVA,EAAW4F,EACXA,GAAW,EAEb,IAAI9E,GAAUd,EAAW5C,EAAEiB,IAAIgG,EAAOrE,EAAUC,GAAWoE,EACvD/D,KACAuF,IAOJ,OANA9F,GAAKe,EAAS,SAASP,EAAOC,IACxBoF,EAAapF,GAASqF,EAAKA,EAAK3F,OAAS,KAAOK,EAAUnD,EAAEsE,SAASmE,EAAMtF,MAC7EsF,EAAKhI,KAAK0C,GACVD,EAAQzC,KAAKwG,EAAM7D,OAGhBF,GAKTlD,EAAE0I,MAAQ,WACR,MAAO1I,GAAEsI,KAAKtI,EAAE+H,QAAQpE,WAAW,KAKrC3D,EAAE2I,aAAe,SAAS1B,GACxB,GAAIU,GAAOjH,EAAMsC,KAAKW,UAAW,EACjC,OAAO3D,GAAEuB,OAAOvB,EAAEsI,KAAKrB,GAAQ,SAAS2B,GACtC,MAAO5I,GAAEyB,MAAMkG,EAAM,SAASkB,GAC5B,MAAO7I,GAAE6B,QAAQgH,EAAOD,IAAS,OAOvC5I,EAAEqI,WAAa,SAASpB,GACtB,GAAIU,GAAOhH,EAAOmE,MAAM5E,EAAYQ,EAAMsC,KAAKW,UAAW,GAC1D,OAAO3D,GAAEuB,OAAO0F,EAAO,SAAS9D,GAAQ,OAAQnD,EAAEsE,SAASqD,EAAMxE,MAKnEnD,EAAE8I,IAAM,WAGN,IAAK,GAFDhG,GAAS9C,EAAEsF,IAAItF,EAAE+E,MAAMpB,UAAW,UAAUhD,OAAO,IACnDuC,EAAU,GAAI/C,OAAM2C,GACfC,EAAI,EAAOD,EAAJC,EAAYA,IAC1BG,EAAQH,GAAK/C,EAAE+E,MAAMpB,UAAW,GAAKZ,EAEvC,OAAOG,IAMTlD,EAAE+I,OAAS,SAAS1F,EAAMiE,GACxB,GAAY,MAARjE,EAAc,QAElB,KAAK,GADDW,MACKjB,EAAI,EAAGD,EAASO,EAAKP,OAAYA,EAAJC,EAAYA,IAC5CuE,EACFtD,EAAOX,EAAKN,IAAMuE,EAAOvE,GAEzBiB,EAAOX,EAAKN,GAAG,IAAMM,EAAKN,GAAG,EAGjC,OAAOiB,IASThE,EAAE6B,QAAU,SAASoF,EAAO2B,EAAMJ,GAChC,GAAa,MAATvB,EAAe,OAAQ,CAC3B,IAAIlE,GAAI,EAAGD,EAASmE,EAAMnE,MAC1B,IAAI0F,EAAU,CACZ,GAAuB,gBAAZA,GAIT,MADAzF,GAAI/C,EAAEgH,YAAYC,EAAO2B,GAClB3B,EAAMlE,KAAO6F,EAAO7F,GAAK,CAHhCA,GAAgB,EAAXyF,EAAejD,KAAKD,IAAI,EAAGxC,EAAS0F,GAAYA,EAMzD,GAAI5G,GAAiBqF,EAAMpF,UAAYD,EAAe,MAAOqF,GAAMpF,QAAQ+G,EAAMJ,EACjF,MAAW1F,EAAJC,EAAYA,IAAK,GAAIkE,EAAMlE,KAAO6F,EAAM,MAAO7F,EACtD,QAAQ,GAIV/C,EAAE+B,YAAc,SAASkF,EAAO2B,EAAMI,GACpC,GAAa,MAAT/B,EAAe,OAAQ,CAC3B,IAAIgC,GAAmB,MAARD,CACf,IAAIlH,GAAqBmF,EAAMlF,cAAgBD,EAC7C,MAAOmH,GAAWhC,EAAMlF,YAAY6G,EAAMI,GAAQ/B,EAAMlF,YAAY6G,EAGtE,KADA,GAAI7F,GAAKkG,EAAWD,EAAO/B,EAAMnE,OAC1BC,KAAK,GAAIkE,EAAMlE,KAAO6F,EAAM,MAAO7F,EAC1C,QAAQ,GAMV/C,EAAEkJ,MAAQ,SAASC,EAAOC,EAAMC,GAC1B1F,UAAUb,QAAU,IACtBsG,EAAOD,GAAS,EAChBA,EAAQ,GAEVE,EAAO1F,UAAU,IAAM,CAMvB,KAJA,GAAIb,GAASyC,KAAKD,IAAIC,KAAK+D,MAAMF,EAAOD,GAASE,GAAO,GACpDE,EAAM,EACNL,EAAQ,GAAI/I,OAAM2C,GAEVA,EAANyG,GACJL,EAAMK,KAASJ,EACfA,GAASE,CAGX,OAAOH,GAOT,IAAIM,GAAO,YAKXxJ,GAAEqC,KAAO,SAASoH,EAAM5G,GACtB,GAAI8B,GAAM+E,CACV,IAAItH,GAAcqH,EAAKpH,OAASD,EAAY,MAAOA,GAAW0C,MAAM2E,EAAM/I,EAAMsC,KAAKW,UAAW,GAChG,KAAK3D,EAAE6E,WAAW4E,GAAO,KAAM,IAAI7F,UAEnC,OADAe,GAAOjE,EAAMsC,KAAKW,UAAW,GACtB+F,EAAQ,WACb,KAAM5J,eAAgB4J,IAAQ,MAAOD,GAAK3E,MAAMjC,EAAS8B,EAAKhE,OAAOD,EAAMsC,KAAKW,YAChF6F,GAAKpJ,UAAYqJ,EAAKrJ,SACtB,IAAIuJ,GAAO,GAAIH,EACfA,GAAKpJ,UAAY,IACjB,IAAI4D,GAASyF,EAAK3E,MAAM6E,EAAMhF,EAAKhE,OAAOD,EAAMsC,KAAKW,YACrD,OAAIrD,QAAO0D,KAAYA,EAAeA,EAC/B2F,IAMX3J,EAAE4J,QAAU,SAASH,GACnB,GAAI9E,GAAOjE,EAAMsC,KAAKW,UAAW,EACjC,OAAO,YACL,MAAO8F,GAAK3E,MAAMhF,KAAM6E,EAAKhE,OAAOD,EAAMsC,KAAKW,eAMnD3D,EAAE6J,QAAU,SAASvH,GACnB,GAAIwH,GAAQpJ,EAAMsC,KAAKW,UAAW,EAClC,IAAqB,IAAjBmG,EAAMhH,OAAc,KAAM,IAAIiH,OAAM,wCAExC,OADApH,GAAKmH,EAAO,SAASE,GAAK1H,EAAI0H,GAAKhK,EAAEqC,KAAKC,EAAI0H,GAAI1H,KAC3CA,GAITtC,EAAEiK,QAAU,SAASR,EAAMS,GACzB,GAAIzG,KAEJ,OADAyG,KAAWA,EAASlK,EAAEqE,UACf,WACL,GAAIW,GAAMkF,EAAOpF,MAAMhF,KAAM6D,UAC7B,OAAO3D,GAAE6G,IAAIpD,EAAMuB,GAAOvB,EAAKuB,GAAQvB,EAAKuB,GAAOyE,EAAK3E,MAAMhF,KAAM6D,aAMxE3D,EAAEmK,MAAQ,SAASV,EAAMW,GACvB,GAAIzF,GAAOjE,EAAMsC,KAAKW,UAAW,EACjC,OAAO0G,YAAW,WAAY,MAAOZ,GAAK3E,MAAM,KAAMH,IAAUyF,IAKlEpK,EAAEsK,MAAQ,SAASb,GACjB,MAAOzJ,GAAEmK,MAAMrF,MAAM9E,GAAIyJ,EAAM,GAAG9I,OAAOD,EAAMsC,KAAKW,UAAW,MAQjE3D,EAAEuK,SAAW,SAASd,EAAMW,EAAMI,GAChC,GAAI3H,GAAS8B,EAAMX,EACfyG,EAAU,KACVC,EAAW,CACfF,KAAYA,KACZ,IAAIG,GAAQ,WACVD,EAAWF,EAAQI,WAAY,EAAQ,EAAI,GAAIC,MAC/CJ,EAAU,KACVzG,EAASyF,EAAK3E,MAAMjC,EAAS8B,GAE/B,OAAO,YACL,GAAImG,GAAM,GAAID,KACTH,IAAYF,EAAQI,WAAY,IAAOF,EAAWI,EACvD,IAAIC,GAAYX,GAAQU,EAAMJ,EAW9B,OAVA7H,GAAU/C,KACV6E,EAAOhB,UACU,GAAboH,GACFC,aAAaP,GACbA,EAAU,KACVC,EAAWI,EACX9G,EAASyF,EAAK3E,MAAMjC,EAAS8B,IACnB8F,GAAWD,EAAQS,YAAa,IAC1CR,EAAUJ,WAAWM,EAAOI,IAEvB/G,IAQXhE,EAAEkL,SAAW,SAASzB,EAAMW,EAAMe,GAChC,GAAIV,GAAS9F,EAAM9B,EAASuI,EAAWpH,CACvC,OAAO,YACLnB,EAAU/C,KACV6E,EAAOhB,UACPyH,EAAY,GAAIP,KAChB,IAAIF,GAAQ,WACV,GAAIjD,GAAO,GAAKmD,MAAUO,CACfhB,GAAP1C,EACF+C,EAAUJ,WAAWM,EAAOP,EAAO1C,IAEnC+C,EAAU,KACLU,IAAWnH,EAASyF,EAAK3E,MAAMjC,EAAS8B,MAG7C0G,EAAUF,IAAcV,CAK5B,OAJKA,KACHA,EAAUJ,WAAWM,EAAOP,IAE1BiB,IAASrH,EAASyF,EAAK3E,MAAMjC,EAAS8B,IACnCX,IAMXhE,EAAEsL,KAAO,SAAS7B,GAChB,GAAiBhG,GAAb8H,GAAM,CACV,OAAO,YACL,MAAIA,GAAY9H,GAChB8H,GAAM,EACN9H,EAAOgG,EAAK3E,MAAMhF,KAAM6D,WACxB8F,EAAO,KACAhG,KAOXzD,EAAEwL,KAAO,SAAS/B,EAAMgC,GACtB,MAAO,YACL,GAAI9G,IAAQ8E,EAEZ,OADAhJ,GAAKqE,MAAMH,EAAMhB,WACV8H,EAAQ3G,MAAMhF,KAAM6E,KAM/B3E,EAAE0L,QAAU,WACV,GAAI5B,GAAQnG,SACZ,OAAO,YAEL,IAAK,GADDgB,GAAOhB,UACFZ,EAAI+G,EAAMhH,OAAS,EAAGC,GAAK,EAAGA,IACrC4B,GAAQmF,EAAM/G,GAAG+B,MAAMhF,KAAM6E,GAE/B,OAAOA,GAAK,KAKhB3E,EAAE2L,MAAQ,SAASC,EAAOnC,GACxB,MAAO,YACL,QAAMmC,EAAQ,EACLnC,EAAK3E,MAAMhF,KAAM6D,WAD1B,SAWJ3D,EAAEmC,KAAOD,GAAc,SAASI,GAC9B,GAAIA,IAAQhC,OAAOgC,GAAM,KAAM,IAAIsB,WAAU,iBAC7C,IAAIzB,KACJ,KAAK,GAAI6C,KAAO1C,GAAStC,EAAE6G,IAAIvE,EAAK0C,IAAM7C,EAAK1B,KAAKuE,EACpD,OAAO7C,IAITnC,EAAEsH,OAAS,SAAShF,GAIlB,IAAK,GAHDH,GAAOnC,EAAEmC,KAAKG,GACdQ,EAASX,EAAKW,OACdwE,EAAS,GAAInH,OAAM2C,GACdC,EAAI,EAAOD,EAAJC,EAAYA,IAC1BuE,EAAOvE,GAAKT,EAAIH,EAAKY,GAEvB,OAAOuE,IAITtH,EAAE6L,MAAQ,SAASvJ,GAIjB,IAAK,GAHDH,GAAOnC,EAAEmC,KAAKG,GACdQ,EAASX,EAAKW,OACd+I,EAAQ,GAAI1L,OAAM2C,GACbC,EAAI,EAAOD,EAAJC,EAAYA,IAC1B8I,EAAM9I,IAAMZ,EAAKY,GAAIT,EAAIH,EAAKY,IAEhC,OAAO8I,IAIT7L,EAAE8L,OAAS,SAASxJ,GAGlB,IAAK,GAFD0B,MACA7B,EAAOnC,EAAEmC,KAAKG,GACTS,EAAI,EAAGD,EAASX,EAAKW,OAAYA,EAAJC,EAAYA,IAChDiB,EAAO1B,EAAIH,EAAKY,KAAOZ,EAAKY,EAE9B,OAAOiB,IAKThE,EAAE+L,UAAY/L,EAAEgM,QAAU,SAAS1J,GACjC,GAAI2J,KACJ,KAAK,GAAIjH,KAAO1C,GACVtC,EAAE6E,WAAWvC,EAAI0C,KAAOiH,EAAMxL,KAAKuE,EAEzC,OAAOiH,GAAM5F,QAIfrG,EAAEkM,OAAS,SAAS5J,GAQlB,MAPAK,GAAKjC,EAAMsC,KAAKW,UAAW,GAAI,SAASwI,GACtC,GAAIA,EACF,IAAK,GAAIC,KAAQD,GACf7J,EAAI8J,GAAQD,EAAOC,KAIlB9J,GAITtC,EAAEqM,KAAO,SAAS/J,GAChB,GAAIgK,MACAnK,EAAOxB,EAAOmE,MAAM5E,EAAYQ,EAAMsC,KAAKW,UAAW,GAI1D,OAHAhB,GAAKR,EAAM,SAAS6C,GACdA,IAAO1C,KAAKgK,EAAKtH,GAAO1C,EAAI0C,MAE3BsH,GAITtM,EAAEuM,KAAO,SAASjK,GAChB,GAAIgK,MACAnK,EAAOxB,EAAOmE,MAAM5E,EAAYQ,EAAMsC,KAAKW,UAAW,GAC1D,KAAK,GAAIqB,KAAO1C,GACTtC,EAAEsE,SAASnC,EAAM6C,KAAMsH,EAAKtH,GAAO1C,EAAI0C,GAE9C,OAAOsH,IAITtM,EAAEwM,SAAW,SAASlK,GAQpB,MAPAK,GAAKjC,EAAMsC,KAAKW,UAAW,GAAI,SAASwI,GACtC,GAAIA,EACF,IAAK,GAAIC,KAAQD,GACX7J,EAAI8J,SAAe,KAAG9J,EAAI8J,GAAQD,EAAOC,MAI5C9J,GAITtC,EAAEyM,MAAQ,SAASnK,GACjB,MAAKtC,GAAE0M,SAASpK,GACTtC,EAAEiC,QAAQK,GAAOA,EAAI5B,QAAUV,EAAEkM,UAAW5J,GADtBA,GAO/BtC,EAAE2M,IAAM,SAASrK,EAAKsK,GAEpB,MADAA,GAAYtK,GACLA,EAIT,IAAIuK,GAAK,SAASrG,EAAGC,EAAGqG,EAAQC,GAG9B,GAAIvG,IAAMC,EAAG,MAAa,KAAND,GAAW,EAAIA,GAAK,EAAIC,CAE5C,IAAS,MAALD,GAAkB,MAALC,EAAW,MAAOD,KAAMC,CAErCD,aAAaxG,KAAGwG,EAAIA,EAAEjE,UACtBkE,YAAazG,KAAGyG,EAAIA,EAAElE,SAE1B,IAAIyK,GAAYpM,EAASoC,KAAKwD,EAC9B,IAAIwG,GAAapM,EAASoC,KAAKyD,GAAI,OAAO,CAC1C,QAAQuG,GAEN,IAAK,kBAGH,MAAOxG,IAAKyG,OAAOxG,EACrB,KAAK,kBAGH,MAAOD,KAAMA,EAAIC,IAAMA,EAAU,GAALD,EAAS,EAAIA,GAAK,EAAIC,EAAID,IAAMC,CAC9D,KAAK,gBACL,IAAK,mBAIH,OAAQD,IAAMC,CAEhB,KAAK,kBACH,MAAOD,GAAE2F,QAAU1F,EAAE0F,QACd3F,EAAE0G,QAAUzG,EAAEyG,QACd1G,EAAE2G,WAAa1G,EAAE0G,WACjB3G,EAAE4G,YAAc3G,EAAE2G,WAE7B,GAAgB,gBAAL5G,IAA6B,gBAALC,GAAe,OAAO,CAIzD,KADA,GAAI3D,GAASgK,EAAOhK,OACbA,KAGL,GAAIgK,EAAOhK,IAAW0D,EAAG,MAAOuG,GAAOjK,IAAW2D,CAIpD,IAAI4G,GAAQ7G,EAAE8G,YAAaC,EAAQ9G,EAAE6G,WACrC,IAAID,IAAUE,KAAWvN,EAAE6E,WAAWwI,IAAWA,YAAiBA,IACzCrN,EAAE6E,WAAW0I,IAAWA,YAAiBA,IAChE,OAAO,CAGTT,GAAOrM,KAAK+F,GACZuG,EAAOtM,KAAKgG,EACZ,IAAIc,GAAO,EAAGvD,GAAS,CAEvB,IAAiB,kBAAbgJ,GAIF,GAFAzF,EAAOf,EAAE1D,OACTkB,EAASuD,GAAQd,EAAE3D,OAGjB,KAAOyE,MACCvD,EAAS6I,EAAGrG,EAAEe,GAAOd,EAAEc,GAAOuF,EAAQC,WAG3C,CAEL,IAAK,GAAI/H,KAAOwB,GACd,GAAIxG,EAAE6G,IAAIL,EAAGxB,KAEXuC,MAEMvD,EAAShE,EAAE6G,IAAIJ,EAAGzB,IAAQ6H,EAAGrG,EAAExB,GAAMyB,EAAEzB,GAAM8H,EAAQC,KAAU,KAIzE,IAAI/I,EAAQ,CACV,IAAKgB,IAAOyB,GACV,GAAIzG,EAAE6G,IAAIJ,EAAGzB,KAAUuC,IAAS,KAElCvD,IAAUuD,GAMd,MAFAuF,GAAOU,MACPT,EAAOS,MACAxJ,EAIThE,GAAEyN,QAAU,SAASjH,EAAGC,GACtB,MAAOoG,GAAGrG,EAAGC,UAKfzG,EAAEoF,QAAU,SAAS9C,GACnB,GAAW,MAAPA,EAAa,OAAO,CACxB,IAAItC,EAAEiC,QAAQK,IAAQtC,EAAE0N,SAASpL,GAAM,MAAsB,KAAfA,EAAIQ,MAClD,KAAK,GAAIkC,KAAO1C,GAAK,GAAItC,EAAE6G,IAAIvE,EAAK0C,GAAM,OAAO,CACjD,QAAO,GAIThF,EAAE2N,UAAY,SAASrL,GACrB,SAAUA,GAAwB,IAAjBA,EAAIsL,WAKvB5N,EAAEiC,QAAUD,GAAiB,SAASM,GACpC,MAA6B,kBAAtB1B,EAASoC,KAAKV,IAIvBtC,EAAE0M,SAAW,SAASpK,GACpB,MAAOA,KAAQhC,OAAOgC,IAIxBK,GAAM,YAAa,WAAY,SAAU,SAAU,OAAQ,UAAW,SAASkL,GAC7E7N,EAAE,KAAO6N,GAAQ,SAASvL,GACxB,MAAO1B,GAASoC,KAAKV,IAAQ,WAAauL,EAAO,OAMhD7N,EAAEmI,YAAYxE,aACjB3D,EAAEmI,YAAc,SAAS7F,GACvB,SAAUA,IAAOtC,EAAE6G,IAAIvE,EAAK,aAKX,kBAAV,MACTtC,EAAE6E,WAAa,SAASvC,GACtB,MAAsB,kBAARA,KAKlBtC,EAAE8N,SAAW,SAASxL,GACpB,MAAOwL,UAASxL,KAASyL,MAAMC,WAAW1L,KAI5CtC,EAAE+N,MAAQ,SAASzL,GACjB,MAAOtC,GAAEiO,SAAS3L,IAAQA,IAAQA,GAIpCtC,EAAEkO,UAAY,SAAS5L,GACrB,MAAOA,MAAQ,GAAQA,KAAQ,GAA+B,oBAAtB1B,EAASoC,KAAKV,IAIxDtC,EAAEmO,OAAS,SAAS7L,GAClB,MAAe,QAARA,GAITtC,EAAEoO,YAAc,SAAS9L,GACvB,MAAOA,SAAa,IAKtBtC,EAAE6G,IAAM,SAASvE,EAAK0C,GACpB,MAAOnE,GAAemC,KAAKV,EAAK0C,IAQlChF,EAAEqO,WAAa,WAEb,MADAxO,GAAKG,EAAID,EACFD,MAITE,EAAEqE,SAAW,SAASlB,GACpB,MAAOA,IAITnD,EAAE4L,MAAQ,SAAS5F,EAAGpD,EAAUC,GAE9B,IAAK,GADDyL,GAAQnO,MAAMoF,KAAKD,IAAI,EAAGU,IACrBjD,EAAI,EAAOiD,EAAJjD,EAAOA,IAAKuL,EAAMvL,GAAKH,EAASI,KAAKH,EAASE,EAC9D,OAAOuL,IAITtO,EAAE8F,OAAS,SAASJ,EAAKJ,GAKvB,MAJW,OAAPA,IACFA,EAAMI,EACNA,EAAM,GAEDA,EAAMH,KAAKgJ,MAAMhJ,KAAKO,UAAYR,EAAMI,EAAM,IAIvD,IAAI8I,IACFC,QACEC,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,IAAK,SACLC,IAAK,UAGTN,GAAUO,SAAW/O,EAAE8L,OAAO0C,EAAUC,OAGxC,IAAIO,IACFP,OAAU,GAAIQ,QAAO,IAAMjP,EAAEmC,KAAKqM,EAAUC,QAAQS,KAAK,IAAM,IAAK,KACpEH,SAAU,GAAIE,QAAO,IAAMjP,EAAEmC,KAAKqM,EAAUO,UAAUG,KAAK,KAAO,IAAK,KAIzElP,GAAE2C,MAAM,SAAU,YAAa,SAAS+B,GACtC1E,EAAE0E,GAAU,SAASyK,GACnB,MAAc,OAAVA,EAAuB,IACnB,GAAKA,GAAQC,QAAQJ,EAActK,GAAS,SAAS2K,GAC3D,MAAOb,GAAU9J,GAAQ2K,QAO/BrP,EAAEgE,OAAS,SAAS+E,EAAQuG,GAC1B,GAAc,MAAVvG,EAAgB,WAAY,EAChC,IAAI5F,GAAQ4F,EAAOuG,EACnB,OAAOtP,GAAE6E,WAAW1B,GAASA,EAAMH,KAAK+F,GAAU5F,GAIpDnD,EAAEuP,MAAQ,SAASjN,GACjBK,EAAK3C,EAAE+L,UAAUzJ,GAAM,SAASuL,GAC9B,GAAIpE,GAAOzJ,EAAE6N,GAAQvL,EAAIuL,EACzB7N,GAAEI,UAAUyN,GAAQ,WAClB,GAAIlJ,IAAQ7E,KAAKyC,SAEjB,OADA9B,GAAKqE,MAAMH,EAAMhB,WACVK,EAAOhB,KAAKlD,KAAM2J,EAAK3E,MAAM9E,EAAG2E,OAO7C,IAAI6K,GAAY,CAChBxP,GAAEyP,SAAW,SAASC,GACpB,GAAIC,KAAOH,EAAY,EACvB,OAAOE,GAASA,EAASC,EAAKA,GAKhC3P,EAAE4P,kBACAC,SAAc,kBACdC,YAAc,mBACdrB,OAAc,mBAMhB,IAAIsB,GAAU,OAIVC,GACFlB,IAAU,IACVmB,KAAU,KACVC,KAAU,IACVC,KAAU,IACVC,IAAU,IACVC,SAAU,QACVC,SAAU,SAGRC,EAAU,8BAKdvQ,GAAEwQ,SAAW,SAASC,EAAMC,EAAMC,GAChC,GAAIC,EACJD,GAAW3Q,EAAEwM,YAAamE,EAAU3Q,EAAE4P,iBAGtC,IAAIiB,GAAU,GAAI5B,UACf0B,EAASlC,QAAUsB,GAAS5D,QAC5BwE,EAASb,aAAeC,GAAS5D,QACjCwE,EAASd,UAAYE,GAAS5D,QAC/B+C,KAAK,KAAO,KAAM,KAGhB9L,EAAQ,EACR+I,EAAS,QACbsE,GAAKrB,QAAQyB,EAAS,SAASxB,EAAOZ,EAAQqB,EAAaD,EAAUiB,GAcnE,MAbA3E,IAAUsE,EAAK/P,MAAM0C,EAAO0N,GACzB1B,QAAQmB,EAAS,SAASlB,GAAS,MAAO,KAAOW,EAAQX,KAExDZ,IACFtC,GAAU,cAAgBsC,EAAS,kCAEjCqB,IACF3D,GAAU,cAAgB2D,EAAc,wBAEtCD,IACF1D,GAAU,OAAS0D,EAAW,YAEhCzM,EAAQ0N,EAASzB,EAAMvM,OAChBuM,IAETlD,GAAU,OAGLwE,EAASI,WAAU5E,EAAS,mBAAqBA,EAAS,OAE/DA,EAAS,2CACP,oDACAA,EAAS,eAEX,KACEyE,EAAS,GAAIpQ,UAASmQ,EAASI,UAAY,MAAO,IAAK5E,GACvD,MAAO6E,GAEP,KADAA,GAAE7E,OAASA,EACL6E,EAGR,GAAIN,EAAM,MAAOE,GAAOF,EAAM1Q,EAC9B,IAAIwQ,GAAW,SAASE,GACtB,MAAOE,GAAO5N,KAAKlD,KAAM4Q,EAAM1Q,GAMjC,OAFAwQ,GAASrE,OAAS,aAAewE,EAASI,UAAY,OAAS,OAAS5E,EAAS,IAE1EqE,GAITxQ,EAAEiR,MAAQ,SAAS3O,GACjB,MAAOtC,GAAEsC,GAAK2O,QAUhB,IAAIjN,GAAS,SAAS1B,GACpB,MAAOxC,MAAKoR,OAASlR,EAAEsC,GAAK2O,QAAU3O,EAIxCtC,GAAEuP,MAAMvP,GAGR2C,GAAM,MAAO,OAAQ,UAAW,QAAS,OAAQ,SAAU,WAAY,SAASkL,GAC9E,GAAInJ,GAASxE,EAAW2N,EACxB7N,GAAEI,UAAUyN,GAAQ,WAClB,GAAIvL,GAAMxC,KAAKyC,QAGf,OAFAmC,GAAOI,MAAMxC,EAAKqB,WACL,SAARkK,GAA2B,UAARA,GAAoC,IAAfvL,EAAIQ,cAAqBR,GAAI,GACnE0B,EAAOhB,KAAKlD,KAAMwC,MAK7BK,GAAM,SAAU,OAAQ,SAAU,SAASkL,GACzC,GAAInJ,GAASxE,EAAW2N,EACxB7N,GAAEI,UAAUyN,GAAQ,WAClB,MAAO7J,GAAOhB,KAAKlD,KAAM4E,EAAOI,MAAMhF,KAAKyC,SAAUoB,eAIzD3D,EAAEkM,OAAOlM,EAAEI,WAGT6Q,MAAO,WAEL,MADAnR,MAAKoR,QAAS,EACPpR,MAITqD,MAAO,WACL,MAAOrD,MAAKyC,cAKfS,KAAKlD"} \ No newline at end of file +{"version":3,"file":"underscore-min.js","sources":["underscore.js"],"names":["createReduce","dir","iterator","obj","iteratee","memo","keys","index","length","currentKey","context","optimizeCb","isArrayLike","_","arguments","createPredicateIndexFinder","array","predicate","cb","getLength","createIndexFinder","predicateFind","sortedIndex","item","idx","i","Math","max","min","slice","call","isNaN","collectNonEnumProps","nonEnumIdx","nonEnumerableProps","constructor","proto","isFunction","prototype","ObjProto","prop","has","contains","push","root","this","previousUnderscore","ArrayProto","Array","Object","FuncProto","Function","toString","hasOwnProperty","nativeIsArray","isArray","nativeKeys","nativeBind","bind","nativeCreate","create","Ctor","_wrapped","exports","module","VERSION","func","argCount","value","other","collection","accumulator","apply","identity","isObject","matcher","property","Infinity","createAssigner","keysFunc","undefinedOnly","source","l","key","baseCreate","result","MAX_ARRAY_INDEX","pow","each","forEach","map","collect","results","reduce","foldl","inject","reduceRight","foldr","find","detect","findIndex","findKey","filter","select","list","reject","negate","every","all","some","any","includes","include","fromIndex","guard","values","indexOf","invoke","method","args","isFunc","pluck","where","attrs","findWhere","computed","lastComputed","shuffle","rand","set","shuffled","random","sample","n","sortBy","criteria","sort","left","right","a","b","group","behavior","groupBy","indexBy","countBy","toArray","size","partition","pass","fail","first","head","take","initial","last","rest","tail","drop","compact","flatten","input","shallow","strict","startIndex","output","isArguments","j","len","without","difference","uniq","unique","isSorted","isBoolean","seen","union","intersection","argsLength","zip","unzip","object","findLastIndex","low","high","mid","floor","lastIndexOf","range","start","stop","step","ceil","executeBound","sourceFunc","boundFunc","callingContext","self","TypeError","bound","concat","partial","boundArgs","position","bindAll","Error","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","now","remaining","clearTimeout","trailing","debounce","immediate","timestamp","callNow","wrap","wrapper","compose","after","times","before","once","hasEnumBug","propertyIsEnumerable","allKeys","mapObject","pairs","invert","functions","methods","names","extend","extendOwn","assign","pick","oiteratee","omit","String","defaults","props","clone","tap","interceptor","isMatch","eq","aStack","bStack","className","areArrays","aCtor","bCtor","pop","isEqual","isEmpty","isString","isElement","nodeType","type","name","Int8Array","isFinite","parseFloat","isNumber","isNull","isUndefined","noConflict","constant","noop","propertyOf","matches","accum","Date","getTime","escapeMap","&","<",">","\"","'","`","unescapeMap","createEscaper","escaper","match","join","testRegexp","RegExp","replaceRegexp","string","test","replace","escape","unescape","fallback","idCounter","uniqueId","prefix","id","templateSettings","evaluate","interpolate","noMatch","escapes","\\","\r","\n","
","
","escapeChar","template","text","settings","oldSettings","offset","variable","render","e","data","argument","chain","instance","_chain","mixin","valueOf","toJSON","define","amd"],"mappings":"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"} \ No newline at end of file diff --git a/vendor/underscore/underscore.js b/vendor/underscore/underscore.js index b50115df5..ca1cdd332 100644 --- a/vendor/underscore/underscore.js +++ b/vendor/underscore/underscore.js @@ -1,6 +1,6 @@ -// Underscore.js 1.5.2 +// Underscore.js 1.8.3 // http://underscorejs.org -// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// (c) 2009-2017 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license. (function() { @@ -8,41 +8,35 @@ // Baseline setup // -------------- - // Establish the root object, `window` in the browser, or `exports` on the server. - var root = this; + // Establish the root object, `window` (`self`) in the browser, `global` + // on the server, or `this` in some virtual machines. We use `self` + // instead of `window` for `WebWorker` support. + var root = typeof self == 'object' && self.self === self && self || + typeof global == 'object' && global.global === global && global || + this || + {}; // Save the previous value of the `_` variable. var previousUnderscore = root._; - // Establish the object that gets returned to break out of a loop iteration. - var breaker = {}; - // Save bytes in the minified (but not gzipped) version: - var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; + var ArrayProto = Array.prototype, ObjProto = Object.prototype; + var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; // Create quick reference variables for speed access to core prototypes. - var - push = ArrayProto.push, - slice = ArrayProto.slice, - concat = ArrayProto.concat, - toString = ObjProto.toString, - hasOwnProperty = ObjProto.hasOwnProperty; + var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; // All **ECMAScript 5** native function implementations that we hope to use // are declared here. - var - nativeForEach = ArrayProto.forEach, - nativeMap = ArrayProto.map, - nativeReduce = ArrayProto.reduce, - nativeReduceRight = ArrayProto.reduceRight, - nativeFilter = ArrayProto.filter, - nativeEvery = ArrayProto.every, - nativeSome = ArrayProto.some, - nativeIndexOf = ArrayProto.indexOf, - nativeLastIndexOf = ArrayProto.lastIndexOf, - nativeIsArray = Array.isArray, - nativeKeys = Object.keys, - nativeBind = FuncProto.bind; + var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create; + + // Naked function reference for surrogate-prototype-swapping. + var Ctor = function(){}; // Create a safe reference to the Underscore object for use below. var _ = function(obj) { @@ -52,11 +46,12 @@ }; // Export the Underscore object for **Node.js**, with - // backwards-compatibility for the old `require()` API. If we're in - // the browser, add `_` as a global object via a string identifier, - // for Closure Compiler "advanced" mode. - if (typeof exports !== 'undefined') { - if (typeof module !== 'undefined' && module.exports) { + // backwards-compatibility for their old module API. If we're in + // the browser, add `_` as a global object. + // (`nodeType` is checked to ensure that `module` + // and `exports` are not HTML elements.) + if (typeof exports != 'undefined' && !exports.nodeType) { + if (typeof module != 'undefined' && !module.nodeType && module.exports) { exports = module.exports = _; } exports._ = _; @@ -65,261 +60,362 @@ } // Current version. - _.VERSION = '1.5.2'; + _.VERSION = '1.8.3'; + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + var optimizeCb = function(func, context, argCount) { + if (context === void 0) return func; + switch (argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-parameter case has been omitted only because no current consumers + // made use of it. + case null: + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + }; + + var builtinIteratee; + + // An internal function to generate callbacks that can be applied to each + // element in a collection, returning the desired result — either `identity`, + // an arbitrary callback, a property matcher, or a property accessor. + var cb = function(value, context, argCount) { + if (_.iteratee !== builtinIteratee) return _.iteratee(value, context); + if (value == null) return _.identity; + if (_.isFunction(value)) return optimizeCb(value, context, argCount); + if (_.isObject(value) && !_.isArray(value)) return _.matcher(value); + return _.property(value); + }; + + // External wrapper for our callback generator. Users may customize + // `_.iteratee` if they want additional predicate/iteratee shorthand styles. + // This abstraction hides the internal-only argCount argument. + _.iteratee = builtinIteratee = function(value, context) { + return cb(value, context, Infinity); + }; + + // Similar to ES6's rest param (http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html) + // This accumulates the arguments passed into an array, after a given index. + var restArgs = function(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; + }; + + // An internal function for creating a new object that inherits from another. + var baseCreate = function(prototype) { + if (!_.isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + }; + + var shallowProperty = function(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + }; + + var deepGet = function(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; + }; + + // Helper for collection methods to determine whether a collection + // should be iterated as an array or as an object. + // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + var getLength = shallowProperty('length'); + var isArrayLike = function(collection) { + var length = getLength(collection); + return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; + }; // Collection Functions // -------------------- // The cornerstone, an `each` implementation, aka `forEach`. - // Handles objects with the built-in `forEach`, arrays, and raw objects. - // Delegates to **ECMAScript 5**'s native `forEach` if available. - var each = _.each = _.forEach = function(obj, iterator, context) { - if (obj == null) return; - if (nativeForEach && obj.forEach === nativeForEach) { - obj.forEach(iterator, context); - } else if (obj.length === +obj.length) { - for (var i = 0, length = obj.length; i < length; i++) { - if (iterator.call(context, obj[i], i, obj) === breaker) return; + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + _.each = _.forEach = function(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); } } else { var keys = _.keys(obj); - for (var i = 0, length = keys.length; i < length; i++) { - if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return; + for (i = 0, length = keys.length; i < length; i++) { + iteratee(obj[keys[i]], keys[i], obj); } } + return obj; }; - // Return the results of applying the iterator to each element. - // Delegates to **ECMAScript 5**'s native `map` if available. - _.map = _.collect = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); - each(obj, function(value, index, list) { - results.push(iterator.call(context, value, index, list)); - }); + // Return the results of applying the iteratee to each element. + _.map = _.collect = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } return results; }; - var reduceError = 'Reduce of empty array with no initial value'; + // Create a reducing function iterating left or right. + var createReduce = function(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[keys ? keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = keys ? keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; + }; // **Reduce** builds up a single result from a list of values, aka `inject`, - // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. - _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { - var initial = arguments.length > 2; - if (obj == null) obj = []; - if (nativeReduce && obj.reduce === nativeReduce) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); - } - each(obj, function(value, index, list) { - if (!initial) { - memo = value; - initial = true; - } else { - memo = iterator.call(context, memo, value, index, list); - } - }); - if (!initial) throw new TypeError(reduceError); - return memo; - }; + // or `foldl`. + _.reduce = _.foldl = _.inject = createReduce(1); // The right-associative version of reduce, also known as `foldr`. - // Delegates to **ECMAScript 5**'s native `reduceRight` if available. - _.reduceRight = _.foldr = function(obj, iterator, memo, context) { - var initial = arguments.length > 2; - if (obj == null) obj = []; - if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); - } - var length = obj.length; - if (length !== +length) { - var keys = _.keys(obj); - length = keys.length; - } - each(obj, function(value, index, list) { - index = keys ? keys[--length] : --length; - if (!initial) { - memo = obj[index]; - initial = true; - } else { - memo = iterator.call(context, memo, obj[index], index, list); - } - }); - if (!initial) throw new TypeError(reduceError); - return memo; - }; + _.reduceRight = _.foldr = createReduce(-1); // Return the first value which passes a truth test. Aliased as `detect`. - _.find = _.detect = function(obj, iterator, context) { - var result; - any(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) { - result = value; - return true; - } - }); - return result; + _.find = _.detect = function(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? _.findIndex : _.findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; }; // Return all the elements that pass a truth test. - // Delegates to **ECMAScript 5**'s native `filter` if available. // Aliased as `select`. - _.filter = _.select = function(obj, iterator, context) { + _.filter = _.select = function(obj, predicate, context) { var results = []; - if (obj == null) return results; - if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); - each(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) results.push(value); + predicate = cb(predicate, context); + _.each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); }); return results; }; // Return all the elements for which a truth test fails. - _.reject = function(obj, iterator, context) { - return _.filter(obj, function(value, index, list) { - return !iterator.call(context, value, index, list); - }, context); + _.reject = function(obj, predicate, context) { + return _.filter(obj, _.negate(cb(predicate)), context); }; // Determine whether all of the elements match a truth test. - // Delegates to **ECMAScript 5**'s native `every` if available. // Aliased as `all`. - _.every = _.all = function(obj, iterator, context) { - iterator || (iterator = _.identity); - var result = true; - if (obj == null) return result; - if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context); - each(obj, function(value, index, list) { - if (!(result = result && iterator.call(context, value, index, list))) return breaker; - }); - return !!result; + _.every = _.all = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; }; // Determine if at least one element in the object matches a truth test. - // Delegates to **ECMAScript 5**'s native `some` if available. // Aliased as `any`. - var any = _.some = _.any = function(obj, iterator, context) { - iterator || (iterator = _.identity); - var result = false; - if (obj == null) return result; - if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context); - each(obj, function(value, index, list) { - if (result || (result = iterator.call(context, value, index, list))) return breaker; - }); - return !!result; + _.some = _.any = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; }; - // Determine if the array or object contains a given value (using `===`). - // Aliased as `include`. - _.contains = _.include = function(obj, target) { - if (obj == null) return false; - if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; - return any(obj, function(value) { - return value === target; - }); + // Determine if the array or object contains a given item (using `===`). + // Aliased as `includes` and `include`. + _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return _.indexOf(obj, item, fromIndex) >= 0; }; // Invoke a method (with arguments) on every item in a collection. - _.invoke = function(obj, method) { - var args = slice.call(arguments, 2); - var isFunc = _.isFunction(method); - return _.map(obj, function(value) { - return (isFunc ? method : value[method]).apply(value, args); + _.invoke = restArgs(function(obj, path, args) { + var contextPath, func; + if (_.isFunction(path)) { + func = path; + } else if (_.isArray(path)) { + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return _.map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); }); - }; + }); // Convenience version of a common use case of `map`: fetching a property. _.pluck = function(obj, key) { - return _.map(obj, function(value){ return value[key]; }); + return _.map(obj, _.property(key)); }; // Convenience version of a common use case of `filter`: selecting only objects // containing specific `key:value` pairs. - _.where = function(obj, attrs, first) { - if (_.isEmpty(attrs)) return first ? void 0 : []; - return _[first ? 'find' : 'filter'](obj, function(value) { - for (var key in attrs) { - if (attrs[key] !== value[key]) return false; - } - return true; - }); + _.where = function(obj, attrs) { + return _.filter(obj, _.matcher(attrs)); }; // Convenience version of a common use case of `find`: getting the first object // containing specific `key:value` pairs. _.findWhere = function(obj, attrs) { - return _.where(obj, attrs, true); + return _.find(obj, _.matcher(attrs)); }; - // Return the maximum element or (element-based computation). - // Can't optimize arrays of integers longer than 65,535 elements. - // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797) - _.max = function(obj, iterator, context) { - if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { - return Math.max.apply(Math, obj); + // Return the maximum element (or element-based computation). + _.max = function(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object') && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || computed === -Infinity && result === -Infinity) { + result = v; + lastComputed = computed; + } + }); } - if (!iterator && _.isEmpty(obj)) return -Infinity; - var result = {computed : -Infinity, value: -Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed > result.computed && (result = {value : value, computed : computed}); - }); - return result.value; + return result; }; // Return the minimum element (or element-based computation). - _.min = function(obj, iterator, context) { - if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { - return Math.min.apply(Math, obj); + _.min = function(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object') && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || computed === Infinity && result === Infinity) { + result = v; + lastComputed = computed; + } + }); } - if (!iterator && _.isEmpty(obj)) return Infinity; - var result = {computed : Infinity, value: Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed < result.computed && (result = {value : value, computed : computed}); - }); - return result.value; + return result; }; - // Shuffle an array, using the modern version of the - // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // Shuffle a collection. _.shuffle = function(obj) { - var rand; - var index = 0; - var shuffled = []; - each(obj, function(value) { - rand = _.random(index++); - shuffled[index - 1] = shuffled[rand]; - shuffled[rand] = value; - }); - return shuffled; + return _.sample(obj, Infinity); }; - // Sample **n** random values from an array. - // If **n** is not specified, returns a single random element from the array. + // Sample **n** random values from a collection using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // If **n** is not specified, returns a single random element. // The internal `guard` argument allows it to work with `map`. _.sample = function(obj, n, guard) { - if (arguments.length < 2 || guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = _.values(obj); return obj[_.random(obj.length - 1)]; } - return _.shuffle(obj).slice(0, Math.max(0, n)); + var sample = isArrayLike(obj) ? _.clone(obj) : _.values(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = _.random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); }; - // An internal function to generate lookup iterators. - var lookupIterator = function(value) { - return _.isFunction(value) ? value : function(obj){ return obj[value]; }; - }; - - // Sort the object's values by a criterion produced by an iterator. - _.sortBy = function(obj, value, context) { - var iterator = lookupIterator(value); - return _.pluck(_.map(obj, function(value, index, list) { + // Sort the object's values by a criterion produced by an iteratee. + _.sortBy = function(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return _.pluck(_.map(obj, function(value, key, list) { return { value: value, - index: index, - criteria: iterator.call(context, value, index, list) + index: index++, + criteria: iteratee(value, key, list) }; }).sort(function(left, right) { var a = left.criteria; @@ -333,13 +429,13 @@ }; // An internal function used for aggregate "group by" operations. - var group = function(behavior) { - return function(obj, value, context) { - var result = {}; - var iterator = value == null ? _.identity : lookupIterator(value); - each(obj, function(value, index) { - var key = iterator.call(context, value, index, obj); - behavior(result, key, value); + var group = function(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + _.each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); }); return result; }; @@ -347,50 +443,48 @@ // Groups the object's values by a criterion. Pass either a string attribute // to group by, or a function that returns the criterion. - _.groupBy = group(function(result, key, value) { - (_.has(result, key) ? result[key] : (result[key] = [])).push(value); + _.groupBy = group(function(result, value, key) { + if (_.has(result, key)) result[key].push(value); else result[key] = [value]; }); // Indexes the object's values by a criterion, similar to `groupBy`, but for // when you know that your index values will be unique. - _.indexBy = group(function(result, key, value) { + _.indexBy = group(function(result, value, key) { result[key] = value; }); // Counts instances of an object that group by a certain criterion. Pass // either a string attribute to count by, or a function that returns the // criterion. - _.countBy = group(function(result, key) { - _.has(result, key) ? result[key]++ : result[key] = 1; + _.countBy = group(function(result, value, key) { + if (_.has(result, key)) result[key]++; else result[key] = 1; }); - // Use a comparator function to figure out the smallest index at which - // an object should be inserted so as to maintain order. Uses binary search. - _.sortedIndex = function(array, obj, iterator, context) { - iterator = iterator == null ? _.identity : lookupIterator(iterator); - var value = iterator.call(context, obj); - var low = 0, high = array.length; - while (low < high) { - var mid = (low + high) >>> 1; - iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid; - } - return low; - }; - + var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; // Safely create a real, live array from anything iterable. _.toArray = function(obj) { if (!obj) return []; if (_.isArray(obj)) return slice.call(obj); - if (obj.length === +obj.length) return _.map(obj, _.identity); + if (_.isString(obj)) { + // Keep surrogate pair characters together + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return _.map(obj, _.identity); return _.values(obj); }; // Return the number of elements in an object. _.size = function(obj) { if (obj == null) return 0; - return (obj.length === +obj.length) ? obj.length : _.keys(obj).length; + return isArrayLike(obj) ? obj.length : _.keys(obj).length; }; + // Split a collection into two arrays: one whose elements all satisfy the given + // predicate, and one whose elements all do not satisfy the predicate. + _.partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); + }, true); + // Array Functions // --------------- @@ -398,130 +492,154 @@ // values in the array. Aliased as `head` and `take`. The **guard** check // allows it to work with `_.map`. _.first = _.head = _.take = function(array, n, guard) { - if (array == null) return void 0; - return (n == null) || guard ? array[0] : slice.call(array, 0, n); + if (array == null || array.length < 1) return void 0; + if (n == null || guard) return array[0]; + return _.initial(array, array.length - n); }; // Returns everything but the last entry of the array. Especially useful on // the arguments object. Passing **n** will return all the values in - // the array, excluding the last N. The **guard** check allows it to work with - // `_.map`. + // the array, excluding the last N. _.initial = function(array, n, guard) { - return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); }; // Get the last element of an array. Passing **n** will return the last N - // values in the array. The **guard** check allows it to work with `_.map`. + // values in the array. _.last = function(array, n, guard) { - if (array == null) return void 0; - if ((n == null) || guard) { - return array[array.length - 1]; - } else { - return slice.call(array, Math.max(array.length - n, 0)); - } + if (array == null || array.length < 1) return void 0; + if (n == null || guard) return array[array.length - 1]; + return _.rest(array, Math.max(0, array.length - n)); }; // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. // Especially useful on the arguments object. Passing an **n** will return - // the rest N values in the array. The **guard** - // check allows it to work with `_.map`. + // the rest N values in the array. _.rest = _.tail = _.drop = function(array, n, guard) { - return slice.call(array, (n == null) || guard ? 1 : n); + return slice.call(array, n == null || guard ? 1 : n); }; // Trim out all falsy values from an array. _.compact = function(array) { - return _.filter(array, _.identity); + return _.filter(array, Boolean); }; // Internal implementation of a recursive `flatten` function. - var flatten = function(input, shallow, output) { - if (shallow && _.every(input, _.isArray)) { - return concat.apply(output, input); - } - each(input, function(value) { - if (_.isArray(value) || _.isArguments(value)) { - shallow ? push.apply(output, value) : flatten(value, shallow, output); - } else { - output.push(value); + var flatten = function(input, shallow, strict, output) { + output = output || []; + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { + // Flatten current level of array or arguments object. + if (shallow) { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } else { + flatten(value, shallow, strict, output); + idx = output.length; + } + } else if (!strict) { + output[idx++] = value; } - }); + } return output; }; // Flatten out an array, either recursively (by default), or just one level. _.flatten = function(array, shallow) { - return flatten(array, shallow, []); + return flatten(array, shallow, false); }; // Return a version of the array that does not contain the specified value(s). - _.without = function(array) { - return _.difference(array, slice.call(arguments, 1)); - }; + _.without = restArgs(function(array, otherArrays) { + return _.difference(array, otherArrays); + }); // Produce a duplicate-free version of the array. If the array has already // been sorted, you have the option of using a faster algorithm. // Aliased as `unique`. - _.uniq = _.unique = function(array, isSorted, iterator, context) { - if (_.isFunction(isSorted)) { - context = iterator; - iterator = isSorted; + _.uniq = _.unique = function(array, isSorted, iteratee, context) { + if (!_.isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; isSorted = false; } - var initial = iterator ? _.map(array, iterator, context) : array; - var results = []; + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; var seen = []; - each(initial, function(value, index) { - if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) { - seen.push(value); - results.push(array[index]); + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!_.contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!_.contains(result, value)) { + result.push(value); } - }); - return results; + } + return result; }; // Produce an array that contains the union: each distinct element from all of // the passed-in arrays. - _.union = function() { - return _.uniq(_.flatten(arguments, true)); - }; + _.union = restArgs(function(arrays) { + return _.uniq(flatten(arrays, true, true)); + }); // Produce an array that contains every item shared between all the // passed-in arrays. _.intersection = function(array) { - var rest = slice.call(arguments, 1); - return _.filter(_.uniq(array), function(item) { - return _.every(rest, function(other) { - return _.indexOf(other, item) >= 0; - }); - }); + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (_.contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!_.contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; }; // Take the difference between one array and a number of other arrays. // Only the elements present in just the first array will remain. - _.difference = function(array) { - var rest = concat.apply(ArrayProto, slice.call(arguments, 1)); - return _.filter(array, function(value){ return !_.contains(rest, value); }); + _.difference = restArgs(function(array, rest) { + rest = flatten(rest, true, true); + return _.filter(array, function(value){ + return !_.contains(rest, value); + }); + }); + + // Complement of _.zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices. + _.unzip = function(array) { + var length = array && _.max(array, getLength).length || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = _.pluck(array, index); + } + return result; }; // Zip together multiple lists into a single array -- elements that share // an index go together. - _.zip = function() { - var length = _.max(_.pluck(arguments, "length").concat(0)); - var results = new Array(length); - for (var i = 0; i < length; i++) { - results[i] = _.pluck(arguments, '' + i); - } - return results; - }; + _.zip = restArgs(_.unzip); // Converts lists into objects. Pass either a single array of `[key, value]` // pairs, or two parallel arrays of the same length -- one of keys, and one of - // the corresponding values. + // the corresponding values. Passing by pairs is the reverse of _.pairs. _.object = function(list, values) { - if (list == null) return {}; var result = {}; - for (var i = 0, length = list.length; i < length; i++) { + for (var i = 0, length = getLength(list); i < length; i++) { if (values) { result[list[i]] = values[i]; } else { @@ -531,127 +649,183 @@ return result; }; - // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), - // we need this function. Return the position of the first occurrence of an - // item in an array, or -1 if the item is not included in the array. - // Delegates to **ECMAScript 5**'s native `indexOf` if available. - // If the array is large and already in sort order, pass `true` - // for **isSorted** to use binary search. - _.indexOf = function(array, item, isSorted) { - if (array == null) return -1; - var i = 0, length = array.length; - if (isSorted) { - if (typeof isSorted == 'number') { - i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted); - } else { - i = _.sortedIndex(array, item); - return array[i] === item ? i : -1; + // Generator function to create the findIndex and findLastIndex functions. + var createPredicateIndexFinder = function(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; } - } - if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted); - for (; i < length; i++) if (array[i] === item) return i; - return -1; + return -1; + }; }; - // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. - _.lastIndexOf = function(array, item, from) { - if (array == null) return -1; - var hasIndex = from != null; - if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) { - return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item); + // Returns the first index on an array-like that passes a predicate test. + _.findIndex = createPredicateIndexFinder(1); + _.findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; } - var i = (hasIndex ? from : array.length); - while (i--) if (array[i] === item) return i; - return -1; + return low; }; + // Generator function to create the indexOf and lastIndexOf functions. + var createIndexFinder = function(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), _.isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + }; + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex); + _.lastIndexOf = createIndexFinder(-1, _.findLastIndex); + // Generate an integer Array containing an arithmetic progression. A port of // the native Python `range()` function. See // [the Python documentation](http://docs.python.org/library/functions.html#range). _.range = function(start, stop, step) { - if (arguments.length <= 1) { + if (stop == null) { stop = start || 0; start = 0; } - step = arguments[2] || 1; + if (!step) { + step = stop < start ? -1 : 1; + } var length = Math.max(Math.ceil((stop - start) / step), 0); - var idx = 0; - var range = new Array(length); + var range = Array(length); - while(idx < length) { - range[idx++] = start; - start += step; + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; } return range; }; + // Split an **array** into several arrays containing **count** or less elements + // of initial array. + _.chunk = function(array, count) { + if (count == null || count < 1) return []; + + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; + }; + // Function (ahem) Functions // ------------------ - // Reusable constructor function for prototype setting. - var ctor = function(){}; + // Determines whether to execute a function as a constructor + // or a normal function with the provided arguments. + var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (_.isObject(result)) return result; + return self; + }; // Create a function bound to a given object (assigning `this`, and arguments, // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if // available. - _.bind = function(func, context) { - var args, bound; - if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); - if (!_.isFunction(func)) throw new TypeError; - args = slice.call(arguments, 2); - return bound = function() { - if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); - ctor.prototype = func.prototype; - var self = new ctor; - ctor.prototype = null; - var result = func.apply(self, args.concat(slice.call(arguments))); - if (Object(result) === result) return result; - return self; - }; - }; + _.bind = restArgs(function(func, context, args) { + if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArgs(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; + }); // Partially apply a function by creating a version that has had some of its - // arguments pre-filled, without changing its dynamic `this` context. - _.partial = function(func) { - var args = slice.call(arguments, 1); - return function() { - return func.apply(this, args.concat(slice.call(arguments))); + // arguments pre-filled, without changing its dynamic `this` context. _ acts + // as a placeholder by default, allowing any combination of arguments to be + // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. + _.partial = restArgs(function(func, boundArgs) { + var placeholder = _.partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); }; - }; + return bound; + }); - // Bind all of an object's methods to that object. Useful for ensuring that - // all callbacks defined on an object belong to it. - _.bindAll = function(obj) { - var funcs = slice.call(arguments, 1); - if (funcs.length === 0) throw new Error("bindAll must be passed function names"); - each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); - return obj; - }; + _.partial.placeholder = _; + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + _.bindAll = restArgs(function(obj, keys) { + keys = flatten(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = _.bind(obj[key], obj); + } + }); // Memoize an expensive function by storing its results. _.memoize = function(func, hasher) { - var memo = {}; - hasher || (hasher = _.identity); - return function() { - var key = hasher.apply(this, arguments); - return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!_.has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; }; + memoize.cache = {}; + return memoize; }; // Delays a function for the given number of milliseconds, and then calls // it with the arguments supplied. - _.delay = function(func, wait) { - var args = slice.call(arguments, 2); - return setTimeout(function(){ return func.apply(null, args); }, wait); - }; + _.delay = restArgs(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); + }); // Defers a function, scheduling it to run after the current call stack has // cleared. - _.defer = function(func) { - return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); - }; + _.defer = _.partial(_.delay, _, 1); // Returns a function, that, when invoked, will only be triggered at most once // during a given window of time. Normally, the throttled function will run @@ -659,31 +833,44 @@ // but if you'd like to disable the execution on the leading edge, pass // `{leading: false}`. To disable execution on the trailing edge, ditto. _.throttle = function(func, wait, options) { - var context, args, result; - var timeout = null; + var timeout, context, args, result; var previous = 0; - options || (options = {}); + if (!options) options = {}; + var later = function() { - previous = options.leading === false ? 0 : new Date; + previous = options.leading === false ? 0 : _.now(); timeout = null; result = func.apply(context, args); + if (!timeout) context = args = null; }; - return function() { - var now = new Date; + + var throttled = function() { + var now = _.now(); if (!previous && options.leading === false) previous = now; var remaining = wait - (now - previous); context = this; args = arguments; - if (remaining <= 0) { - clearTimeout(timeout); - timeout = null; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } previous = now; result = func.apply(context, args); + if (!timeout) context = args = null; } else if (!timeout && options.trailing !== false) { timeout = setTimeout(later, remaining); } return result; }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; }; // Returns a function, that, as long as it continues to be invoked, will not @@ -691,67 +878,62 @@ // N milliseconds. If `immediate` is passed, trigger the function on the // leading edge, instead of the trailing. _.debounce = function(func, wait, immediate) { - var timeout, args, context, timestamp, result; - return function() { - context = this; - args = arguments; - timestamp = new Date(); - var later = function() { - var last = (new Date()) - timestamp; - if (last < wait) { - timeout = setTimeout(later, wait - last); - } else { - timeout = null; - if (!immediate) result = func.apply(context, args); - } - }; - var callNow = immediate && !timeout; - if (!timeout) { - timeout = setTimeout(later, wait); - } - if (callNow) result = func.apply(context, args); - return result; - }; - }; + var timeout, result; - // Returns a function that will be executed at most one time, no matter how - // often you call it. Useful for lazy initialization. - _.once = function(func) { - var ran = false, memo; - return function() { - if (ran) return memo; - ran = true; - memo = func.apply(this, arguments); - func = null; - return memo; + var later = function(context, args) { + timeout = null; + if (args) result = func.apply(context, args); }; + + var debounced = restArgs(function(args) { + if (timeout) clearTimeout(timeout); + if (immediate) { + var callNow = !timeout; + timeout = setTimeout(later, wait); + if (callNow) result = func.apply(this, args); + } else { + timeout = _.delay(later, wait, this, args); + } + + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = null; + }; + + return debounced; }; // Returns the first function passed as an argument to the second, // allowing you to adjust arguments, run code before and after, and // conditionally execute the original function. _.wrap = function(func, wrapper) { + return _.partial(wrapper, func); + }; + + // Returns a negated version of the passed-in predicate. + _.negate = function(predicate) { return function() { - var args = [func]; - push.apply(args, arguments); - return wrapper.apply(this, args); + return !predicate.apply(this, arguments); }; }; // Returns a function that is the composition of a list of functions, each // consuming the return value of the function that follows. _.compose = function() { - var funcs = arguments; + var args = arguments; + var start = args.length - 1; return function() { - var args = arguments; - for (var i = funcs.length - 1; i >= 0; i--) { - args = [funcs[i].apply(this, args)]; - } - return args[0]; + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; }; }; - // Returns a function that will only be executed after being called N times. + // Returns a function that will only be executed on and after the Nth call. _.after = function(times, func) { return function() { if (--times < 1) { @@ -760,15 +942,68 @@ }; }; + // Returns a function that will only be executed up to (but not including) the Nth call. + _.before = function(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = _.partial(_.before, 2); + + _.restArgs = restArgs; + // Object Functions // ---------------- - // Retrieve the names of an object's properties. - // Delegates to **ECMAScript 5**'s native `Object.keys` - _.keys = nativeKeys || function(obj) { - if (obj !== Object(obj)) throw new TypeError('Invalid object'); + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + var collectNonEnumProps = function(obj, keys) { + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = _.isFunction(constructor) && constructor.prototype || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) { + keys.push(prop); + } + } + }; + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys`. + _.keys = function(obj) { + if (!_.isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); var keys = []; for (var key in obj) if (_.has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve all the property names of an object. + _.allKeys = function(obj) { + if (!_.isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); return keys; }; @@ -776,18 +1011,33 @@ _.values = function(obj) { var keys = _.keys(obj); var length = keys.length; - var values = new Array(length); + var values = Array(length); for (var i = 0; i < length; i++) { values[i] = obj[keys[i]]; } return values; }; + // Returns the results of applying the iteratee to each element of the object. + // In contrast to _.map it returns an object. + _.mapObject = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = _.keys(obj), + length = keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + // Convert an object into a list of `[key, value]` pairs. + // The opposite of _.object. _.pairs = function(obj) { var keys = _.keys(obj); var length = keys.length; - var pairs = new Array(length); + var pairs = Array(length); for (var i = 0; i < length; i++) { pairs[i] = [keys[i], obj[keys[i]]]; } @@ -805,7 +1055,7 @@ }; // Return a sorted list of the function names available on the object. - // Aliased as `methods` + // Aliased as `methods`. _.functions = _.methods = function(obj) { var names = []; for (var key in obj) { @@ -814,48 +1064,92 @@ return names.sort(); }; - // Extend a given object with all the properties in passed-in object(s). - _.extend = function(obj) { - each(slice.call(arguments, 1), function(source) { - if (source) { - for (var prop in source) { - obj[prop] = source[prop]; + // An internal function for creating assigner functions. + var createAssigner = function(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; } } - }); - return obj; + return obj; + }; + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = createAssigner(_.allKeys); + + // Assigns a given object with all the own properties in the passed-in object(s). + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + _.extendOwn = _.assign = createAssigner(_.keys); + + // Returns the first key on an object that passes a predicate test. + _.findKey = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = _.keys(obj), key; + for (var i = 0, length = keys.length; i < length; i++) { + key = keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + }; + + // Internal pick helper function to determine if `obj` has key `key`. + var keyInObj = function(value, key, obj) { + return key in obj; }; // Return a copy of the object only containing the whitelisted properties. - _.pick = function(obj) { - var copy = {}; - var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); - each(keys, function(key) { - if (key in obj) copy[key] = obj[key]; - }); - return copy; - }; - - // Return a copy of the object without the blacklisted properties. - _.omit = function(obj) { - var copy = {}; - var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); - for (var key in obj) { - if (!_.contains(keys, key)) copy[key] = obj[key]; + _.pick = restArgs(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (_.isFunction(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = _.allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten(keys, false, false); + obj = Object(obj); } - return copy; - }; + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }); + + // Return a copy of the object without the blacklisted properties. + _.omit = restArgs(function(obj, keys) { + var iteratee = keys[0], context; + if (_.isFunction(iteratee)) { + iteratee = _.negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = _.map(flatten(keys, false, false), String); + iteratee = function(value, key) { + return !_.contains(keys, key); + }; + } + return _.pick(obj, iteratee, context); + }); // Fill in a given object with default properties. - _.defaults = function(obj) { - each(slice.call(arguments, 1), function(source) { - if (source) { - for (var prop in source) { - if (obj[prop] === void 0) obj[prop] = source[prop]; - } - } - }); - return obj; + _.defaults = createAssigner(_.allKeys, true); + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + _.create = function(prototype, props) { + var result = baseCreate(prototype); + if (props) _.extendOwn(result, props); + return result; }; // Create a (shallow-cloned) duplicate of an object. @@ -872,109 +1166,136 @@ return obj; }; + // Returns whether an object has a given set of `key:value` pairs. + _.isMatch = function(object, attrs) { + var keys = _.keys(attrs), length = keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + }; + + // Internal recursive comparison function for `isEqual`. - var eq = function(a, b, aStack, bStack) { + var eq, deepEq; + eq = function(a, b, aStack, bStack) { // Identical objects are equal. `0 === -0`, but they aren't identical. // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). - if (a === b) return a !== 0 || 1 / a == 1 / b; - // A strict comparison is necessary because `null == undefined`. - if (a == null || b == null) return a === b; + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); + }; + + // Internal recursive comparison function for `isEqual`. + deepEq = function(a, b, aStack, bStack) { // Unwrap any wrapped objects. if (a instanceof _) a = a._wrapped; if (b instanceof _) b = b._wrapped; // Compare `[[Class]]` names. var className = toString.call(a); - if (className != toString.call(b)) return false; + if (className !== toString.call(b)) return false; switch (className) { - // Strings, numbers, dates, and booleans are compared by value. + // Strings, numbers, regular expressions, dates, and booleans are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') case '[object String]': // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is // equivalent to `new String("5")`. - return a == String(b); + return '' + a === '' + b; case '[object Number]': - // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for - // other numeric values. - return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b); + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; case '[object Date]': case '[object Boolean]': // Coerce dates and booleans to numeric primitive values. Dates are compared by their // millisecond representations. Note that invalid dates with millisecond representations // of `NaN` are not equivalent. - return +a == +b; - // RegExps are compared by their source patterns and flags. - case '[object RegExp]': - return a.source == b.source && - a.global == b.global && - a.multiline == b.multiline && - a.ignoreCase == b.ignoreCase; + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + } + + var areArrays = className === '[object Array]'; + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor && + _.isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } } - if (typeof a != 'object' || typeof b != 'object') return false; // Assume equality for cyclic structures. The algorithm for detecting cyclic // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; var length = aStack.length; while (length--) { // Linear search. Performance is inversely proportional to the number of // unique nested structures. - if (aStack[length] == a) return bStack[length] == b; - } - // Objects with different constructors are not equivalent, but `Object`s - // from different frames are. - var aCtor = a.constructor, bCtor = b.constructor; - if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) && - _.isFunction(bCtor) && (bCtor instanceof bCtor))) { - return false; + if (aStack[length] === a) return bStack[length] === b; } + // Add the first object to the stack of traversed objects. aStack.push(a); bStack.push(b); - var size = 0, result = true; + // Recursively compare objects and arrays. - if (className == '[object Array]') { + if (areArrays) { // Compare array lengths to determine if a deep comparison is necessary. - size = a.length; - result = size == b.length; - if (result) { - // Deep compare the contents, ignoring non-numeric properties. - while (size--) { - if (!(result = eq(a[size], b[size], aStack, bStack))) break; - } + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; } } else { // Deep compare objects. - for (var key in a) { - if (_.has(a, key)) { - // Count the expected number of properties. - size++; - // Deep compare each member. - if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break; - } - } - // Ensure that both objects contain the same number of properties. - if (result) { - for (key in b) { - if (_.has(b, key) && !(size--)) break; - } - result = !size; + var keys = _.keys(a), key; + length = keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (_.keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = keys[length]; + if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; } } // Remove the first object from the stack of traversed objects. aStack.pop(); bStack.pop(); - return result; + return true; }; // Perform a deep comparison to check if two objects are equal. _.isEqual = function(a, b) { - return eq(a, b, [], []); + return eq(a, b); }; // Is a given array, string, or object empty? // An "empty" object has no enumerable own-properties. _.isEmpty = function(obj) { if (obj == null) return true; - if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; - for (var key in obj) if (_.has(obj, key)) return false; - return true; + if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0; + return _.keys(obj).length === 0; }; // Is a given value a DOM element? @@ -985,49 +1306,52 @@ // Is a given value an array? // Delegates to ECMA5's native Array.isArray _.isArray = nativeIsArray || function(obj) { - return toString.call(obj) == '[object Array]'; + return toString.call(obj) === '[object Array]'; }; // Is a given variable an object? _.isObject = function(obj) { - return obj === Object(obj); + var type = typeof obj; + return type === 'function' || type === 'object' && !!obj; }; - // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp. - each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) { + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet. + _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'], function(name) { _['is' + name] = function(obj) { - return toString.call(obj) == '[object ' + name + ']'; + return toString.call(obj) === '[object ' + name + ']'; }; }); - // Define a fallback version of the method in browsers (ahem, IE), where + // Define a fallback version of the method in browsers (ahem, IE < 9), where // there isn't any inspectable "Arguments" type. if (!_.isArguments(arguments)) { _.isArguments = function(obj) { - return !!(obj && _.has(obj, 'callee')); + return _.has(obj, 'callee'); }; } - // Optimize `isFunction` if appropriate. - if (typeof (/./) !== 'function') { + // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8, + // IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). + var nodelist = root.document && root.document.childNodes; + if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { _.isFunction = function(obj) { - return typeof obj === 'function'; + return typeof obj == 'function' || false; }; } // Is a given object a finite number? _.isFinite = function(obj) { - return isFinite(obj) && !isNaN(parseFloat(obj)); + return !_.isSymbol(obj) && isFinite(obj) && !isNaN(parseFloat(obj)); }; - // Is the given value `NaN`? (NaN is the only number which does not equal itself). + // Is the given value `NaN`? _.isNaN = function(obj) { - return _.isNumber(obj) && obj != +obj; + return _.isNumber(obj) && isNaN(obj); }; // Is a given value a boolean? _.isBoolean = function(obj) { - return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; }; // Is a given value equal to null? @@ -1042,8 +1366,19 @@ // Shortcut function for checking if an object has a given property directly // on itself (in other words, not on a prototype). - _.has = function(obj, key) { - return hasOwnProperty.call(obj, key); + _.has = function(obj, path) { + if (!_.isArray(path)) { + return obj != null && hasOwnProperty.call(obj, path); + } + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (obj == null || !hasOwnProperty.call(obj, key)) { + return false; + } + obj = obj[key]; + } + return !!length; }; // Utility Functions @@ -1056,15 +1391,53 @@ return this; }; - // Keep the identity function around for default iterators. + // Keep the identity function around for default iteratees. _.identity = function(value) { return value; }; + // Predicate-generating functions. Often useful outside of Underscore. + _.constant = function(value) { + return function() { + return value; + }; + }; + + _.noop = function(){}; + + _.property = function(path) { + if (!_.isArray(path)) { + return shallowProperty(path); + } + return function(obj) { + return deepGet(obj, path); + }; + }; + + // Generates a function for a given object that returns a given property. + _.propertyOf = function(obj) { + if (obj == null) { + return function(){}; + } + return function(path) { + return !_.isArray(path) ? obj[path] : deepGet(obj, path); + }; + }; + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + _.matcher = _.matches = function(attrs) { + attrs = _.extendOwn({}, attrs); + return function(obj) { + return _.isMatch(obj, attrs); + }; + }; + // Run a function **n** times. - _.times = function(n, iterator, context) { + _.times = function(n, iteratee, context) { var accum = Array(Math.max(0, n)); - for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); return accum; }; @@ -1077,52 +1450,57 @@ return min + Math.floor(Math.random() * (max - min + 1)); }; - // List of HTML entities for escaping. - var entityMap = { - escape: { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - } + // A (possibly faster) way to get the current timestamp as an integer. + _.now = Date.now || function() { + return new Date().getTime(); }; - entityMap.unescape = _.invert(entityMap.escape); - // Regexes containing the keys and values listed immediately above. - var entityRegexes = { - escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'), - unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g') + // List of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' }; + var unescapeMap = _.invert(escapeMap); // Functions for escaping and unescaping strings to/from HTML interpolation. - _.each(['escape', 'unescape'], function(method) { - _[method] = function(string) { - if (string == null) return ''; - return ('' + string).replace(entityRegexes[method], function(match) { - return entityMap[method][match]; - }); + var createEscaper = function(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + _.keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; }; - }); - - // If the value of the named `property` is a function then invoke it with the - // `object` as context; otherwise, return it. - _.result = function(object, property) { - if (object == null) return void 0; - var value = object[property]; - return _.isFunction(value) ? value.call(object) : value; }; + _.escape = createEscaper(escapeMap); + _.unescape = createEscaper(unescapeMap); - // Add your own custom functions to the Underscore object. - _.mixin = function(obj) { - each(_.functions(obj), function(name) { - var func = _[name] = obj[name]; - _.prototype[name] = function() { - var args = [this._wrapped]; - push.apply(args, arguments); - return result.call(this, func.apply(_, args)); - }; - }); + // Traverses the children of `obj` along `path`. If a child is a function, it + // is invoked with its parent as context. Returns the value of the final + // child, or `fallback` if any child is undefined. + _.result = function(obj, path, fallback) { + if (!_.isArray(path)) path = [path]; + var length = path.length; + if (!length) { + return _.isFunction(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = _.isFunction(prop) ? prop.call(obj) : prop; + } + return obj; }; // Generate a unique integer id (unique within the entire client session). @@ -1136,9 +1514,9 @@ // By default, Underscore uses ERB-style template delimiters, change the // following template settings to use alternative delimiters. _.templateSettings = { - evaluate : /<%([\s\S]+?)%>/g, - interpolate : /<%=([\s\S]+?)%>/g, - escape : /<%-([\s\S]+?)%>/g + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g }; // When customizing `templateSettings`, if you don't want to define an @@ -1149,26 +1527,30 @@ // Certain characters need to be escaped so that they can be put into a // string literal. var escapes = { - "'": "'", - '\\': '\\', - '\r': 'r', - '\n': 'n', - '\t': 't', + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', '\u2028': 'u2028', '\u2029': 'u2029' }; - var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; + var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + + var escapeChar = function(match) { + return '\\' + escapes[match]; + }; // JavaScript micro-templating, similar to John Resig's implementation. // Underscore templating handles arbitrary delimiters, preserves whitespace, // and correctly escapes quotes within interpolated code. - _.template = function(text, data, settings) { - var render; + // NB: `oldSettings` only exists for backwards compatibility. + _.template = function(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; settings = _.defaults({}, settings, _.templateSettings); // Combine delimiters into one regular expression via alternation. - var matcher = new RegExp([ + var matcher = RegExp([ (settings.escape || noMatch).source, (settings.interpolate || noMatch).source, (settings.evaluate || noMatch).source @@ -1178,19 +1560,18 @@ var index = 0; var source = "__p+='"; text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { - source += text.slice(index, offset) - .replace(escaper, function(match) { return '\\' + escapes[match]; }); + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; if (escape) { source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; - } - if (interpolate) { + } else if (interpolate) { source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; - } - if (evaluate) { + } else if (evaluate) { source += "';\n" + evaluate + "\n__p+='"; } - index = offset + match.length; + + // Adobe VMs need the match returned to produce the correct offset. return match; }); source += "';\n"; @@ -1200,8 +1581,9 @@ source = "var __t,__p='',__j=Array.prototype.join," + "print=function(){__p+=__j.call(arguments,'');};\n" + - source + "return __p;\n"; + source + 'return __p;\n'; + var render; try { render = new Function(settings.variable || 'obj', '_', source); } catch (e) { @@ -1209,20 +1591,22 @@ throw e; } - if (data) return render(data, _); var template = function(data) { return render.call(this, data, _); }; - // Provide the compiled function source as a convenience for precompilation. - template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}'; + // Provide the compiled source as a convenience for precompilation. + var argument = settings.variable || 'obj'; + template.source = 'function(' + argument + '){\n' + source + '}'; return template; }; - // Add a "chain" function, which will delegate to the wrapper. + // Add a "chain" function. Start chaining a wrapped Underscore object. _.chain = function(obj) { - return _(obj).chain(); + var instance = _(obj); + instance._chain = true; + return instance; }; // OOP @@ -1232,45 +1616,68 @@ // underscore functions. Wrapped objects may be chained. // Helper function to continue chaining intermediate results. - var result = function(obj) { - return this._chain ? _(obj).chain() : obj; + var chainResult = function(instance, obj) { + return instance._chain ? _(obj).chain() : obj; + }; + + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + _.each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_, args)); + }; + }); + return _; }; // Add all of the Underscore functions to the wrapper object. _.mixin(_); // Add all mutator Array functions to the wrapper. - each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { var method = ArrayProto[name]; _.prototype[name] = function() { var obj = this._wrapped; method.apply(obj, arguments); - if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0]; - return result.call(this, obj); + if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; + return chainResult(this, obj); }; }); // Add all accessor Array functions to the wrapper. - each(['concat', 'join', 'slice'], function(name) { + _.each(['concat', 'join', 'slice'], function(name) { var method = ArrayProto[name]; _.prototype[name] = function() { - return result.call(this, method.apply(this._wrapped, arguments)); + return chainResult(this, method.apply(this._wrapped, arguments)); }; }); - _.extend(_.prototype, { + // Extracts the result from a wrapped and chained object. + _.prototype.value = function() { + return this._wrapped; + }; - // Start chaining a wrapped Underscore object. - chain: function() { - this._chain = true; - return this; - }, + // Provide unwrapping proxy for some methods used in engine operations + // such as arithmetic and JSON stringification. + _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; - // Extracts the result from a wrapped and chained object. - value: function() { - return this._wrapped; - } + _.prototype.toString = function() { + return String(this._wrapped); + }; - }); - -}).call(this); + // AMD registration happens at the end for compatibility with AMD loaders + // that may not enforce next-turn semantics on modules. Even though general + // practice for AMD registration is to be anonymous, underscore registers + // as a named module because, like jQuery, it is a base library that is + // popular enough to be bundled in a third party lib, but not be part of + // an AMD load request. Those cases could generate an error when an + // anonymous define() is called outside of a loader request. + if (typeof define == 'function' && define.amd) { + define('underscore', [], function() { + return _; + }); + } +}());