Dumby
Я имел ввиду выделять userChoice, а не наоборот, у себя изменил.
По поводу пунктов true-false:
Текст значения после заголовка добавьте пожалуйста, что бы к единому стилю привести. Например после:
pref: ["javascript.enabled", "Выполнять скрипты Java", "", "javascript.enabled"], userChoice: true, refresh: true, values: [[true, "Да"], [false, "Нет"]]
user ? node.style.setProperty("font-weight", "bold", "important") : node.style.removeProperty("font-weight");
Отредактировано _zt (13-08-2020 18:33:41)
Отсутствует
Вот здесь же bold для user задается, или я чего то не понял.
это для текущего значения - prefHasUserValue, а чтобы проверить другие значения (в подменю) нужно определить его дефолтное значение,
не переключать же настройку и проверять каждое...
Отсутствует
Vitaliy V.
Теперь понятно. Тогда может на базе вашего кода решение найдется.
Dumby
maroon я у помянул так как он у меня не работает. Сами видите какое у меня меню, так что не удивительно, что цвета в нем не работают.
Вы все правильно сделали, только, на мой взгляд, логичнее UserChoice выделять, а не отличные от него.
Хотя, ради баловства, можно для каждого значения свою иконку назначить - UserChoice / notUserChoice.
Отредактировано _zt (13-08-2020 16:12:57)
Отсутствует
Dumby
Все таки добавил иконку на notUserChoice. Казалось, что будет сложнее.
Теперь вопрос появился, а нельзя ли на иконку (или весь пункт) клик ЛКМ повесить? (ПКМ там и так работает, сбрасывает значение на "по умолчанию" (я так понимаю)).
Дело в том, что подменю может появится и справа и слева, и все это приводит к бестолковым перемещениям мыши. А так можно будет только информацию снимать глазами с подменю, а переключать щелчком мыши.
Последовательное переключение неприемлемо (из-за refresh: true, restart: true), но можно добавить какой нибудь UserAlt и переключать по клику ЛКМ (UserChoice > UserAlt, UserAlt > UserChoice), если UserAlt назначен пункту.
В этом случае, UserAlt тоже можно будет свою иконку приделать.
Отредактировано _zt (13-08-2020 18:29:59)
Отсутствует
Добрый день. Посмотрите пожалуйста код для FF71 " Удалить куки текущего сайта в контекстном меню на странице" для контекстного меню.
// Удалить куки текущего сайта в контекстном меню на странице, от 06.03.2017. ................ (()=> { (contextMenu=> { var menu = contextMenu.appendChild(document.createElement("menu")); menu.id = "content-removeCookies." menu.setAttribute("label", "Удалить куки текущего сайта"); menu.setAttribute("class", "menu-iconic"); addEventListener("popupshowing", ()=> menu.setAttribute("image", gBrowser.mCurrentTab.image), false, contextMenu); addDestructor(()=> menu.remove() ); var menuPopup = menu.appendChild(document.createElement("menupopup")); var menuitem = menuPopup.appendChild(document.createElement("menuitem")); menuitem.setAttribute("label", "Удалить"); menuitem.onclick =()=> { var host = Services.eTLD.getBaseDomain(gBrowser.currentURI); for ( var en = Services.cookies.enumerator; en.hasMoreElements(); ) { var cookie = en.getNext().QueryInterface(Ci.nsICookie); ~cookie.host.indexOf(host.trim()) && Services.cookies.remove(cookie.host, cookie.name, cookie.path, false); } var reversedDomain = host.split("").reverse().join("") + "."; Cu.import("resource://gre/modules/FileUtils.jsm"); var file = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]); var dbConn = Services.storage.openDatabase(file); dbConn.executeSimpleSQL("DELETE FROM webappsstore2 WHERE scope LIKE \"%" + reversedDomain +"%\""); dbConn.close(); var host = content.document.domain; for( var tab of gBrowser.tabs ) { var tabHost = tab.linkedBrowser.contentDocument.location.host; if ( host == tabHost ) gBrowser.reloadTab(tab); } // очистить кэш .... try { Services.cache.evictEntries(1); Services.cache.evictEntries(2); } catch(e) { Services.cache2.clear() }; // удалить все Flash куки var dir = Services.dirsvc.get('Home', Ci.nsIFile); dir.append("Application Data"); dir.append("Macromedia"); //dir.remove(true); //dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777); dir.exists() && dir.remove(true); // Удалить Flash кукисы222 .... !dir.exists() && dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777); // Всплывающее сообщение .... var win = openDialog("chrome://global/content/alerts/alert.xul", "", "popup=yes", (gBrowser.mCurrentTab.image || "chrome://global/skin/icons/Portrait.png"), "", "Очистил куки, кеш текущего сайта и удалил Flash куки", false, null, 4); setTimeout(()=> win && win.close(), 2500); }; })(document.getElementById("contentAreaContextMenu")); })();
Отредактировано Duche (14-08-2020 13:41:07)
Отсутствует
пробовал в начало кода добавлять это:
gBrowser.selectedTab = gBrowser.addTab('http://site.ru');
Не работает)
Направление мысли верное, но следует дождаться пока загрузится.
Попробуй разместить в Инициализации, и если «нужный сайт»
прям после загрузки ещё не готов быть снапшотнутым, тогда
подними таймаут с нуля до какого-нибудь эмпирического значения.
(exec => addEventListener("click", e => { if (e.button) return; e.preventDefault(); var url = "http://site.ru"; var br = (gBrowser.selectedTab = gBrowser.addTab(url)).linkedBrowser; br.addEventListener("pageshow", () => setTimeout(exec, 0, br, url), {once: true}); }, true, this))((br, url) => gBrowser.selectedBrowser == br && br.currentURI.spec == url && custombutton.buttonCbExecuteCode(null, this, this.cbCommand) );
Хотелось бы совместить оба варианта - для _zt и для меня с методом londPress, они почему-то сильно различаются…
Ну, ты выразил пожелание чтобы менюшки закрывались,
а _zt к этому пожеланию не присоединился, и направился
куда-то в сторону единостилия. Поэтому и различаются.
Но londPress достаточно автономен, там только здесь вписан "mousedown":
for(var type of ["command", "contextmenu", "mousedown"])
и, в конце, метод mousedown, обрабатывающий это событие,
и метод londPress, куда передаётся результат обработки.
может как то так
Да! Это работает! Спасибо!
И ведь что-то подобное в коде есть, но мысль проверить
что возвращает defaultBranch мою тупую голову не посетила.
у себя изменил
Смотрю много измененений.
Скинь тогда свой код целиком, чтобы было с чем возиться.
С проставленными userAlt и userAltImg.
Резюмирую, скорее для себя, что попробовать сделать:
1. italic в субменюшках для недефолтных значений,
учитывая наставление Виталия.
2. длинное тире + лейбл и для true-false <menu>
при наличии "values".
3. Последовательное переключение по клику на <menu>
если отсутствуют restart и refresh,
иначе, переключение между userChoice и userAlt,
если присутствуют оба. Плюс иконка userAlt.
(Если текущее значение не userChoice и не userAlt
переключать на userChoice или на userAlt ?)
Всё это займёт какое-то время, полагаю.
как то можно отключить backup
Наверно да, %Profile%\extensions\custombuttons@xsms.org\components\CustomButtonsService.js
function backupProfile (phase) {if(true)return;
Удалить куки текущего сайта в контекстном меню на странице
Может подойдёт в контекстном меню не на странице, а на кнопке?
Отсутствует
firepox пишетпробовал в начало кода добавлять это:gBrowser.selectedTab = gBrowser.addTab('http://site.ru');Не работает)Направление мысли верное, но следует дождаться пока загрузится.Попробуй разместить в Инициализации, и если «нужный сайт»прям после загрузки ещё не готов быть снапшотнутым, тогдаподними таймаут с нуля до какого-нибудь эмпирического значения.
код вставил в инициализацию - ничего не сохраняется вообще
Отредактировано firepox (15-08-2020 11:40:37)
Отсутствует
Dumby
Резюмирую, скорее для себя, что попробовать сделать:
1. italic в субменюшках для недефолтных значений,
учитывая наставление Виталия.
2. длинное тире + лейбл и для true-false <menu>
при наличии "values".
3. Здесь, переключение только между userChoice и userAlt, если userAlt существует.
Если сделать иначе (например, последовательно), будет путаница и проблемы с restart и refresh.
... Думаю не стоит усложнять. Более двух никогда не нужно, и ведь еще есть уже работающий ПКМ.
Да и вообще, при последовательном переключении смысл UserAlt теряется,
он был выдуман, что бы избежать проблем последовательного переключения.
Если текущее значение не userChoice и не userAlt
переключать на userChoice или на userAlt ?
На userChoice. Так как он основной.
UserAlt в немногих пунктах потребуется, а userChoice можно прописать везде.
Смотрю много измененений.
Вы мне льстите. Не много.
Иконку UserAlt прописал и она работает, но вы проверьте за мной, я просто интуитивно сделал. В трех пунктах добавил новый атрибут.
data:text/plain;charset=utf-8;base64,Ly8g0JHRi9GB0YLRgNC+0LUg0L/QtdGA0LXQutC70Y7Rh9C10L3QuNC1INC/0LDRgNCw0LzQtdGC0YDQvtCyIGFib3V0OmNvbmZpZw0KKGFzeW5jIChuYW1lLCBpZCwgZnVuYykgPSZndDsgew0KCWlmIChuYW1lID09ICZxdW90O09iamVjdCZxdW90OykgcmV0dXJuIEN1c3RvbWl6YWJsZVVJLmNyZWF0ZVdpZGdldChmdW5jKCkpOw0KCXZhciB3aW4gPSBuYW1lID09ICZxdW90O1dpbmRvdyZxdW90OywgZyA9IENvbXBvbmVudHMudXRpbHMuaW1wb3J0KCZxdW90O3Jlc291cmNlOi8vZ3JlL21vZHVsZXMvU2VydmljZXMuanNtJnF1b3Q7LCB7fSk7DQoJaWYgKGdbaWRdKSB7aWYgKHdpbikgcmV0dXJuO30gZWxzZSBnW2lkXSA9IGZ1bmMoKTsNCglpZiAod2luKSByZXR1cm4gQ3VzdG9taXphYmxlVUkuY3JlYXRlV2lkZ2V0KGdbaWRdKTsNCglhZGREZXN0cnVjdG9yKHIgPSZndDsgcls1XSA9PSAmcXVvdDtlJnF1b3Q7ICZhbXA7JmFtcDsgZGVsZXRlIGdbaWRdKTsNCglnW2lkXS5vbkNyZWF0ZWQodGhpcyk7DQp9KSh0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICZxdW90O1F1aWNrVG9nZ2xlQWJvdXRDb25maWdTZXR0aW5ncyZxdW90OywgKCkgPSZndDsgew0KDQoJdmFyIHtwcmVmc30gPSBTZXJ2aWNlcywgZGIgPSBwcmVmcy5nZXREZWZhdWx0QnJhbmNoKCZxdW90OyZxdW90Oyk7DQoJdmFyIHB2ID0gcGFyc2VJbnQoU2VydmljZXMuYXBwaW5mby5wbGF0Zm9ybVZlcnNpb24pOw0KCXZhciB4dWxfbnMgPSAmcXVvdDtodHRwOi8vd3d3Lm1vemlsbGEub3JnL2tleW1hc3Rlci9nYXRla2VlcGVyL3RoZXJlLmlzLm9ubHkueHVsJnF1b3Q7Ow0KDQoJdmFyIGxvY2FsaG9zdCA9ICZxdW90OzEyNy4wLjAuMSZxdW90OzsNCgl2YXIgYW50aWNlbnNvcml0eSA9ICZxdW90O2h0dHBzOi8vZ2l0LmlvL2FjLWFudGljZW5zb3JpdHktcGFjJnF1b3Q7Ow0KCXZhciBhbnRpemFwcmV0ID0gJnF1b3Q7aHR0cHM6Ly9hbnRpemFwcmV0LnByb3N0b3Zwbi5vcmcvcHJveHkucGFjJnF1b3Q7Ow0KCXZhciBwYWNmaWxlID0gcHJlZnMuZ2V0U3RyaW5nUHJlZigmcXVvdDt1c2VyLnBhY2ZpbGUmcXVvdDssICZxdW90O2ZpbGU6Ly8vZXRjL3Byb3h5LnBhYyZxdW90Oyk7DQoJdmFyIHVzZXJhZ2VudCA9ICZxdW90O01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMTsgV09XNjQ7IHJ2OjU2LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvNTYuMCZxdW90OzsNCg0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCgkvLyByZWZyZXNoOg0KCS8vCWZhbHNlIC0gcmVsb2FkIGN1cnJlbnQgdGFiDQoJLy8JdHJ1ZSAtIHJlbG9hZCBjdXJyZW50IHRhYiBza2lwIGNhY2hlDQoJLy8NCgkvLyByZXN0YXJ0Og0KCS8vCWZhbHNlIC0gcmVzdGFydCBicm93c2VyDQoJLy8JdHJ1ZSAtIHJlc3RhcnQgYnJvd3NlciB3aXRoIGNvbmZpcm0NCg0KCXZhciBwcmltYXJ5ID0gW3sNCg0KCQkJcHJlZjogWyZxdW90O25ldHdvcmsucHJveHkudHlwZSZxdW90OywgJnF1b3Q70J3QsNGB0YLRgNC+0LnQutC4INC/0YDQvtC60YHQuCZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDtuZXR3b3JrLnByb3h5LnR5cGUmcXVvdDtdLA0KCQkJdXNlckNob2ljZTogNSwgdXNlckFsdDogMSwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogWw0KCQkJCVswLCAmcXVvdDvQndC1INC/0YDQvtC60YHQuNGA0L7QstCw0YLRjCZxdW90OywgJnF1b3Q7MCZxdW90O10sIFs1LCAmcXVvdDvQodC40YHRgtC10LzQvdGL0LUgKNC40LcgSUUpJnF1b3Q7LCAmcXVvdDs1JnF1b3Q7XSwgWzIsICZxdW90O9CQ0LLRgtC+IChwYWNmaWxlKSZxdW90OywgJnF1b3Q7MiZxdW90O10sDQoJCQkJWzEsICZxdW90O9Cf0YDQvtC/0LjRgdCw0L3QvdGL0LUmcXVvdDssICZxdW90OzEmcXVvdDtdLCBbNCwgJnF1b3Q70JDQstGC0L7QvtC/0YDQtdC00LXQu9C10L3QuNC1JnF1b3Q7LCAmcXVvdDs0JnF1b3Q7XQ0KCV19LA0KCQkJbnVsbCwNCgl7DQoJCQlwcmVmOiBbJnF1b3Q7cGVybWlzc2lvbnMuZGVmYXVsdC5pbWFnZSZxdW90OywgJnF1b3Q70JfQsNCz0YDRg9C20LDRgtGMINCz0YDQsNGE0LjQutGDJnF1b3Q7LCAmcXVvdDsmcXVvdDssICZxdW90O3Blcm1pc3Npb25zLmRlZmF1bHQuaW1hZ2UmcXVvdDtdLA0KCQkJdXNlckNob2ljZTogMSwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogW1sxLCAmcXVvdDvQlNCwJnF1b3Q7XSwgWzMsICZxdW90O9ChINGB0LDQudGC0LAmcXVvdDtdLCBbMiwgJnF1b3Q70J3QtdGCJnF1b3Q7XV0NCgl9LHsNCgkJCXByZWY6IFsmcXVvdDticm93c2VyLmRpc3BsYXkudXNlX2RvY3VtZW50X2ZvbnRzJnF1b3Q7LCAmcXVvdDvQl9Cw0LPRgNGD0LbQsNGC0Ywgd2ViLdGI0YDQuNGE0YLRiyZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDticm93c2VyLmRpc3BsYXkudXNlX2RvY3VtZW50X2ZvbnRzJnF1b3Q7XSwNCgkJCXVzZXJDaG9pY2U6IDEsIHJlZnJlc2g6IHRydWUsDQoJCQl2YWx1ZXM6IFtbMSwgJnF1b3Q70JTQsCZxdW90O10sIFswLCAmcXVvdDvQndC10YImcXVvdDtdXQ0KCX0sew0KCQkJcHJlZjogWyZxdW90O2phdmFzY3JpcHQuZW5hYmxlZCZxdW90OywgJnF1b3Q70JLRi9C/0L7Qu9C90Y/RgtGMINGB0LrRgNC40L/RgtGLIEphdmEmcXVvdDssICZxdW90OyZxdW90OywgJnF1b3Q7amF2YXNjcmlwdC5lbmFibGVkJnF1b3Q7XSwNCgkJCXVzZXJDaG9pY2U6IHRydWUsIHJlZnJlc2g6IHRydWUsDQoJCQl2YWx1ZXM6IFtbdHJ1ZSwgJnF1b3Q70JTQsCZxdW90O10sIFtmYWxzZSwgJnF1b3Q70J3QtdGCJnF1b3Q7XV0NCgl9LHsNCgkJCXByZWY6IFsmcXVvdDttZWRpYS5hdXRvcGxheS5kZWZhdWx0JnF1b3Q7LCAmcXVvdDvQkNCy0YLQvtC30LDQv9GD0YHQuiDQvNC10LTQuNCwJnF1b3Q7LCAmcXVvdDsmcXVvdDssICZxdW90O21lZGlhLmF1dG9wbGF5LmRlZmF1bHQmcXVvdDtdLA0KCQkJdXNlckNob2ljZTogNSwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogWw0KCQkJCVs1LCAmcXVvdDvQkdC70L7QutC40YDQvtCy0LDRgtGMINCy0YHQtSZxdW90OywgJnF1b3Q7NSZxdW90O10sDQoJCQkJWzEsICZxdW90O9CR0LvQvtC60LjRgNC+0LLQsNGC0Ywg0L3QtSDQv9GA0LjQs9C70YPRiNC10L3QvdC+0LUmcXVvdDssICZxdW90OzEmcXVvdDtdLA0KCQkJCVswLCAmcXVvdDvQoNCw0LfRgNC10YjQuNGC0Ywg0LLRgdC1JnF1b3Q7LCAmcXVvdDswJnF1b3Q7XQ0KCV19LHsNCgkJCXByZWY6IFsmcXVvdDttZWRpYS5hdXRvcGxheS5ibG9ja2luZ19wb2xpY3kmcXVvdDssICZxdW90O9CQ0LLRgtC+0LfQsNC/0YPRgdC6ICjQv9C+0LvQuNGC0LjQutCwKSZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDttZWRpYS5hdXRvcGxheS5ibG9ja2luZ19wb2xpY3kmcXVvdDtdLA0KCQkJdXNlckNob2ljZTogMSwgdXNlckFsdDogMiwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogWw0KCQkJCVsxLCAmcXVvdDvQktGA0LXQvNC10L3QvdCw0Y8mcXVvdDssICZxdW90OzEmcXVvdDtdLA0KCQkJCVsyLCAmcXVvdDvQn9C+INC00LXQudGB0YLQstC40Y4mcXVvdDssICZxdW90OzImcXVvdDtdLA0KCQkJCVswLCAmcXVvdDvQn9C+0YHRgtC+0Y/QvdC90LDRjyZxdW90OywgJnF1b3Q7MCZxdW90O10NCgldfSx7DQoJCQlwcmVmOiBbJnF1b3Q7bmV0d29yay5jb29raWUuY29va2llQmVoYXZpb3ImcXVvdDssICZxdW90O0Nvb2tpZXMmcXVvdDssICZxdW90OyZxdW90OywgJnF1b3Q7bmV0d29yay5jb29raWUuY29va2llQmVoYXZpb3ImcXVvdDtdLA0KCQkJdXNlckNob2ljZTogMSwgdXNlckFsdDogMywgcmVmcmVzaDogZmFsc2UsDQoJCQl2YWx1ZXM6IFsNCgkJCQlbMSwgJnF1b3Q70J3QtSDQv9GA0LjQvdC40LzQsNGC0Ywg0YHRgtC+0YDQvtC90L3QuNC1JnF1b3Q7XSwgWzMsICZxdW90O9Cd0LUg0L/RgNC40L3QuNC80LDRgtGMINGBINC90LUg0L/QvtGB0LXRidC10L3QvdGL0YUmcXVvdDtdLCBbNCwgJnF1b3Q70J3QtSDQv9GA0LjQvdC40LzQsNGC0Ywg0L7RgiDRgtGA0LXQutC10YDQvtCyJnF1b3Q7XSwNCgkJCQlbMiwgJnF1b3Q70J3QtSDQv9GA0LjQvdC40LzQsNGC0Ywg0YHQviDQstGB0LXRhSZxdW90O10sIFswLCAmcXVvdDvQn9GA0LjQvdC40LzQsNGC0Ywg0YHQviDQstGB0LXRhSZxdW90O10NCgldfSwNCgkJCW51bGwsDQoJew0KCQkJcHJlZjogWyZxdW90O2RvbS5zdG9yYWdlLmVuYWJsZWQmcXVvdDssICZxdW90O9Cb0L7QutCw0LvRjNC90L7QtSDRhdGA0LDQvdC40LvQuNGJ0LUmcXVvdDssICZxdW90OyZxdW90OywgJnF1b3Q7ZG9tLnN0b3JhZ2UuZW5hYmxlZCZxdW90O10sDQoJCQl1c2VyQ2hvaWNlOiB0cnVlDQoJfQ0KXTsNCg0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCgl2YXIgc2Vjb25kYXJ5ID0gW3sNCg0KCQkJcHJlZjogWyZxdW90O2RvbS5zZXJ2aWNlV29ya2Vycy5lbmFibGVkJnF1b3Q7LCAmcXVvdDvQktC40LTQtdC+IGRvbS5zZXJ2aWNlV29ya2VycyZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDtkb20uc2VydmljZVdvcmtlcnMuZW5hYmxlZCZxdW90O10sDQoJCQl1c2VyQ2hvaWNlOiBmYWxzZQ0KCX0sew0KCQkJcHJlZjogWyZxdW90O2RvbS5lbmFibGVfcGVyZm9ybWFuY2UmcXVvdDssICZxdW90O9Ch0YLQsNGC0YPRgSDQt9Cw0LPRgNGD0LfQutC4INGB0YLRgNCw0L3QuNGG0YsmcXVvdDssICZxdW90OyZxdW90OywgJnF1b3Q7ZG9tLmVuYWJsZV9wZXJmb3JtYW5jZSZxdW90O10sDQoJCQl1c2VyQ2hvaWNlOiBmYWxzZQ0KCX0sDQoJCQludWxsLA0KCXsNCgkJCXByZWY6IFsmcXVvdDticm93c2VyLmNhY2hlLm1lbW9yeS5lbmFibGUmcXVvdDssICZxdW90O9Ca0Y3RiCDQsiDQvtC/0LXRgNCw0YLQuNCy0L3QvtC5INC/0LDQvNGP0YLQuCZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDticm93c2VyLmNhY2hlLm1lbW9yeS5lbmFibGUmcXVvdDtdLA0KCQkJdXNlckNob2ljZTogdHJ1ZQ0KCX0sDQoJCQludWxsLA0KCXsNCgkJCXByZWY6IFsmcXVvdDtpbnRsLmFjY2VwdF9sYW5ndWFnZXMmcXVvdDssICZxdW90O9Cv0LfRi9C6INC00LvRjyDQstC10LEt0YHRgtGA0LDQvdC40YYmcXVvdDssICZxdW90OyZxdW90OywgJnF1b3Q7aW50bC5hY2NlcHRfbGFuZ3VhZ2VzJnF1b3Q7XSwNCgkJCXVzZXJDaG9pY2U6ICZxdW90O2VuLVVTLCBlbiZxdW90OywNCgkJCXZhbHVlczogW1smcXVvdDtlbi1VUywgZW4mcXVvdDssICZxdW90O2VuLVVTLCBlbiZxdW90O10sIFsmcXVvdDtlbi1VUywgZW4sIHJ1LVJVLCBydSZxdW90OywgJnF1b3Q7ZW4tVVMsIGVuLCBydS1SVSwgcnUmcXVvdDtdXQ0KCX0sew0KCQkJcHJlZjogWyZxdW90O2Jyb3dzZXIuZGlzcGxheS5kb2N1bWVudF9jb2xvcl91c2UmcXVvdDssICZxdW90O9CY0YHQv9C+0LvRjNC30L7QstCw0YLRjCDRhtCy0LXRgtCwINGB0LDQudGC0L7QsiZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDticm93c2VyLmRpc3BsYXkuZG9jdW1lbnRfY29sb3JfdXNlJnF1b3Q7XSwNCgkJCXVzZXJDaG9pY2U6IDAsDQoJCQl2YWx1ZXM6IFtbMCwgJnF1b3Q70JDQstGC0L4mcXVvdDssICZxdW90OzAmcXVvdDtdLCBbMSwgJnF1b3Q70JLRgdC10LPQtNCwJnF1b3Q7LCAmcXVvdDsxJnF1b3Q7XSwgWzIsICZxdW90O9Cd0LjQutC+0LPQtNCwJnF1b3Q7LCAmcXVvdDsyJnF1b3Q7XV0NCgl9LA0KCQkJbnVsbCwNCgl7DQoJCQlwcmVmOiBbJnF1b3Q7bmV0d29yay5odHRwLnNlbmRSZWZlcmVySGVhZGVyJnF1b3Q7LCAmcXVvdDtSZWZlcmVyIC0g0LTQu9GPINGH0LXQs9C+JnF1b3Q7LCAmcXVvdDsmcXVvdDssICZxdW90O25ldHdvcmsuaHR0cC5zZW5kUmVmZXJlckhlYWRlciZxdW90O10sDQoJCQl1c2VyQ2hvaWNlOiAxLA0KCQkJdmFsdWVzOiBbWzAsICZxdW90O9Cd0Lgg0LTQu9GPINGH0LXQs9C+JnF1b3Q7LCAmcXVvdDswJnF1b3Q7XSwgWzEsICZxdW90O9Ci0L7Qu9GM0LrQviDRgdGB0YvQu9C60LgmcXVvdDssICZxdW90OzEmcXVvdDtdLCBbMiwgJnF1b3Q70KHRgdGL0LvQutC4INC4INC40LfQvtCx0YAuJnF1b3Q7LCAmcXVvdDsyJnF1b3Q7XV0NCgl9LHsNCgkJCXByZWY6IFsmcXVvdDtuZXR3b3JrLmh0dHAucmVmZXJlci50cmltbWluZ1BvbGljeSZxdW90OywgJnF1b3Q7UmVmZXJlciAtINGH0YLQviZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDtuZXR3b3JrLmh0dHAucmVmZXJlci50cmltbWluZ1BvbGljeSZxdW90O10sDQoJCQl1c2VyQ2hvaWNlOiAwLA0KCQkJdmFsdWVzOiBbWzAsICZxdW90O9Cf0L7Qu9C90YvQuSBVUkwmcXVvdDssICZxdW90OzAmcXVvdDtdLCBbMSwgJnF1b3Q7c2NoZW1lK2hvc3QrcG9ydCtwYXRoJnF1b3Q7LCAmcXVvdDsxJnF1b3Q7XSwgWzIsICZxdW90O3NjaGVtZStob3N0K3BvcnQmcXVvdDssICZxdW90OzImcXVvdDtdXQ0KCX0sew0KCQkJcHJlZjogWyZxdW90O25ldHdvcmsuaHR0cC5yZWZlcmVyLlhPcmlnaW5Qb2xpY3kmcXVvdDssICZxdW90O1JlZmVyZXJYTyAtINC60L7Qs9C00LAmcXVvdDssICZxdW90OyZxdW90OywgJnF1b3Q7bmV0d29yay5odHRwLnJlZmVyZXIuWE9yaWdpblBvbGljeSZxdW90O10sDQoJCQl1c2VyQ2hvaWNlOiAwLA0KCQkJdmFsdWVzOiBbWzAsICZxdW90O9CSINC70Y7QsdC+0Lwg0YHQu9GD0YfQsNC1JnF1b3Q7LCAmcXVvdDswJnF1b3Q7XSwgWzEsICZxdW90O9Cf0YDQuCDRgdC+0LLQvy4g0LHQsNC3LiDQtNC+0LzQtdC90LAmcXVvdDssICZxdW90OzEmcXVvdDtdLCBbMiwgJnF1b3Q70J/RgNC4INGB0L7QstC/0LDQtNC10L3QuNC4INCw0LTRgNC10YHQsCZxdW90OywgJnF1b3Q7MiZxdW90O11dDQoJfSx7DQoJCQlwcmVmOiBbJnF1b3Q7bmV0d29yay5odHRwLnJlZmVyZXIuWE9yaWdpblRyaW1taW5nUG9saWN5JnF1b3Q7LCAmcXVvdDtSZWZlcmVyWE8gLSDRh9GC0L4mcXVvdDssICZxdW90OyZxdW90OywgJnF1b3Q7bmV0d29yay5odHRwLnJlZmVyZXIuWE9yaWdpblRyaW1taW5nUG9saWN5JnF1b3Q7XSwNCgkJCXVzZXJDaG9pY2U6IDAsDQoJCQl2YWx1ZXM6IFtbMCwgJnF1b3Q70J/QvtC70L3Ri9C5IFVSTCZxdW90OywgJnF1b3Q7MCZxdW90O10sIFsxLCAmcXVvdDtzY2hlbWUraG9zdCtwb3J0K3BhdGgmcXVvdDssICZxdW90OzEmcXVvdDtdLCBbMiwgJnF1b3Q7c2NoZW1lK2hvc3QrcG9ydCZxdW90OywgJnF1b3Q7MiZxdW90O11dDQoJfSx7DQoJCQlwcmVmOiBbJnF1b3Q7bmV0d29yay5odHRwLnJlZmVyZXIuc3Bvb2ZTb3VyY2UmcXVvdDssICZxdW90O1JlZmVyZXIgLSDQutC+0YDQtdC90Ywg0YHQsNC50YLQsCZxdW90OywgJnF1b3Q7JnF1b3Q7LCAmcXVvdDtuZXR3b3JrLmh0dHAucmVmZXJlci5zcG9vZlNvdXJjZSZxdW90O10sDQoJCQl1c2VyQ2hvaWNlOiBmYWxzZQ0KCX0sDQoJCQludWxsLA0KCXsNCgkJCXByZWY6IFsmcXVvdDttZWRpYS5wZWVyY29ubmVjdGlvbi5lbmFibGVkJnF1b3Q7LCAmcXVvdDtXZWJSVEMg0YPRgtC10YfQutCwIElQJnF1b3Q7LCAmcXVvdDsmcXVvdDssICZxdW90O21lZGlhLnBlZXJjb25uZWN0aW9uLmVuYWJsZWQmcXVvdDtdLA0KCQkJdXNlckNob2ljZTogZmFsc2UNCgl9DQoJXTsNCg0KCXJldHVybiB7DQoJCWxhYmVsOiAmcXVvdDtRdWljayB0b2dnbGUmcXVvdDssDQoJCWlkOiAmcXVvdDtRdWlja1RvZ2dsZUFib3V0Q29uZmlnU2V0dGluZ3MmcXVvdDssDQoJCWxvY2FsaXplZDogZmFsc2UsDQoJCWltYWdlOiAmcXVvdDtkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVVBQUFBSmNFaFpjd0FBRHNNQUFBN0RBY2R2cUdRQUFBRlBTVVJCVkRoUG5WUE5Tc05BRUo1dGFtbkJrK0E3Qk1FY2lrb2hwL2dpOWkxOG5SYWZRb1QwMGtLMTZ0bm44Q0pvNHZwOW01bTQxZVNnSDB6bWQzZCtkaUovZ2ZkZWR2bDBRVzdrMVBjTHdlbSszVGpvd1phZ0srTm42eWMzZ05DSitMQ0NoOUx6elRNZHFlb05ia1FTRlptcEpMR0NXNUd4MmhaYVFhaE1iWjUyVnVEU2ZIcG5BVkpYT2I0Rkt6aWFuYnpDWGlMckhMWWw1QzN0NU5UUnd0eGFLSnhVVFovSmNPVHI2cTJSeHdmMGFWYjIvaExzNEtxTDNJc2Nrei9tbVNkUlJrc2p5Zyt6N0lNNkx6RENCZnV2QUVPSm1JS0JPcUFXbW8xWW9keExsUU5zeU8wcnNJVi9BWk0rSkdjMmE0R2d6aFoycDltRm1ycGJvQ01xTllCRGRNbHdvbXBvVFdONkYybkZUNWhCWGIwUEVwbW8vR2srb0grUnJxTlpJTlBlSWxuWlZpVjFqUXVMRkpRdVdHQjBnSmR3Z1NodnFkUFhadjZKK0YvUVM3b1hxUTl4QlRGWjVvYThmQUdzOWZlZDVZaFBTd0FBQUFCSlJVNUVya0pnZ2c9PSZxdW90OywNCgkJb25DcmVhdGVkKGJ0bikgew0KCQkJYnRuLnNldEF0dHJpYnV0ZSgmcXVvdDtpbWFnZSZxdW90OywgdGhpcy5pbWFnZSk7DQoJCQl2YXIgZG9jID0gYnRuLm93bmVyRG9jdW1lbnQ7DQoNCgkJCWJ0bi5idG4gPSB0cnVlOw0KCQkJYnRuLmRvbVBhcmVudCA9IG51bGw7DQoJCQlidG4ucG9wdXBzID0gbmV3IGJ0bi5vd25lckdsb2JhbC5BcnJheSgpOw0KCQkJdGhpcy5jcmVhdGVQb3B1cChkb2MsIGJ0biwgJnF1b3Q7cHJpbWFyeSZxdW90OywgcHJpbWFyeSk7DQoJCQl0aGlzLmNyZWF0ZVBvcHVwKGRvYywgYnRuLCAmcXVvdDtzZWNvbmRhcnkmcXVvdDssIHNlY29uZGFyeSk7DQoNCgkJCWJ0bi5saW5rZWRPYmplY3QgPSB0aGlzOw0KCQkJZm9yKHZhciB0eXBlIG9mIFsmcXVvdDtjb21tYW5kJnF1b3Q7LCAmcXVvdDtjb250ZXh0bWVudSZxdW90O10pDQoJCQkJYnRuLnNldEF0dHJpYnV0ZSgmcXVvdDtvbiZxdW90OyArIHR5cGUsIGBsaW5rZWRPYmplY3QuJHt0eXBlfShldmVudClgKTsNCgkJfSwNCgkJY3JlYXRlUG9wdXAoZG9jLCBidG4sIG5hbWUsIGRhdGEpIHsNCgkJCXZhciBwb3B1cCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoeHVsX25zLCAmcXVvdDttZW51cG9wdXAmcXVvdDspOw0KCQkJdmFyIHByb3AgPSBuYW1lICsgJnF1b3Q7UG9wdXAmcXVvdDs7DQoJCQlidG4ucG9wdXBzLnB1c2goYnRuW3Byb3BdID0gcG9wdXApOw0KCQkJcG9wdXAuaWQgPSB0aGlzLmlkICsgJnF1b3Q7LSZxdW90OyArIHByb3A7DQoJCQlwb3B1cC5zZXRBdHRyaWJ1dGUoJnF1b3Q7b25wb3B1cHNob3dpbmcmcXVvdDssICZxdW90O3BhcmVudE5vZGUubGlua2VkT2JqZWN0LnBvcHVwc2hvd2luZyhldmVudCkmcXVvdDspOw0KCQkJZm9yKHZhciBvYmogb2YgZGF0YSkgcG9wdXAuYXBwZW5kKHRoaXMuY3JlYXRlRWxlbWVudChkb2MsIG9iaikpOw0KCQkJYnRuLmFwcGVuZChwb3B1cCk7DQoJCX0sDQoJCWNyZWF0ZUVsZW1lbnQoZG9jLCBvYmopIHsNCgkJCWlmICghb2JqKSByZXR1cm4gZG9jLmNyZWF0ZUVsZW1lbnROUyh4dWxfbnMsICZxdW90O21lbnVzZXBhcmF0b3ImcXVvdDspOw0KCQkJdmFyIHByZWYgPSBkb2Mub3duZXJHbG9iYWwuT2JqZWN0LmNyZWF0ZShudWxsKSwgbm9kZSwgaW1nOw0KCQkJZm9yKHZhciBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHsNCgkJCQlpZiAoa2V5ID09ICZxdW90O3ByZWYmcXVvdDspIHsNCgkJCQkJdmFyIFthcHJlZiwgbGFiLCBha2V5LCB0dHRdID0gdmFsOw0KCQkJCQlwcmVmLnByZWYgPSBhcHJlZjsgcHJlZi5sYWIgPSBsYWIgfHwgYXByZWY7DQoJCQkJCWlmICh0dHQpIHByZWYudHR0ID0gdHR0Ow0KCQkJCX0NCgkJCQllbHNlIGlmIChrZXkgPT0gJnF1b3Q7aW1hZ2UmcXVvdDspIGltZyA9IHZhbCwgcHJlZi5pbWcgPSB0cnVlOw0KCQkJCWVsc2UgaWYgKGtleSAhPSAmcXVvdDt2YWx1ZXMmcXVvdDspIHByZWZba2V5XSA9IHZhbDsNCgkJCX0NCgkJCXZhciB0eXBlID0gcHJlZnMuZ2V0UHJlZlR5cGUocHJlZi5wcmVmKSwgc3RyLCBib29sOw0KCQkJdmFyIHBpbnQgPSB0eXBlID09IHByZWZzLlBSRUZfSU5ULCBpbnYgPSB0eXBlID09IHByZWZzLlBSRUZfSU5WQUxJRDsNCgkJCWlmIChpbnYgJmFtcDsmYW1wOyBvYmoudmFsdWVzIHx8IHBpbnQgfHwgdHlwZSA9PSBwcmVmcy5QUkVGX1NUUklORykNCgkJCQlzdHIgPSBwaW50IHx8IChpbnYgJmFtcDsmYW1wOyB0eXBlb2Ygb2JqLnZhbHVlc1swXVswXSA9PSAmcXVvdDtudW1iZXImcXVvdDspID8gJnF1b3Q7SW50JnF1b3Q7IDogJnF1b3Q7U3RyaW5nJnF1b3Q7LA0KCQkJCXByZWYuYm9vbCA9IGZhbHNlOw0KCQkJZWxzZQ0KCQkJCXN0ciA9ICZxdW90O0Jvb2wmcXVvdDssIHByZWYuYm9vbCA9IHRydWU7DQoJCQlwcmVmLmdldCA9IHByZWZzW2BnZXQke3N0cn1QcmVmYF07DQoJCQlwcmVmLnNldCA9IHByZWZzW2BzZXQke3N0cn1QcmVmYF07DQoNCgkJCW5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TKHh1bF9ucywgJnF1b3Q7bWVudSZxdW90Oyk7DQoJCQlub2RlLmNsYXNzTmFtZSA9ICZxdW90O21lbnUtaWNvbmljJnF1b3Q7Ow0KCQkJbm9kZS5zZXRBdHRyaWJ1dGUoJnF1b3Q7Y2xvc2VtZW51JnF1b3Q7LCAmcXVvdDtub25lJnF1b3Q7KTsNCgkJCWltZyAmYW1wOyZhbXA7IG5vZGUuc2V0QXR0cmlidXRlKCZxdW90O2ltYWdlJnF1b3Q7LCBpbWcpOw0KCQkJYWtleSAmYW1wOyZhbXA7IG5vZGUuc2V0QXR0cmlidXRlKCZxdW90O2FjY2Vzc2tleSZxdW90OywgYWtleSk7DQoJCQkobm9kZS5wcmVmID0gcHJlZikudmFscyA9IGRvYy5vd25lckdsb2JhbC5PYmplY3QuY3JlYXRlKG51bGwpOw0KCQkJdGhpcy5jcmVhdGVSYWRpb3MoZG9jLA0KCQkJCXByZWYuYm9vbCA/IFtbdHJ1ZSwgJnF1b3Q7dHJ1ZSZxdW90O10sIFtmYWxzZSwgJnF1b3Q7ZmFsc2UmcXVvdDtdXSA6IG9iai52YWx1ZXMsDQoJCQkJbm9kZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlRWxlbWVudE5TKHh1bF9ucywgJnF1b3Q7bWVudXBvcHVwJnF1b3Q7KSkNCgkJCSk7DQoJCQlyZXR1cm4gbm9kZTsNCgkJfSwNCgkJVXNlckNob2ljZUltZzogJnF1b3Q7ZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQ1JVbEVRVlI0MnFXVFMyZ1RRUmpIL3pQSlpvMkJEZmdrQjYydllnNUNqUWR2UlVFOFdCOEhLeWFoWW90SVFRT2VGS0dDRjdFZ3ZRbEJxT0NqV0ZLbGV2QlJEeUw0dUhsb0xYaFlxV0pyb2FFcWxFVFNwdG5kR2IrWlBESDBvak44Tzh2QTk4dnYrL0l0dzM4dTFuU1JZUkU2VWhLeWc0RkYxUjI5Mi9RK3hoaExpNFRJcmdqZ0l6d2U0TWJnbVIybnJaTXR4eEVONjN6WU9SdVBacDdnenBlaHZDdTlYamZ1UG13Q1VISWlFdHc0Zks4OXpWdkQyK0ZIQUQ1NnF1WEJwVjNDVk80cmV0Nm54SHp4WnhkQlJ1cUFEQ0ttejdSSEQ5eTJ0bG1iWWJCVmZ3RThEWEJrRWQveTM5SDUrbXplOFp5b1NJcHNGWEM5dS9WRTMvbGRweWc1QUFNRW9KTVRRaTJoQU5LQmd5S2R5MGgvZW9DaHFjZjlNaW12VkFIamQvZmRpRzBOUndnUXBEQXAxYWdCcERad2RIS0pMS1p6YytoNWUza0NTZXhoNWM1ajhmbWhXMEhHcE5aWEZrcWZzUXBBS2djRktHbUFsQXhIWHA1YmtrbXNyaG9zamg0Y0NJSjVwRzVxZlFYZ3RNc2xxTzFxZ0VNV1RQclIrZXJpRWhvQTR3TjdMOFRXaDBLVlh6ZmdZMlJRQVVqVkJlbldMSDRVQ3JqMDRXYTlCTlhFbzV2YSt3NjN4Q2lKNldSVlAyTVZnTlFJZ2pnRUExN01UT0RaN0x0K0F0U2FHREc0Mzc3YTFtMkZBa0tyYzExL2RVd0lJRDFkU0tIRWNXM3lmdDRSYnBSNmtLMVBZZ2FKdGFZMW5OcDVqSWVNc2pLTmJzMUFXUlVjanZUbnAyS2g5THRMSkdURElOVWhjVElaM0wraHpkcTlaZ3ZXbVNGOS9XdTVnSThMMDNnelA1bDNoZGRMLzMvektEZEE5TWRFMFVFUnJkemFGR01VYWFwNzVZL3BYOVlmYXA3NkVRWWFDZUVBQUFBQVNVVk9SSzVDWUlJPSZxdW90OywNCgkJbm90VXNlckNob2ljZUltZzogJnF1b3Q7ZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQ05VbEVRVlI0MnFYVFQyalRVQndIOEc5ZTB0YTJrczVORDBXdy9xWDFvR3lldkV3UW5PQkE2RUhYd0x3b1VoM2VSR1JzNTAxUlBFNnhncDZLcmV4UUVDWlk4REJQWG1iUlM0Wi9LMGdSdG1tRGEyeWI1UGxMWDdwMkd3cGk0RWZDeThzbjMvZFB3bjllMHNhR25DUkY2WFlGbkE5RGtoS3RSczUxZXA2am10RWNwL0pISU05WWl2bDltZjBYTkRWMk5nbjFZTHpWeGRCMWxKOFU4UDVoenVDV25SNnhyUHdtSU04a0xSamRrVDMyNkJhTEhOZ0xLQUZBOW91WGRoT3c2cWkrKzRqNTg5Y2Q4OXZTYU1xeWMyc0FQVVhsZ0Y4Znl0OVdJM3QyQXY0dzROc0NNSjhBSEFLYXY2aHFxSDc2aXVMSU5jTnVOaE9hd3l0dFlDcCs3dFJFLzZYVDlHRlFBRzRDcG5pQVRRa0lhTlFJTVZHNi94U0wyV2ZUR3VlVGJXRGg1TDJyQTl0MjlRR0JyUVFFUFVEdUF1b0VtRlNyK1A1bEdjOHYzM210QVVmYVFPM000L0dnRE9vWUNJa1VpbjhEMEJERG9CUTJaTXhxTjB3Q1FoMGdNeGFVblliNHV6dCtkd0laOHdCSFRHUWJZQUhNcHUrdUF4YUd4cE1EdlNyM0FIY0ZhQUlsRCtCdG9ONmFnNVdxaE9MTndyb2hUTVdQSDVyb1A3cGRMSXdiM3dXNkV6aVdHQVpocFZkTFdIenhkcHFBeWM0eUtySis0dUtnMm9NVitsZ1JLOUNkd0FWc0cxV3BGOFVIODRadDJRa0NLbXNiaVJBdEZBbGxCNU9IV1E5ZnByODFPd2xjZ0JMOWtQcndzdkRHTVExek5NVjVaeU4xSVNsWllabDkvVEUxdGp1TVNGZ0ExVldPOHVlZitGQXFHNDd0cEZNY203ZHlGeUlPRXpCTWxmQ2FkYW81cWhrMzlsOVA0NzlldndGYmlPY1JTWEt1ZUFBQUFBQkpSVTVFcmtKZ2dnPT0mcXVvdDssDQoJCVVzZXJBbHRJbWc6ICZxdW90O2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFBWE5TUjBJQXJzNGM2UUFBQUFSblFVMUJBQUN4and2OFlRVUFBQUFKY0VoWmN3QUFEc01BQUE3REFjZHZxR1FBQUFJZlNVUkJWRGhQcFZNOWI5TlFGRDAyY1NLS0ZWR0tJRkZSRUZzbUZpQ0ExQUVRUXJRakMwZ3NzTENrQzBqSmowaUZXRm9HZGlUNEF5MFNFbUpCaFBJNUZCb2tpa0w0U0NDMFRlMlV4SW50MTNNZHUxQ1ZyVmM2NzEzZmU4NngvVDZ3MDlEQ2VUTktKN1EwcHp5VW1vQ21aWU9pVWhYbXM4Uk1jZDZ2QjdVd3RoaE01ZlRMV2l4MkwzUG1ZaktkT3dkejlEREZHdHIxS3Vvdm5xRDI5SkdsZk85R29ldzlEQ1YvRGFaeTJwWEU4UEQ5WS9tYnVwazZ4RTZjVldQUWhFdWpIbzIrNGZYZE83Nnp0bnExVVBZZlNDY3dLQjFIV2plTXl1bkNyYVNaT3NEcWJrQlBzQk9UTm9NR3ZrT1RMdG8vZitGNTZiYmxlMjYyT0svcWVzaVl6SXlkVEpvakZManJnRWU0YmNJT0VkWFdZZTZMSVROMktnbUZTUkZHQnVQcG8wZUFuZ1gwU2V4VEpIRDVMT2dMcEVaVGNnS3VVdU1pakF5eTVsNytyME5TYjIxZzVMUUk1Z0dZU3kyQWpZQkxqUXlSQVVuaVRuSlhzQm9heUJ6bTNSQkJuZHd3SW9PSzNmZ05kSVJFUVlDVi8wRHFMZGlOWnFDUklUS1lheXg4NVJmUXVVTmlaM2s3SWdPK3ZmR2VYR3BraUF5bWErK1dMSHRaaFo4bzVIL0ZFVnBvczFWN3U4VEZ3TFFJZDhudytBZmE1MU9xMnZ5eWNtbGs5S0NXMEdYRlpldTYzSVVPOHo4OEJ4NXMyOFNidVVYZmRkenJ4VmNvYnhwSTBHVGg3SDczNC9kUHpRdDlkMC9DR0JwQ1BCN25iaG13YkFQVnhSNCtQUHRzdVU3L1d1RWx0aC9sS09SVWNzb1RFOFRnTWcwV2JKYVk0WnUzWEtZZEJyQUJBUlVrK2xzNERmUUFBQUFBU1VWT1JLNUNZSUk9JnF1b3Q7LA0KCQl1cGQobm9kZSkgew0KCQkJdmFyIHtwcmVmfSA9IG5vZGUsIGRlZiA9IGZhbHNlLCB1c2VyID0gZmFsc2UsIHZhbDsNCgkJCWlmIChwcmVmcy5nZXRQcmVmVHlwZShwcmVmLnByZWYpICE9IHByZWZzLlBSRUZfSU5WQUxJRCkgew0KCQkJCXZhciBwbiA9IHByZWYucHJlZjsNCgkJCQl0cnkge3ZhbCA9IGRiW3ByZWYuZ2V0Lm5hbWVdKHBuKTsgZGVmID0gdHJ1ZX0gY2F0Y2goZXgpIHtkZWYgPSBmYWxzZTt9DQoJCQkJdmFyIHVzZXIgPSBwcmVmcy5wcmVmSGFzVXNlclZhbHVlKHBuKTsNCgkJCQlpZiAodXNlcikgdHJ5IHt2YWwgPSBwcmVmLmdldChwbiwgdW5kZWZpbmVkKTt9IGNhdGNoKGV4KSB7fQ0KCQkJfQ0KCQkJaWYgKHZhbCA9PSBwcmVmLnZhbCAmYW1wOyZhbXA7IGRlZiA9PSBwcmVmLmRlZiAmYW1wOyZhbXA7IHVzZXIgPT0gcHJlZi51c2VyKSByZXR1cm47DQoJCQlwcmVmLnZhbCA9IHZhbDsgcHJlZi5kZWYgPSBkZWY7IHByZWYudXNlciA9IHVzZXI7DQoJCQl2YXIgZXhpc3RzID0gZGVmIHx8IHVzZXI7DQoNCgkJCXZhciB0dHQgPSBleGlzdHMgPyB2YWwgOiAmcXVvdDvQrdGC0L7Qs9C+INC/0YDQtdGE0LAg0L3QtSDRgdGD0YnQtdGB0YLQstGD0LXRgiZxdW90OzsNCgkJCWlmICh0dHQgPT09ICZxdW90OyZxdW90OykgdHR0ID0gJnF1b3Q7WyBlbXB0eV9zdHJpbmcgXSZxdW90OzsNCgkJCWlmIChwcmVmLnR0dCkgdHR0ICs9ICZxdW90O1xuJnF1b3Q7ICsgcHJlZi50dHQ7DQoJCQlub2RlLnRvb2x0aXBUZXh0ID0gdHR0Ow0KDQoJCQlpZiAoJnF1b3Q7dXNlckNob2ljZSZxdW90OyBpbiBwcmVmKQ0KCQkJCWlmICh2YWwgPT0gcHJlZi51c2VyQ2hvaWNlKQ0KCQkJCQlub2RlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCZxdW90O2NvbG9yJnF1b3Q7KSwNCgkJCQkJcHJlZi5pbWcgfHwgbm9kZS5zZXRBdHRyaWJ1dGUoJnF1b3Q7aW1hZ2UmcXVvdDssIHRoaXMuVXNlckNob2ljZUltZyk7DQoJCQkJZWxzZQ0KCQkJCQlub2RlLnN0eWxlLnNldFByb3BlcnR5KCZxdW90O2NvbG9yJnF1b3Q7LCAmcXVvdDttYXJvb24mcXVvdDssICZxdW90O2ltcG9ydGFudCZxdW90OyksDQoJCQkJCXByZWYuaW1nIHx8IG5vZGUuc2V0QXR0cmlidXRlKCZxdW90O2ltYWdlJnF1b3Q7LCB0aGlzLm5vdFVzZXJDaG9pY2VJbWcpOw0KCQkJZWxzZSAoJnF1b3Q7dXNlckFsdCZxdW90OyBpbiBwcmVmKQ0KCQkJCWlmICh2YWwgPT0gcHJlZi51c2VyQWx0KQ0KCQkJCQlwcmVmLmltZyB8fCBub2RlLnNldEF0dHJpYnV0ZSgmcXVvdDtpbWFnZSZxdW90OywgdGhpcy5Vc2VyQWx0SW1nKTsNCgkJCXVzZXINCgkJCQk/IG5vZGUuc3R5bGUuc2V0UHJvcGVydHkoJnF1b3Q7Zm9udC1zdHlsZSZxdW90OywgJnF1b3Q7aXRhbGljJnF1b3Q7LCAmcXVvdDtpbXBvcnRhbnQmcXVvdDspDQoJCQkJOiBub2RlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCZxdW90O2ZvbnQtc3R5bGUmcXVvdDspOw0KDQoJCQl2YXIge2xhYn0gPSBwcmVmOw0KCQkJaWYgKGV4aXN0cyAmYW1wOyZhbXA7ICFwcmVmLmJvb2wpIHsNCgkJCQlpZiAodmFsIGluIHByZWYudmFscykgdmFyIHNmeCA9IHByZWYudmFsc1t2YWxdIHx8IHZhbDsNCgkJCQllbHNlIHZhciBzZnggPSB1c2VyID8gJnF1b3Q70JTRgNGD0LPQvtC1JnF1b3Q7IDogJnF1b3Q70J/QviDRg9C80L7Qu9GH0LDQvdC40Y4mcXVvdDs7DQoJCQkJbGFiICs9IGAgJm1kYXNoOyAmcXVvdDske3NmeH0mcXVvdDtgOw0KCQkJfQ0KCQkJbm9kZS5zZXRBdHRyaWJ1dGUoJnF1b3Q7bGFiZWwmcXVvdDssIGxhYik7DQoJCX0sDQoJCWNyZWF0ZVJhZGlvcyhkb2MsIHZhbHMsIHBvcHVwKSB7DQoJCQlmb3IodmFyIGFyciBvZiB2YWxzKSB7DQoJCQkJaWYgKCFhcnIpIHsNCgkJCQkJcG9wdXAuYXBwZW5kKGRvYy5jcmVhdGVFbGVtZW50TlMoeHVsX25zLCAmcXVvdDttZW51c2VwYXJhdG9yJnF1b3Q7KSk7DQoJCQkJCWNvbnRpbnVlOw0KCQkJCX0NCgkJCQl2YXIgW3ZhbCwgbGFiLCBrZXksIHR0dF0gPSBhcnI7DQoJCQkJdmFyIG1lbnVpdGVtID0gZG9jLmNyZWF0ZUVsZW1lbnROUyh4dWxfbnMsICZxdW90O21lbnVpdGVtJnF1b3Q7KTsNCgkJCQltZW51aXRlbS5zZXRBdHRyaWJ1dGUoJnF1b3Q7dHlwZSZxdW90OywgJnF1b3Q7cmFkaW8mcXVvdDspOw0KCQkJCW1lbnVpdGVtLnNldEF0dHJpYnV0ZSgmcXVvdDtjbG9zZW1lbnUmcXVvdDssICZxdW90O25vbmUmcXVvdDspOw0KCQkJCW1lbnVpdGVtLnNldEF0dHJpYnV0ZSgmcXVvdDtsYWJlbCZxdW90OywgcG9wdXAucGFyZW50Tm9kZS5wcmVmLnZhbHNbdmFsXSA9IGxhYik7DQoJCQkJa2V5ICZhbXA7JmFtcDsgbWVudWl0ZW0uc2V0QXR0cmlidXRlKCZxdW90O2FjY2Vzc2tleSZxdW90Oywga2V5KTsNCgkJCQl2YXIgdGlwID0gbWVudWl0ZW0udmFsID0gdmFsOw0KCQkJCWlmICh0dHQpIHRpcCArPSAmcXVvdDtcbiZxdW90OyArIHR0dDsNCgkJCQltZW51aXRlbS50b29sdGlwVGV4dCA9IHRpcDsNCgkJCQlwb3B1cC5hcHBlbmQobWVudWl0ZW0pOw0KCQkJfQ0KCQl9LA0KCQlvcGVuUG9wdXAocG9wdXApIHsNCgkJCXZhciBidG4gPSBwb3B1cC5wYXJlbnROb2RlOw0KCQkJaWYgKGJ0bi5kb21QYXJlbnQgIT0gYnRuLnBhcmVudE5vZGUpIHsNCgkJCQlidG4uZG9tUGFyZW50ID0gYnRuLnBhcmVudE5vZGU7DQoJCQkJdmFyIHBvczsNCgkJCQlpZiAoYnRuLm1hdGNoZXMoJnF1b3Q7LndpZGdldC1vdmVyZmxvdy1saXN0ICZndDsgOnNjb3BlJnF1b3Q7KSkNCgkJCQkJcG9zID0gJnF1b3Q7YWZ0ZXJfc3RhcnQmcXVvdDs7DQoJCQkJZWxzZSB2YXIgd2luID0gYnRuLm93bmVyR2xvYmFsLCB7d2lkdGgsIGhlaWdodCwgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0fSA9DQoJCQkJCWJ0bi5jbG9zZXN0KCZxdW90O3Rvb2xiYXImcXVvdDspLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBwb3MgPSB3aWR0aCAmZ3Q7IGhlaWdodA0KCQkJCQkJPyBgJHt3aW4uaW5uZXJIZWlnaHQgLSBib3R0b20gJmd0OyB0b3AgPyAmcXVvdDthZnRlciZxdW90OyA6ICZxdW90O2JlZm9yZSZxdW90O31fc3RhcnRgDQoJCQkJCQk6IGAke3dpbi5pbm5lcldpZHRoIC0gcmlnaHQgJmd0OyBsZWZ0ID8gJnF1b3Q7ZW5kJnF1b3Q7IDogJnF1b3Q7c3RhcnQmcXVvdDt9X2JlZm9yZWA7DQoJCQkJZm9yKHZhciBwIG9mIGJ0bi5wb3B1cHMpIHAuc2V0QXR0cmlidXRlKCZxdW90O3Bvc2l0aW9uJnF1b3Q7LCBwb3MpOw0KCQkJfQ0KCQkJcG9wdXAub3BlblBvcHVwKGJ0bik7DQoJCX0sDQoJCW1heWJlUmVzdGFydChub2RlLCBjb25mKSB7DQoJCQl2YXIgbXNnUmVzdCA9ICZxdW90O9Cf0LXRgNC10LfQsNC/0YPRgdGC0LjRgtGMINCx0YDQsNGD0LfQtdGAPyZxdW90OywgbXNnQWJvcnQgPSAmcXVvdDvQl9Cw0L/RgNC+0YEg0L3QsCDQstGL0YXQvtC0INC+0YLQvNC10L3QtdC9LiZxdW90OzsNCgkJCWlmIChwdiAmZ3Q7PSA3Nykgew0KCQkJCXZhciB0aXRsZSA9IG5vZGUuY2xvc2VzdCgmcXVvdDt0b29sYmFyYnV0dG9uJnF1b3Q7KS5sYWJlbDsNCgkJCQl2YXIgcHAgPSBkb21XaW4gPSZndDsgU2VydmljZXMucHJvbXB0LndyYXBwZWRKU09iamVjdC5waWNrUHJvbXB0ZXIoew0KCQkJCQlkb21XaW4sIG1vZGFsVHlwZTogQ2kubnNJUHJvbXB0Lk1PREFMX1RZUEVfV0lORE9XDQoJCQkJfSk7DQoJCQkJdmFyIGNvbmZpcm0gPSB3aW4gPSZndDsgcHAod2luKS5jb25maXJtKHRpdGxlLCBtc2dSZXN0KTsNCgkJCQl2YXIgYWxlcnQgPSB3aW4gPSZndDsgcHAod2luKS5hbGVydCh0aXRsZSwgbXNnQWJvcnQpOw0KCQkJfSBlbHNlIHsNCgkJCQl2YXIgY29uZmlybSA9IHdpbiA9Jmd0OyB3aW4uY29uZmlybShtc2dSZXN0KTsNCgkJCQl2YXIgYWxlcnQgPSB3aW4gPSZndDsgd2luLmFsZXJ0KG1zZ0Fib3J0KTsNCgkJCX0NCgkJCXJldHVybiAodGhpcy5tYXlCZVJlc3RhcnQgPSAobm9kZSwgY29uZikgPSZndDsgew0KCQkJCXZhciB3aW4gPSBub2RlLm93bmVyR2xvYmFsOw0KCQkJCWlmIChjb25mICZhbXA7JmFtcDsgIWNvbmZpcm0od2luKSkgcmV0dXJuOw0KCQkJCWlmICh3aW4uQnJvd3NlclV0aWxzLnJlc3RhcnRBcHBsaWNhdGlvbigpID09PSBmYWxzZSkgYWxlcnQod2luKTsNCgkJCQllbHNlIHJldHVybiB0cnVlOw0KCQkJfSkobm9kZSwgY29uZik7DQoJCX0sDQoJCXJlZ2V4cFJlZnJlc2g6IC9eKD86dmlldy1zb3VyY2U6KT8oPzpodHRwcz98ZnRwKS8sDQoJCW1heWJlUmUobm9kZSwgZmUpIHsNCgkJCXZhciB7cHJlZn0gPSBub2RlOw0KCQkJaWYgKCZxdW90O3Jlc3RhcnQmcXVvdDsgaW4gcHJlZikgew0KCQkJCWlmICh0aGlzLm1heWJlUmVzdGFydChub2RlLCBwcmVmLnJlc3RhcnQpKSByZXR1cm47DQoJCQl9DQoJCQllbHNlIHRoaXMucG9wdXBzaG93aW5nKGZlLCBub2RlLnBhcmVudE5vZGUpOw0KCQkJaWYgKCZxdW90O3JlZnJlc2gmcXVvdDsgaW4gcHJlZikgew0KCQkJCXZhciB3aW4gPSBub2RlLm93bmVyR2xvYmFsOw0KCQkJCWlmICh0aGlzLnJlZ2V4cFJlZnJlc2gudGVzdCh3aW4uZ0Jyb3dzZXIuY3VycmVudFVSSS5zcGVjKSkgcHJlZi5yZWZyZXNoDQoJCQkJCT8gd2luLkJyb3dzZXJSZWxvYWRTa2lwQ2FjaGUoKSA6IHdpbi5Ccm93c2VyUmVsb2FkKCk7DQoJCQl9DQoJCX0sDQoJCWNvbW1hbmQoZSkgew0KCQkJdmFyIHRyZyA9IGUudGFyZ2V0Ow0KCQkJaWYgKHRyZy5idG4pIHJldHVybiB0aGlzLm9wZW5Qb3B1cCh0cmcucHJpbWFyeVBvcHVwKTsNCg0KCQkJdmFyIG1lbnUgPSB0cmcuY2xvc2VzdCgmcXVvdDttZW51JnF1b3Q7KSwgbmV3VmFsID0gdHJnLnZhbDsNCgkJCWlmIChuZXdWYWwgIT0gbWVudS5wcmVmLnZhbCkNCgkJCQltZW51LnByZWYuc2V0KG1lbnUucHJlZi5wcmVmLCBuZXdWYWwpLA0KCQkJCXRoaXMubWF5YmVSZShtZW51LCB0cnVlKTsNCgkJfSwNCgkJcG9wdXBzaG93aW5nKGUsIHRyZyA9IGUudGFyZ2V0KSB7DQoJCQlpZiAodHJnLmlkKSB7DQoJCQkJZm9yKHZhciBub2RlIG9mIHRyZy5jaGlsZHJlbikgew0KCQkJCQlpZiAobm9kZS5ub2RlTmFtZS5lbmRzV2l0aCgmcXVvdDtyJnF1b3Q7KSkgY29udGludWU7DQoJCQkJCXRoaXMudXBkKG5vZGUpOw0KCQkJCQkhZSAmYW1wOyZhbXA7IG5vZGUub3BlbiAmYW1wOyZhbXA7IHRoaXMucG9wdXBzaG93aW5nKG51bGwsIG5vZGUucXVlcnlTZWxlY3RvcigmcXVvdDttZW51cG9wdXAmcXVvdDspKTsNCgkJCQl9DQoJCQkJcmV0dXJuOw0KCQkJfQ0KCQkJdmFyIHt2YWx9ID0gdHJnLmNsb3Nlc3QoJnF1b3Q7bWVudSZxdW90OykucHJlZjsNCgkJCXZhciBjaGVja2VkID0gdHJnLnF1ZXJ5U2VsZWN0b3IoJnF1b3Q7W2NoZWNrZWRdJnF1b3Q7KTsNCgkJCWlmIChjaGVja2VkKSB7DQoJCQkJaWYgKGNoZWNrZWQudmFsID09IHZhbCkgcmV0dXJuOw0KCQkJCWVsc2UgY2hlY2tlZC5yZW1vdmVBdHRyaWJ1dGUoJnF1b3Q7Y2hlY2tlZCZxdW90Oyk7DQoJCQl9DQoJCQlmb3IodmFyIG5vZGUgb2YgdHJnLmNoaWxkcmVuKSBpZiAoJnF1b3Q7dmFsJnF1b3Q7IGluIG5vZGUgJmFtcDsmYW1wOyBub2RlLnZhbCA9PSB2YWwpIHsNCgkJCQlub2RlLnNldEF0dHJpYnV0ZSgmcXVvdDtjaGVja2VkJnF1b3Q7LCB0cnVlKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJfSwNCgkJY29udGV4dG1lbnUoZSkgew0KCQkJdmFyIHRyZyA9IGUudGFyZ2V0Ow0KCQkJaWYgKHRyZy5idG4pIHsNCgkJCQlpZiAoZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkpIHJldHVybjsNCgkJCQlpZiAoZS5kZXRhaWwgPT0gMikgcmV0dXJuIHRyZy5zZWNvbmRhcnlQb3B1cC5oaWRlUG9wdXAoKTsNCgkJCQl0aGlzLm9wZW5Qb3B1cCh0cmcuc2Vjb25kYXJ5UG9wdXApOw0KCQkJfQ0KCQkJZWxzZSBpZiAoJnF1b3Q7cHJlZiZxdW90OyBpbiB0cmcgJmFtcDsmYW1wOyB0cmcucHJlZi51c2VyKQ0KCQkJCXByZWZzLmNsZWFyVXNlclByZWYodHJnLnByZWYucHJlZiksDQoJCQkJdGhpcy5tYXliZVJlKHRyZyk7DQoJCQllLnByZXZlbnREZWZhdWx0KCk7DQoJCX0NCgl9Ow0KfSk7
Отредактировано _zt (14-08-2020 21:39:11)
Отсутствует
Может подойдёт в контекстном меню не на странице, а на кнопке?
Это не кнопка,это комбайн какой то . Нет нужно попроще, только из контекстного меню. Желательно по возможности ,реанимировать старый код. Просто у некоторых, руки работаю быстрее головы, жмут на всё подряд, а до контекстного меню не дотягиваются, тонкой тайм-аут. Может у кого получится починить код.
Отсутствует
код вставил инициализацию - ничего не сохраняются вообще
Ну не знаю, может CB какой-то несоответствующий.
Тогда попробуй изменить вкладку Код.
(f => { var url = "http://site.ru"; var br = (gBrowser.selectedTab = gBrowser.addTab(url)).linkedBrowser; br.addEventListener("pageshow", () => setTimeout( () => gBrowser.selectedBrowser == br && br.currentURI.spec == url && f() , 0), {once: true}); })(() => { //====================== // Здесь расположить // весь код вкладки Код. //====================== });
Иконку UserAlt прописал и она работает, но вы проверьте за мной
Вот эта строка:
else ("userAlt" in pref)
не делает ничего (значимого), просто по else вычисляет есть ли у этого объекта такое свойство,
вычисляет в пустоту. Ну а дальше там просто установка "image", если совпадение с userAlt.
Всё бы ничего, но бывает, перед этим, чуть выше по коду, ставится notUserChoiceImg,
и сразу UserAltImg. То есть двойная установка, а это, наверно, нехорошо. Переделал.
И ещё, немного похозяйничал. Заметил, что в каждом(!) pref'е, в конце,
продублировано имя настройки, чтобы оно отображалось в тултипе.
Показалось похожим на концепцию, поэтому поудалял их все, а отображение
имени настройки в тултипе добавил в код.
Ну и оставшиеся пустые "" под accesskey тоже удалил. Сама возможность
дописывать accesskey и дополнительный текст к тултипу, разумеется, никуда не делась.
Если рассудил неверно, тогда упс.
Вобщем вот. Но выложенный код далеко не убирай, в том смысле, что если
я там чего-то испортил, и надо будет откатить, и понадеяться на тот, что на форуме,
то придётся реплейсить " & > — которые там прописались, как-то.
data:text/plain;charset=utf-8;base64,Ly8g0JHRi9GB0YLRgNC+0LUg0L/QtdGA0LXQutC70Y7Rh9C10L3QuNC1INC/0LDRgNCw0LzQtdGC0YDQvtCyIGFib3V0OmNvbmZpZw0KKGFzeW5jIChuYW1lLCBpZCwgZnVuYykgPT4gew0KCWlmIChuYW1lID09ICJPYmplY3QiKSByZXR1cm4gQ3VzdG9taXphYmxlVUkuY3JlYXRlV2lkZ2V0KGZ1bmMoKSk7DQoJdmFyIHdpbiA9IG5hbWUgPT0gIldpbmRvdyIsIGcgPSBDb21wb25lbnRzLnV0aWxzLmltcG9ydCgicmVzb3VyY2U6Ly9ncmUvbW9kdWxlcy9TZXJ2aWNlcy5qc20iLCB7fSk7DQoJaWYgKGdbaWRdKSB7aWYgKHdpbikgcmV0dXJuO30gZWxzZSBnW2lkXSA9IGZ1bmMoKTsNCglpZiAod2luKSByZXR1cm4gQ3VzdG9taXphYmxlVUkuY3JlYXRlV2lkZ2V0KGdbaWRdKTsNCglhZGREZXN0cnVjdG9yKHIgPT4gcls1XSA9PSAiZSIgJiYgZGVsZXRlIGdbaWRdKTsNCglnW2lkXS5vbkNyZWF0ZWQodGhpcyk7DQp9KSh0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICJRdWlja1RvZ2dsZUFib3V0Q29uZmlnU2V0dGluZ3MiLCAoKSA9PiB7DQoNCgl2YXIge3ByZWZzfSA9IFNlcnZpY2VzLCBkYiA9IHByZWZzLmdldERlZmF1bHRCcmFuY2goIiIpOw0KCXZhciBwdiA9IHBhcnNlSW50KFNlcnZpY2VzLmFwcGluZm8ucGxhdGZvcm1WZXJzaW9uKTsNCgl2YXIgeHVsX25zID0gImh0dHA6Ly93d3cubW96aWxsYS5vcmcva2V5bWFzdGVyL2dhdGVrZWVwZXIvdGhlcmUuaXMub25seS54dWwiOw0KDQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KCS8vIHJlZnJlc2g6DQoJLy8JZmFsc2UgLSByZWxvYWQgY3VycmVudCB0YWINCgkvLwl0cnVlIC0gcmVsb2FkIGN1cnJlbnQgdGFiIHNraXAgY2FjaGUNCgkvLw0KCS8vIHJlc3RhcnQ6DQoJLy8JZmFsc2UgLSByZXN0YXJ0IGJyb3dzZXINCgkvLwl0cnVlIC0gcmVzdGFydCBicm93c2VyIHdpdGggY29uZmlybQ0KDQoJdmFyIHByaW1hcnkgPSBbew0KDQoJCQlwcmVmOiBbIm5ldHdvcmsucHJveHkudHlwZSIsICLQndCw0YHRgtGA0L7QudC60Lgg0L/RgNC+0LrRgdC4Il0sDQoJCQl1c2VyQ2hvaWNlOiA1LCB1c2VyQWx0OiAxLCByZWZyZXNoOiB0cnVlLA0KCQkJdmFsdWVzOiBbDQoJCQkJWzAsICLQndC1INC/0YDQvtC60YHQuNGA0L7QstCw0YLRjCIsICIwIl0sIFs1LCAi0KHQuNGB0YLQtdC80L3Ri9C1ICjQuNC3IElFKSIsICI1Il0sIFsyLCAi0JDQstGC0L4gKHBhY2ZpbGUpIiwgIjIiXSwNCgkJCQlbMSwgItCf0YDQvtC/0LjRgdCw0L3QvdGL0LUiLCAiMSJdLCBbNCwgItCQ0LLRgtC+0L7Qv9GA0LXQtNC10LvQtdC90LjQtSIsICI0Il0NCgldfSwNCgkJCW51bGwsDQoJew0KCQkJcHJlZjogWyJwZXJtaXNzaW9ucy5kZWZhdWx0LmltYWdlIiwgItCX0LDQs9GA0YPQttCw0YLRjCDQs9GA0LDRhNC40LrRgyJdLA0KCQkJdXNlckNob2ljZTogMSwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogW1sxLCAi0JTQsCJdLCBbMywgItChINGB0LDQudGC0LAiXSwgWzIsICLQndC10YIiXV0NCgl9LHsNCgkJCXByZWY6IFsiYnJvd3Nlci5kaXNwbGF5LnVzZV9kb2N1bWVudF9mb250cyIsICLQl9Cw0LPRgNGD0LbQsNGC0Ywgd2ViLdGI0YDQuNGE0YLRiyJdLA0KCQkJdXNlckNob2ljZTogMSwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogW1sxLCAi0JTQsCJdLCBbMCwgItCd0LXRgiJdXQ0KCX0sew0KCQkJcHJlZjogWyJqYXZhc2NyaXB0LmVuYWJsZWQiLCAi0JLRi9C/0L7Qu9C90Y/RgtGMINGB0LrRgNC40L/RgtGLIEphdmEiXSwNCgkJCXVzZXJDaG9pY2U6IHRydWUsIHJlZnJlc2g6IHRydWUsDQoJCQl2YWx1ZXM6IFtbdHJ1ZSwgItCU0LAiXSwgW2ZhbHNlLCAi0J3QtdGCIl1dDQoJfSx7DQoJCQlwcmVmOiBbIm1lZGlhLmF1dG9wbGF5LmRlZmF1bHQiLCAi0JDQstGC0L7Qt9Cw0L/Rg9GB0Log0LzQtdC00LjQsCJdLA0KCQkJdXNlckNob2ljZTogNSwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogWw0KCQkJCVs1LCAi0JHQu9C+0LrQuNGA0L7QstCw0YLRjCDQstGB0LUiLCAiNSJdLA0KCQkJCVsxLCAi0JHQu9C+0LrQuNGA0L7QstCw0YLRjCDQvdC1INC/0YDQuNCz0LvRg9GI0LXQvdC90L7QtSIsICIxIl0sDQoJCQkJWzAsICLQoNCw0LfRgNC10YjQuNGC0Ywg0LLRgdC1IiwgIjAiXQ0KCV19LHsNCgkJCXByZWY6IFsibWVkaWEuYXV0b3BsYXkuYmxvY2tpbmdfcG9saWN5IiwgItCQ0LLRgtC+0LfQsNC/0YPRgdC6ICjQv9C+0LvQuNGC0LjQutCwKSJdLA0KCQkJdXNlckNob2ljZTogMSwgdXNlckFsdDogMiwgcmVmcmVzaDogdHJ1ZSwNCgkJCXZhbHVlczogWw0KCQkJCVsxLCAi0JLRgNC10LzQtdC90L3QsNGPIiwgIjEiXSwNCgkJCQlbMiwgItCf0L4g0LTQtdC50YHRgtCy0LjRjiIsICIyIl0sDQoJCQkJWzAsICLQn9C+0YHRgtC+0Y/QvdC90LDRjyIsICIwIl0NCgldfSx7DQoJCQlwcmVmOiBbIm5ldHdvcmsuY29va2llLmNvb2tpZUJlaGF2aW9yIiwgIkNvb2tpZXMiXSwNCgkJCXVzZXJDaG9pY2U6IDEsIHVzZXJBbHQ6IDMsIHJlZnJlc2g6IGZhbHNlLA0KCQkJdmFsdWVzOiBbDQoJCQkJWzEsICLQndC1INC/0YDQuNC90LjQvNCw0YLRjCDRgdGC0L7RgNC+0L3QvdC40LUiXSwgWzMsICLQndC1INC/0YDQuNC90LjQvNCw0YLRjCDRgSDQvdC1INC/0L7RgdC10YnQtdC90L3Ri9GFIl0sIFs0LCAi0J3QtSDQv9GA0LjQvdC40LzQsNGC0Ywg0L7RgiDRgtGA0LXQutC10YDQvtCyIl0sDQoJCQkJWzIsICLQndC1INC/0YDQuNC90LjQvNCw0YLRjCDRgdC+INCy0YHQtdGFIl0sIFswLCAi0J/RgNC40L3QuNC80LDRgtGMINGB0L4g0LLRgdC10YUiXQ0KCV19LA0KCQkJbnVsbCwNCgl7DQoJCQlwcmVmOiBbImRvbS5zdG9yYWdlLmVuYWJsZWQiLCAi0JvQvtC60LDQu9GM0L3QvtC1INGF0YDQsNC90LjQu9C40YnQtSJdLA0KCQkJdXNlckNob2ljZTogdHJ1ZQ0KCX0NCl07DQoNCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQoJdmFyIHNlY29uZGFyeSA9IFt7DQoNCgkJCXByZWY6IFsiZG9tLnNlcnZpY2VXb3JrZXJzLmVuYWJsZWQiLCAi0JLQuNC00LXQviBkb20uc2VydmljZVdvcmtlcnMiXSwNCgkJCXVzZXJDaG9pY2U6IGZhbHNlDQoJfSx7DQoJCQlwcmVmOiBbImRvbS5lbmFibGVfcGVyZm9ybWFuY2UiLCAi0KHRgtCw0YLRg9GBINC30LDQs9GA0YPQt9C60Lgg0YHRgtGA0LDQvdC40YbRiyJdLA0KCQkJdXNlckNob2ljZTogZmFsc2UNCgl9LA0KCQkJbnVsbCwNCgl7DQoJCQlwcmVmOiBbImJyb3dzZXIuY2FjaGUubWVtb3J5LmVuYWJsZSIsICLQmtGN0Ygg0LIg0L7Qv9C10YDQsNGC0LjQstC90L7QuSDQv9Cw0LzRj9GC0LgiXSwNCgkJCXVzZXJDaG9pY2U6IHRydWUNCgl9LA0KCQkJbnVsbCwNCgl7DQoJCQlwcmVmOiBbImludGwuYWNjZXB0X2xhbmd1YWdlcyIsICLQr9C30YvQuiDQtNC70Y8g0LLQtdCxLdGB0YLRgNCw0L3QuNGGIl0sDQoJCQl1c2VyQ2hvaWNlOiAiZW4tVVMsIGVuIiwNCgkJCXZhbHVlczogW1siZW4tVVMsIGVuIiwgImVuLVVTLCBlbiJdLCBbImVuLVVTLCBlbiwgcnUtUlUsIHJ1IiwgImVuLVVTLCBlbiwgcnUtUlUsIHJ1Il1dDQoJfSx7DQoJCQlwcmVmOiBbImJyb3dzZXIuZGlzcGxheS5kb2N1bWVudF9jb2xvcl91c2UiLCAi0JjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMINGG0LLQtdGC0LAg0YHQsNC50YLQvtCyIl0sDQoJCQl1c2VyQ2hvaWNlOiAwLA0KCQkJdmFsdWVzOiBbWzAsICLQkNCy0YLQviIsICIwIl0sIFsxLCAi0JLRgdC10LPQtNCwIiwgIjEiXSwgWzIsICLQndC40LrQvtCz0LTQsCIsICIyIl1dDQoJfSwNCgkJCW51bGwsDQoJew0KCQkJcHJlZjogWyJuZXR3b3JrLmh0dHAuc2VuZFJlZmVyZXJIZWFkZXIiLCAiUmVmZXJlciAtINC00LvRjyDRh9C10LPQviJdLA0KCQkJdXNlckNob2ljZTogMSwNCgkJCXZhbHVlczogW1swLCAi0J3QuCDQtNC70Y8g0YfQtdCz0L4iLCAiMCJdLCBbMSwgItCi0L7Qu9GM0LrQviDRgdGB0YvQu9C60LgiLCAiMSJdLCBbMiwgItCh0YHRi9C70LrQuCDQuCDQuNC30L7QsdGALiIsICIyIl1dDQoJfSx7DQoJCQlwcmVmOiBbIm5ldHdvcmsuaHR0cC5yZWZlcmVyLnRyaW1taW5nUG9saWN5IiwgIlJlZmVyZXIgLSDRh9GC0L4iXSwNCgkJCXVzZXJDaG9pY2U6IDAsDQoJCQl2YWx1ZXM6IFtbMCwgItCf0L7Qu9C90YvQuSBVUkwiLCAiMCJdLCBbMSwgInNjaGVtZStob3N0K3BvcnQrcGF0aCIsICIxIl0sIFsyLCAic2NoZW1lK2hvc3QrcG9ydCIsICIyIl1dDQoJfSx7DQoJCQlwcmVmOiBbIm5ldHdvcmsuaHR0cC5yZWZlcmVyLlhPcmlnaW5Qb2xpY3kiLCAiUmVmZXJlclhPIC0g0LrQvtCz0LTQsCJdLA0KCQkJdXNlckNob2ljZTogMCwNCgkJCXZhbHVlczogW1swLCAi0JIg0LvRjtCx0L7QvCDRgdC70YPRh9Cw0LUiLCAiMCJdLCBbMSwgItCf0YDQuCDRgdC+0LLQvy4g0LHQsNC3LiDQtNC+0LzQtdC90LAiLCAiMSJdLCBbMiwgItCf0YDQuCDRgdC+0LLQv9Cw0LTQtdC90LjQuCDQsNC00YDQtdGB0LAiLCAiMiJdXQ0KCX0sew0KCQkJcHJlZjogWyJuZXR3b3JrLmh0dHAucmVmZXJlci5YT3JpZ2luVHJpbW1pbmdQb2xpY3kiLCAiUmVmZXJlclhPIC0g0YfRgtC+Il0sDQoJCQl1c2VyQ2hvaWNlOiAwLA0KCQkJdmFsdWVzOiBbWzAsICLQn9C+0LvQvdGL0LkgVVJMIiwgIjAiXSwgWzEsICJzY2hlbWUraG9zdCtwb3J0K3BhdGgiLCAiMSJdLCBbMiwgInNjaGVtZStob3N0K3BvcnQiLCAiMiJdXQ0KCX0sew0KCQkJcHJlZjogWyJuZXR3b3JrLmh0dHAucmVmZXJlci5zcG9vZlNvdXJjZSIsICJSZWZlcmVyIC0g0LrQvtGA0LXQvdGMINGB0LDQudGC0LAiXSwNCgkJCXVzZXJDaG9pY2U6IGZhbHNlDQoJfSwNCgkJCW51bGwsDQoJew0KCQkJcHJlZjogWyJtZWRpYS5wZWVyY29ubmVjdGlvbi5lbmFibGVkIiwgIldlYlJUQyDRg9GC0LXRh9C60LAgSVAiXSwNCgkJCXVzZXJDaG9pY2U6IGZhbHNlDQoJfQ0KCV07DQoNCglyZXR1cm4gew0KCQlsYWJlbDogIlF1aWNrIHRvZ2dsZSIsDQoJCWlkOiAiUXVpY2tUb2dnbGVBYm91dENvbmZpZ1NldHRpbmdzIiwNCgkJbG9jYWxpemVkOiBmYWxzZSwNCgkJaW1hZ2U6ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVVBQUFBSmNFaFpjd0FBRHNNQUFBN0RBY2R2cUdRQUFBRlBTVVJCVkRoUG5WUE5Tc05BRUo1dGFtbkJrK0E3Qk1FY2lrb2hwL2dpOWkxOG5SYWZRb1QwMGtLMTZ0bm44Q0pvNHZwOW01bTQxZVNnSDB6bWQzZCtkaUovZ2ZkZWR2bDBRVzdrMVBjTHdlbSszVGpvd1phZ0srTm42eWMzZ05DSitMQ0NoOUx6elRNZHFlb05ia1FTRlptcEpMR0NXNUd4MmhaYVFhaE1iWjUyVnVEU2ZIcG5BVkpYT2I0Rkt6aWFuYnpDWGlMckhMWWw1QzN0NU5UUnd0eGFLSnhVVFovSmNPVHI2cTJSeHdmMGFWYjIvaExzNEtxTDNJc2Nrei9tbVNkUlJrc2p5Zyt6N0lNNkx6RENCZnV2QUVPSm1JS0JPcUFXbW8xWW9keExsUU5zeU8wcnNJVi9BWk0rSkdjMmE0R2d6aFoycDltRm1ycGJvQ01xTllCRGRNbHdvbXBvVFdONkYybkZUNWhCWGIwUEVwbW8vR2srb0grUnJxTlpJTlBlSWxuWlZpVjFqUXVMRkpRdVdHQjBnSmR3Z1NodnFkUFhadjZKK0YvUVM3b1hxUTl4QlRGWjVvYThmQUdzOWZlZDVZaFBTd0FBQUFCSlJVNUVya0pnZ2c9PSIsDQoJCW9uQ3JlYXRlZChidG4pIHsNCgkJCWJ0bi5zZXRBdHRyaWJ1dGUoImltYWdlIiwgdGhpcy5pbWFnZSk7DQoJCQl2YXIgZG9jID0gYnRuLm93bmVyRG9jdW1lbnQ7DQoNCgkJCWJ0bi5idG4gPSB0cnVlOw0KCQkJYnRuLmRvbVBhcmVudCA9IG51bGw7DQoJCQlidG4ucG9wdXBzID0gbmV3IGJ0bi5vd25lckdsb2JhbC5BcnJheSgpOw0KCQkJdGhpcy5jcmVhdGVQb3B1cChkb2MsIGJ0biwgInByaW1hcnkiLCBwcmltYXJ5KTsNCgkJCXRoaXMuY3JlYXRlUG9wdXAoZG9jLCBidG4sICJzZWNvbmRhcnkiLCBzZWNvbmRhcnkpOw0KDQoJCQlidG4ubGlua2VkT2JqZWN0ID0gdGhpczsNCgkJCWZvcih2YXIgdHlwZSBvZiBbImNvbW1hbmQiLCAiY29udGV4dG1lbnUiXSkNCgkJCQlidG4uc2V0QXR0cmlidXRlKCJvbiIgKyB0eXBlLCBgbGlua2VkT2JqZWN0LiR7dHlwZX0oZXZlbnQpYCk7DQoJCX0sDQoJCWNyZWF0ZVBvcHVwKGRvYywgYnRuLCBuYW1lLCBkYXRhKSB7DQoJCQl2YXIgcG9wdXAgPSBkb2MuY3JlYXRlRWxlbWVudE5TKHh1bF9ucywgIm1lbnVwb3B1cCIpOw0KCQkJdmFyIHByb3AgPSBuYW1lICsgIlBvcHVwIjsNCgkJCWJ0bi5wb3B1cHMucHVzaChidG5bcHJvcF0gPSBwb3B1cCk7DQoJCQlwb3B1cC5pZCA9IHRoaXMuaWQgKyAiLSIgKyBwcm9wOw0KCQkJZm9yICh2YXIgdHlwZSBvZiBbInBvcHVwc2hvd2luZyIsICJjbGljayJdKQ0KCQkJCXBvcHVwLnNldEF0dHJpYnV0ZSgib24iICsgdHlwZSwgYHBhcmVudE5vZGUubGlua2VkT2JqZWN0LiR7dHlwZX0oZXZlbnQpYCk7DQoJCQlmb3IodmFyIG9iaiBvZiBkYXRhKSBwb3B1cC5hcHBlbmQodGhpcy5jcmVhdGVFbGVtZW50KGRvYywgb2JqKSk7DQoJCQlidG4uYXBwZW5kKHBvcHVwKTsNCgkJfSwNCgkJY3JlYXRlRWxlbWVudChkb2MsIG9iaikgew0KCQkJaWYgKCFvYmopIHJldHVybiBkb2MuY3JlYXRlRWxlbWVudE5TKHh1bF9ucywgIm1lbnVzZXBhcmF0b3IiKTsNCgkJCXZhciBwcmVmID0gZG9jLm93bmVyR2xvYmFsLk9iamVjdC5jcmVhdGUobnVsbCksIG5vZGUsIGltZywgYm9vbDsNCgkJCWZvcih2YXIgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7DQoJCQkJaWYgKGtleSA9PSAicHJlZiIpIHsNCgkJCQkJdmFyIFthcHJlZiwgbGFiLCBha2V5LCB0dHRdID0gdmFsOw0KCQkJCQlwcmVmLnByZWYgPSBhcHJlZjsgcHJlZi5sYWIgPSBsYWIgfHwgYXByZWY7DQoJCQkJCWlmICh0dHQpIHByZWYudHR0ID0gdHR0Ow0KCQkJCX0NCgkJCQllbHNlIGlmIChrZXkgPT0gImltYWdlIikgaW1nID0gdmFsLCBwcmVmLmltZyA9IHRydWU7DQoJCQkJZWxzZSBpZiAoa2V5ICE9ICJ2YWx1ZXMiKSBwcmVmW2tleV0gPSB2YWw7DQoJCQkJZWxzZSBwcmVmLmhhc1ZhbHMgPSB0cnVlOw0KCQkJfQ0KCQkJdmFyIHR5cGUgPSBwcmVmcy5nZXRQcmVmVHlwZShwcmVmLnByZWYpLCBzdHIsIGJvb2w7DQoJCQl2YXIgcGludCA9IHR5cGUgPT0gcHJlZnMuUFJFRl9JTlQsIGludiA9IHR5cGUgPT0gcHJlZnMuUFJFRl9JTlZBTElEOw0KCQkJaWYgKGludiAmJiBvYmoudmFsdWVzIHx8IHBpbnQgfHwgdHlwZSA9PSBwcmVmcy5QUkVGX1NUUklORykNCgkJCQlzdHIgPSBwaW50IHx8IChpbnYgJiYgdHlwZW9mIG9iai52YWx1ZXNbMF1bMF0gPT0gIm51bWJlciIpID8gIkludCIgOiAiU3RyaW5nIjsNCgkJCWVsc2UNCgkJCQlzdHIgPSAiQm9vbCIsIGJvb2wgPSB0cnVlOw0KCQkJcHJlZi5nZXQgPSBwcmVmc1tgZ2V0JHtzdHJ9UHJlZmBdOw0KCQkJcHJlZi5zZXQgPSBwcmVmc1tgc2V0JHtzdHJ9UHJlZmBdOw0KDQoJCQlub2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyh4dWxfbnMsICJtZW51Iik7DQoJCQlub2RlLmNsYXNzTmFtZSA9ICJtZW51LWljb25pYyI7DQoJCQlub2RlLnNldEF0dHJpYnV0ZSgiY2xvc2VtZW51IiwgIm5vbmUiKTsNCgkJCWltZyAmJiBub2RlLnNldEF0dHJpYnV0ZSgiaW1hZ2UiLCBpbWcpOw0KCQkJYWtleSAmJiBub2RlLnNldEF0dHJpYnV0ZSgiYWNjZXNza2V5IiwgYWtleSk7DQoJCQkobm9kZS5wcmVmID0gcHJlZikudmFscyA9IGRvYy5vd25lckdsb2JhbC5PYmplY3QuY3JlYXRlKG51bGwpOw0KCQkJdGhpcy5jcmVhdGVSYWRpb3MoZG9jLA0KCQkJCWJvb2wgJiYgIXByZWYuaGFzVmFscyA/IFtbdHJ1ZSwgInRydWUiXSwgW2ZhbHNlLCAiZmFsc2UiXV0gOiBvYmoudmFsdWVzLA0KCQkJCW5vZGUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUVsZW1lbnROUyh4dWxfbnMsICJtZW51cG9wdXAiKSkNCgkJCSk7DQoJCQlpZiAoInVzZXJDaG9pY2UiIGluIG9iaikgcHJlZi5ub0FsdCA9ICEoInVzZXJBbHQiIGluIG9iaik7DQoJCQlyZXR1cm4gbm9kZTsNCgkJfSwNCgkJVXNlckNob2ljZUltZzogImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUNSVWxFUVZSNDJxV1RTMmdUUVJqSC96UEpabzJCRGZna0I2MnZZZzVDalFkdlJVRThXQjhIS3lhaFlvdElRUU9lRktHQ0Y3RWd2UWxCcU9DaldGS2xldkJSRHlMNHVIbG9MWGhZcVdKcm9hRXFsRVRTcHRuZEdiK1pQREgwb2pOOE84dkE5OHZ2Ky9JdHczOHUxblNSWVJFNlVoS3lnNEZGMVIyOTIvUSt4aGhMaTRUSXJnamdJendlNE1iZ21SMm5yWk10eHhFTjYzellPUnVQWnA3Z3pwZWh2Q3U5WGpmdVBtd0NVSElpRXR3NGZLODl6VnZEMitGSEFENTZxdVhCcFYzQ1ZPNHJldDZueEh6eFp4ZEJSdXFBRENLbXo3UkhEOXkydGxtYlliQlZmd0U4RFhCa0VkL3kzOUg1K216ZThaeW9TSXBzRlhDOXUvVkUzL2xkcHlnNUFBTUVvSk1UUWkyaEFOS0JneUtkeTBoL2VvQ2hxY2Y5TWltdlZBSGpkL2ZkaUcwTlJ3Z1FwREFwMWFnQnBEWndkSEtKTEtaemMraDVlM2tDU2V4aDVjNWo4Zm1oVzBIR3BOWlhGa3Fmc1FwQUtnY0ZLR21BbEF4SFhwNWJra21zcmhvc2poNGNDSUo1cEc1cWZRWGd0TXNscU8xcWdFTVdUUHJSK2VyaUVob0E0d043TDhUV2gwS1ZYemZnWTJSUUFValZCZW5XTEg0VUNyajA0V2E5Qk5YRW81dmErdzYzeENpSjZXUlZQMk1WZ05RSWdqZ0VBMTdNVE9EWjdMdCtBdFNhR0RHNDM3N2ExbTJGQWtLcmMxMS9kVXdJSUQxZFNLSEVjVzN5ZnQ0UmJwUjZrSzFQWWdhSnRhWTFuTnA1akllTXNqS05iczFBV1JVY2p2VG5wMktoOUx0TEpHVERJTlVoY1RJWjNMK2h6ZHE5Wmd2V21TRjkvV3U1Z0k4TDAzZ3pQNWwzaGRkTC8zL3pLRGRBOU1kRTBVRVJyZHphRkdNVWFhcDc1WS9wWDlZZmFwNzZFUVlhQ2VFQUFBQUFTVVZPUks1Q1lJST0iLA0KCQlub3RVc2VyQ2hvaWNlSW1nOiAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQ05VbEVRVlI0MnFYVFQyalRVQndIOEc5ZTB0YTJrczVORDBXdy9xWDFvR3lldkV3UW5PQkE2RUhYd0x3b1VoM2VSR1JzNTAxUlBFNnhncDZLcmV4UUVDWlk4REJQWG1iUlM0Wi9LMGdSdG1tRGEyeWI1UGxMWDdwMkd3cGk0RWZDeThzbjMvZFB3bjllMHNhR25DUkY2WFlGbkE5RGtoS3RSczUxZXA2am10RWNwL0pISU05WWl2bDltZjBYTkRWMk5nbjFZTHpWeGRCMWxKOFU4UDVoenVDV25SNnhyUHdtSU04a0xSamRrVDMyNkJhTEhOZ0xLQUZBOW91WGRoT3c2cWkrKzRqNTg5Y2Q4OXZTYU1xeWMyc0FQVVhsZ0Y4Znl0OVdJM3QyQXY0dzROc0NNSjhBSEFLYXY2aHFxSDc2aXVMSU5jTnVOaE9hd3l0dFlDcCs3dFJFLzZYVDlHRlFBRzRDcG5pQVRRa0lhTlFJTVZHNi94U0wyV2ZUR3VlVGJXRGg1TDJyQTl0MjlRR0JyUVFFUFVEdUF1b0VtRlNyK1A1bEdjOHYzM210QVVmYVFPM000L0dnRE9vWUNJa1VpbjhEMEJERG9CUTJaTXhxTjB3Q1FoMGdNeGFVblliNHV6dCtkd0laOHdCSFRHUWJZQUhNcHUrdUF4YUd4cE1EdlNyM0FIY0ZhQUlsRCtCdG9ONmFnNVdxaE9MTndyb2hUTVdQSDVyb1A3cGRMSXdiM3dXNkV6aVdHQVpocFZkTFdIenhkcHFBeWM0eUtySis0dUtnMm9NVitsZ1JLOUNkd0FWc0cxV3BGOFVIODRadDJRa0NLbXNiaVJBdEZBbGxCNU9IV1E5ZnByODFPd2xjZ0JMOWtQcndzdkRHTVExek5NVjVaeU4xSVNsWllabDkvVEUxdGp1TVNGZ0ExVldPOHVlZitGQXFHNDd0cEZNY203ZHlGeUlPRXpCTWxmQ2FkYW81cWhrMzlsOVA0NzlldndGYmlPY1JTWEt1ZUFBQUFBQkpSVTVFcmtKZ2dnPT0iLA0KCQlVc2VyQWx0SW1nOiAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQURzTUFBQTdEQWNkdnFHUUFBQUlmU1VSQlZEaFBwVk05YjlOUUZEMDJjU0tLRlZHS0lGRlJFRnNtRmlDQTFBRVFRclFqQzBnc3NMQ2tDMGpKajBpRldGb0dkaVQ0QXkwU0VtSkJoUEk1RkJva2lrTDRTQ0MwVGUyVXhJbnQxM01kdTFDVnJWYzY3MTNmZTg2eC9UNncwOURDZVROS0o3UTBwenlVbW9DbVpZT2lVaFhtczhSTWNkNnZCN1V3dGhoTTVmVExXaXgyTDNQbVlqS2RPd2R6OURERkd0cjFLdW92bnFEMjlKR2xmTzlHb2V3OURDVi9EYVp5MnBYRThQRDlZL21idXBrNnhFNmNWV1BRaEV1akhvMis0ZlhkTzc2enRucTFVUFlmU0Njd0tCMUhXamVNeXVuQ3JhU1pPc0RxYmtCUHNCT1ROb01HdmtPVEx0by9mK0Y1NmJibGUyNjJPSy9xZXNpWXpJeWRUSm9qRkxqcmdFZTRiY0lPRWRYV1llNkxJVE4yS2dtRlNSRkdCdVBwbzBlQW5nWDBTZXhUSkhENUxPZ0xwRVpUY2dLdVV1TWlqQXl5NWw3K3IwTlNiMjFnNUxRSTVnR1lTeTJBallCTGpReVJBVW5pVG5KWHNCb2F5QnptM1JCQm5kd3dJb09LM2ZnTmRJUkVRWUNWLzBEcUxkaU5acUNSSVRLWWF5eDg1UmZRdVVOaVozazdJZ08rdmZHZVhHcGtpQXltYSsrV0xIdFpoWjhvNUgvRkVWcG9zMVY3dThURndMUUlkOG53K0FmYTUxT3Eydnl5Y21sazlLQ1cwR1hGWmV1NjNJVU84ejg4Qng1czI4U2J1VVhmZGR6cnhWY29ieHBJMEdUaDdINzM0L2RQelF0OWQwL0NHQnBDUEI3bmJobXdiQVBWeFI0K1BQdHN1VTcvV3VFbHRoL2xLT1JVY3NvVEU4VGdNZzBXYkphWTRadTNYS1lkQnJBQkFSVWsrbHM0RGZRQUFBQUFTVVZPUks1Q1lJST0iLA0KCQl1cGQobm9kZSkgew0KCQkJdmFyIHtwcmVmfSA9IG5vZGUsIGRlZiA9IGZhbHNlLCB1c2VyID0gZmFsc2UsIHZhbDsNCgkJCWlmIChwcmVmcy5nZXRQcmVmVHlwZShwcmVmLnByZWYpICE9IHByZWZzLlBSRUZfSU5WQUxJRCkgew0KCQkJCXZhciBwbiA9IHByZWYucHJlZjsNCgkJCQl0cnkge3ZhbCA9IHByZWYuZGVmVmFsID0gZGJbcHJlZi5nZXQubmFtZV0ocG4pOyBkZWYgPSB0cnVlfQ0KCQkJCWNhdGNoKGV4KSB7ZGVmID0gZmFsc2U7fQ0KCQkJCXZhciB1c2VyID0gcHJlZnMucHJlZkhhc1VzZXJWYWx1ZShwbik7DQoJCQkJaWYgKHVzZXIpIHRyeSB7dmFsID0gcHJlZi5nZXQocG4sIHVuZGVmaW5lZCk7fSBjYXRjaChleCkge30NCgkJCX0NCgkJCWlmICh2YWwgPT0gcHJlZi52YWwgJiYgZGVmID09IHByZWYuZGVmICYmIHVzZXIgPT0gcHJlZi51c2VyKSByZXR1cm47DQoJCQlwcmVmLnZhbCA9IHZhbDsgcHJlZi5kZWYgPSBkZWY7IHByZWYudXNlciA9IHVzZXI7DQoJCQl2YXIgZXhpc3RzID0gZGVmIHx8IHVzZXI7DQoNCgkJCXZhciB0dHQgPSBleGlzdHMgPyB2YWwgOiAi0K3RgtC+0LPQviDQv9GA0LXRhNCwINC90LUg0YHRg9GJ0LXRgdGC0LLRg9C10YIiOw0KCQkJaWYgKHR0dCA9PT0gIiIpIHR0dCA9ICJbIGVtcHR5X3N0cmluZyBdIjsNCgkJCXR0dCArPSAiXG4iICsgcHJlZi5wcmVmOw0KCQkJaWYgKHByZWYudHR0KSB0dHQgKz0gIlxuIiArIHByZWYudHR0Ow0KCQkJbm9kZS50b29sdGlwVGV4dCA9IHR0dDsNCg0KCQkJdmFyIGltZywgYWx0ID0gInVzZXJBbHQiIGluIHByZWYgJiYgdmFsID09IHByZWYudXNlckFsdDsNCgkJCWlmIChhbHQpIGltZyA9IHRoaXMuVXNlckFsdEltZzsNCgkJCWlmICgidXNlckNob2ljZSIgaW4gcHJlZikNCgkJCQlpZiAodmFsID09IHByZWYudXNlckNob2ljZSkNCgkJCQkJbm9kZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiY29sb3IiKSwNCgkJCQkJaW1nID0gdGhpcy5Vc2VyQ2hvaWNlSW1nOw0KCQkJCWVsc2Ugew0KCQkJCQlub2RlLnN0eWxlLnNldFByb3BlcnR5KCJjb2xvciIsICJtYXJvb24iLCAiaW1wb3J0YW50Iik7DQoJCQkJCWlmICghYWx0KSBpbWcgPSB0aGlzLm5vdFVzZXJDaG9pY2VJbWc7DQoJCQkJfQ0KCQkJaWYgKCFwcmVmLmltZykgaW1nDQoJCQkJPyBub2RlLnNldEF0dHJpYnV0ZSgiaW1hZ2UiLCBpbWcpDQoJCQkJOiBub2RlLnJlbW92ZUF0dHJpYnV0ZSgiaW1hZ2UiKTsNCgkJCXVzZXINCgkJCQk/IG5vZGUuc3R5bGUuc2V0UHJvcGVydHkoImZvbnQtc3R5bGUiLCAiaXRhbGljIiwgImltcG9ydGFudCIpDQoJCQkJOiBub2RlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJmb250LXN0eWxlIik7DQoNCgkJCXZhciB7bGFifSA9IHByZWY7DQoJCQlpZiAoZXhpc3RzICYmIHByZWYuaGFzVmFscykgew0KCQkJCWlmICh2YWwgaW4gcHJlZi52YWxzKSB2YXIgc2Z4ID0gcHJlZi52YWxzW3ZhbF0gfHwgdmFsOw0KCQkJCWVsc2UgdmFyIHNmeCA9IHVzZXIgPyAi0JTRgNGD0LPQvtC1IiA6ICLQn9C+INGD0LzQvtC70YfQsNC90LjRjiI7DQoJCQkJbGFiICs9IGAg4oCUICIke3NmeH0iYDsNCgkJCX0NCgkJCW5vZGUuc2V0QXR0cmlidXRlKCJsYWJlbCIsIGxhYik7DQoJCX0sDQoJCWNyZWF0ZVJhZGlvcyhkb2MsIHZhbHMsIHBvcHVwKSB7DQoJCQlmb3IodmFyIGFyciBvZiB2YWxzKSB7DQoJCQkJaWYgKCFhcnIpIHsNCgkJCQkJcG9wdXAuYXBwZW5kKGRvYy5jcmVhdGVFbGVtZW50TlMoeHVsX25zLCAibWVudXNlcGFyYXRvciIpKTsNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KCQkJCXZhciBbdmFsLCBsYWIsIGtleSwgdHR0XSA9IGFycjsNCgkJCQl2YXIgbWVudWl0ZW0gPSBkb2MuY3JlYXRlRWxlbWVudE5TKHh1bF9ucywgIm1lbnVpdGVtIik7DQoJCQkJbWVudWl0ZW0uc2V0QXR0cmlidXRlKCJ0eXBlIiwgInJhZGlvIik7DQoJCQkJbWVudWl0ZW0uc2V0QXR0cmlidXRlKCJjbG9zZW1lbnUiLCAibm9uZSIpOw0KCQkJCW1lbnVpdGVtLnN0eWxlLnNldFByb3BlcnR5KCJmb250LXN0eWxlIiwgIml0YWxpYyIsICJpbXBvcnRhbnQiKSwNCgkJCQltZW51aXRlbS5zZXRBdHRyaWJ1dGUoImxhYmVsIiwgcG9wdXAucGFyZW50Tm9kZS5wcmVmLnZhbHNbdmFsXSA9IGxhYik7DQoJCQkJa2V5ICYmIG1lbnVpdGVtLnNldEF0dHJpYnV0ZSgiYWNjZXNza2V5Iiwga2V5KTsNCgkJCQl2YXIgdGlwID0gbWVudWl0ZW0udmFsID0gdmFsOw0KCQkJCWlmICh0dHQpIHRpcCArPSAiXG4iICsgdHR0Ow0KCQkJCW1lbnVpdGVtLnRvb2x0aXBUZXh0ID0gdGlwOw0KCQkJCXBvcHVwLmFwcGVuZChtZW51aXRlbSk7DQoJCQl9DQoJCX0sDQoJCW9wZW5Qb3B1cChwb3B1cCkgew0KCQkJdmFyIGJ0biA9IHBvcHVwLnBhcmVudE5vZGU7DQoJCQlpZiAoYnRuLmRvbVBhcmVudCAhPSBidG4ucGFyZW50Tm9kZSkgew0KCQkJCWJ0bi5kb21QYXJlbnQgPSBidG4ucGFyZW50Tm9kZTsNCgkJCQl2YXIgcG9zOw0KCQkJCWlmIChidG4ubWF0Y2hlcygiLndpZGdldC1vdmVyZmxvdy1saXN0ID4gOnNjb3BlIikpDQoJCQkJCXBvcyA9ICJhZnRlcl9zdGFydCI7DQoJCQkJZWxzZSB2YXIgd2luID0gYnRuLm93bmVyR2xvYmFsLCB7d2lkdGgsIGhlaWdodCwgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0fSA9DQoJCQkJCWJ0bi5jbG9zZXN0KCJ0b29sYmFyIikuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHBvcyA9IHdpZHRoID4gaGVpZ2h0DQoJCQkJCQk/IGAke3dpbi5pbm5lckhlaWdodCAtIGJvdHRvbSA+IHRvcCA/ICJhZnRlciIgOiAiYmVmb3JlIn1fc3RhcnRgDQoJCQkJCQk6IGAke3dpbi5pbm5lcldpZHRoIC0gcmlnaHQgPiBsZWZ0ID8gImVuZCIgOiAic3RhcnQifV9iZWZvcmVgOw0KCQkJCWZvcih2YXIgcCBvZiBidG4ucG9wdXBzKSBwLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBwb3MpOw0KCQkJfQ0KCQkJcG9wdXAub3BlblBvcHVwKGJ0bik7DQoJCX0sDQoJCW1heWJlUmVzdGFydChub2RlLCBjb25mKSB7DQoJCQl2YXIgbXNnUmVzdCA9ICLQn9C10YDQtdC30LDQv9GD0YHRgtC40YLRjCDQsdGA0LDRg9C30LXRgD8iLCBtc2dBYm9ydCA9ICLQl9Cw0L/RgNC+0YEg0L3QsCDQstGL0YXQvtC0INC+0YLQvNC10L3QtdC9LiI7DQoJCQlpZiAocHYgPj0gNzcpIHsNCgkJCQl2YXIgdGl0bGUgPSBub2RlLmNsb3Nlc3QoInRvb2xiYXJidXR0b24iKS5sYWJlbDsNCgkJCQl2YXIgcHAgPSBkb21XaW4gPT4gU2VydmljZXMucHJvbXB0LndyYXBwZWRKU09iamVjdC5waWNrUHJvbXB0ZXIoew0KCQkJCQlkb21XaW4sIG1vZGFsVHlwZTogQ2kubnNJUHJvbXB0Lk1PREFMX1RZUEVfV0lORE9XDQoJCQkJfSk7DQoJCQkJdmFyIGNvbmZpcm0gPSB3aW4gPT4gcHAod2luKS5jb25maXJtKHRpdGxlLCBtc2dSZXN0KTsNCgkJCQl2YXIgYWxlcnQgPSB3aW4gPT4gcHAod2luKS5hbGVydCh0aXRsZSwgbXNnQWJvcnQpOw0KCQkJfSBlbHNlIHsNCgkJCQl2YXIgY29uZmlybSA9IHdpbiA9PiB3aW4uY29uZmlybShtc2dSZXN0KTsNCgkJCQl2YXIgYWxlcnQgPSB3aW4gPT4gd2luLmFsZXJ0KG1zZ0Fib3J0KTsNCgkJCX0NCgkJCXJldHVybiAodGhpcy5tYXlCZVJlc3RhcnQgPSAobm9kZSwgY29uZikgPT4gew0KCQkJCXZhciB3aW4gPSBub2RlLm93bmVyR2xvYmFsOw0KCQkJCWlmIChjb25mICYmICFjb25maXJtKHdpbikpIHJldHVybjsNCgkJCQlpZiAod2luLkJyb3dzZXJVdGlscy5yZXN0YXJ0QXBwbGljYXRpb24oKSA9PT0gZmFsc2UpIGFsZXJ0KHdpbik7DQoJCQkJZWxzZSByZXR1cm4gdHJ1ZTsNCgkJCX0pKG5vZGUsIGNvbmYpOw0KCQl9LA0KCQlyZWdleHBSZWZyZXNoOiAvXig/OnZpZXctc291cmNlOik/KD86aHR0cHM/fGZ0cCkvLA0KCQltYXliZVJlKG5vZGUsIGZlKSB7DQoJCQl2YXIge3ByZWZ9ID0gbm9kZTsNCgkJCWlmICgicmVzdGFydCIgaW4gcHJlZikgew0KCQkJCWlmICh0aGlzLm1heWJlUmVzdGFydChub2RlLCBwcmVmLnJlc3RhcnQpKSByZXR1cm47DQoJCQl9DQoJCQllbHNlIHRoaXMucG9wdXBzaG93aW5nKGZlLCBub2RlLnBhcmVudE5vZGUpOw0KCQkJaWYgKCJyZWZyZXNoIiBpbiBwcmVmKSB7DQoJCQkJdmFyIHdpbiA9IG5vZGUub3duZXJHbG9iYWw7DQoJCQkJaWYgKHRoaXMucmVnZXhwUmVmcmVzaC50ZXN0KHdpbi5nQnJvd3Nlci5jdXJyZW50VVJJLnNwZWMpKSBwcmVmLnJlZnJlc2gNCgkJCQkJPyB3aW4uQnJvd3NlclJlbG9hZFNraXBDYWNoZSgpIDogd2luLkJyb3dzZXJSZWxvYWQoKTsNCgkJCX0NCgkJfSwNCgkJY29tbWFuZChlKSB7DQoJCQl2YXIgdHJnID0gZS50YXJnZXQ7DQoJCQlpZiAodHJnLmJ0bikgcmV0dXJuIHRoaXMub3BlblBvcHVwKHRyZy5wcmltYXJ5UG9wdXApOw0KDQoJCQl2YXIgbWVudSA9IHRyZy5jbG9zZXN0KCJtZW51IiksIG5ld1ZhbCA9IHRyZy52YWw7DQoJCQlpZiAobmV3VmFsICE9IG1lbnUucHJlZi52YWwpDQoJCQkJbWVudS5wcmVmLnNldChtZW51LnByZWYucHJlZiwgbmV3VmFsKSwNCgkJCQl0aGlzLm1heWJlUmUobWVudSwgdHJ1ZSk7DQoJCX0sDQoJCXBvcHVwc2hvd2luZyhlLCB0cmcgPSBlLnRhcmdldCkgew0KCQkJaWYgKHRyZy5pZCkgew0KCQkJCWZvcih2YXIgbm9kZSBvZiB0cmcuY2hpbGRyZW4pIHsNCgkJCQkJaWYgKG5vZGUubm9kZU5hbWUuZW5kc1dpdGgoInIiKSkgY29udGludWU7DQoJCQkJCXRoaXMudXBkKG5vZGUpOw0KCQkJCQkhZSAmJiBub2RlLm9wZW4gJiYgdGhpcy5wb3B1cHNob3dpbmcobnVsbCwgbm9kZS5xdWVyeVNlbGVjdG9yKCJtZW51cG9wdXAiKSk7DQoJCQkJfQ0KCQkJCXJldHVybjsNCgkJCX0NCgkJCXZhciB7cHJlZn0gPSB0cmcuY2xvc2VzdCgibWVudSIpLCBmaW5kQ2hlY2tlZCA9IHRydWU7DQoNCgkJCXZhciBmaW5kRGVmID0gImRlZlZhbCIgaW4gcHJlZjsNCgkJCXZhciBjaGVja2VkID0gdHJnLnF1ZXJ5U2VsZWN0b3IoIltjaGVja2VkXSIpOw0KCQkJaWYgKGNoZWNrZWQpIHsNCgkJCQlpZiAoY2hlY2tlZC52YWwgPT0gcHJlZi52YWwpIHsNCgkJCQkJaWYgKGZpbmREZWYpIGZpbmRDaGVja2VkID0gZmFsc2U7DQoJCQkJCWVsc2UgcmV0dXJuOw0KCQkJCX0NCgkJCQllbHNlIGNoZWNrZWQucmVtb3ZlQXR0cmlidXRlKCJjaGVja2VkIik7DQoJCQl9DQoJCQlpZiAoZmluZERlZikgew0KCQkJCXZhciBkZWYgPSB0cmcucXVlcnlTZWxlY3RvcigibWVudWl0ZW06bm90KFtzdHlsZSo9Zm9udC1zdHlsZV0iKTsNCgkJCQlpZiAoZGVmKQ0KCQkJCQlpZiAoZGVmLnZhbCA9PSBwcmVmLmRlZlZhbCkgew0KCQkJCQkJaWYgKGZpbmRDaGVja2VkKSBmaW5kRGVmID0gZmFsc2U7DQoJCQkJCQllbHNlIHJldHVybjsNCgkJCQkJfQ0KCQkJCQllbHNlIGRlZi5zdHlsZS5zZXRQcm9wZXJ0eSgiZm9udC1zdHlsZSIsICJpdGFsaWMiLCAiaW1wb3J0YW50Iik7DQoJCQl9DQoJCQlmb3IodmFyIG5vZGUgb2YgdHJnLmNoaWxkcmVuKSBpZiAoInZhbCIgaW4gbm9kZSkgew0KCQkJCWlmIChmaW5kQ2hlY2tlZCAmJiBub2RlLnZhbCA9PSBwcmVmLnZhbCkgew0KCQkJCQlub2RlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsIHRydWUpOw0KCQkJCQlpZiAoZmluZERlZikgZmluZENoZWNrZWQgPSBmYWxzZTsNCgkJCQkJZWxzZSBicmVhazsNCgkJCQl9DQoJCQkJaWYgKGZpbmREZWYgJiYgbm9kZS52YWwgPT0gcHJlZi5kZWZWYWwpIHsNCgkJCQkJbm9kZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiZm9udC1zdHlsZSIpOw0KCQkJCQlpZiAoZmluZENoZWNrZWQpIGZpbmREZWYgPSBmYWxzZTsNCgkJCQkJZWxzZSBicmVhazsNCgkJCQl9DQoJCQl9DQoJCX0sDQoJCWNvbnRleHRtZW51KGUpIHsNCgkJCXZhciB0cmcgPSBlLnRhcmdldDsNCgkJCWlmICh0cmcuYnRuKSB7DQoJCQkJaWYgKGUuY3RybEtleSB8fCBlLnNoaWZ0S2V5KSByZXR1cm47DQoJCQkJaWYgKGUuZGV0YWlsID09IDIpIHJldHVybiB0cmcuc2Vjb25kYXJ5UG9wdXAuaGlkZVBvcHVwKCk7DQoJCQkJdGhpcy5vcGVuUG9wdXAodHJnLnNlY29uZGFyeVBvcHVwKTsNCgkJCX0NCgkJCWVsc2UgaWYgKCJwcmVmIiBpbiB0cmcgJiYgdHJnLnByZWYudXNlcikNCgkJCQlwcmVmcy5jbGVhclVzZXJQcmVmKHRyZy5wcmVmLnByZWYpLA0KCQkJCXRoaXMubWF5YmVSZSh0cmcpOw0KCQkJZS5wcmV2ZW50RGVmYXVsdCgpOw0KCQl9LA0KCQljbGljayhlKSB7DQoJCQlpZiAoZS5idXR0b24pIHJldHVybjsNCgkJCXZhciB0cmcgPSBlLnRhcmdldCwge3ByZWZ9ID0gdHJnOw0KCQkJaWYgKCFwcmVmIHx8ICEoIm5vQWx0IiBpbiBwcmVmKSkgcmV0dXJuOw0KDQoJCQlpZiAocHJlZi52YWwgPT0gcHJlZi51c2VyQ2hvaWNlKQ0KCQkJCWlmIChwcmVmLm5vQWx0KSByZXR1cm47DQoJCQkJZWxzZSAgcHJlZi5zZXQocHJlZi5wcmVmLCBwcmVmLnVzZXJBbHQpOw0KCQkJZWxzZQ0KCQkJCXByZWYuc2V0KHByZWYucHJlZiwgcHJlZi51c2VyQ2hvaWNlKTsNCgkJCXRoaXMubWF5YmVSZSh0cmcpOw0KCQl9DQoJfTsNCn0pOw==
Отсутствует
Dumby ещё просьба по QuickSettings - сделать константу в коде, которая управляет скрытием меню после клика.
Например const HideMenu = 1; // автоскрывать после клика…
Может ещё константу для отключения default иконок сделаете ?
Чтобы иконки были как раньше, только на пунктах меню, в которых прописано userChoice: значение по-умолчанию.
Отредактировано Dobrov (15-08-2020 15:33:46)
Отсутствует
Dumby
Сделал так: если userChoice отсутствует, то клик не делает ничего,
иначе — переключает на userChoice, а если текущее значение
уже совпадает с userChoice, тогда переключает на userAlt, если таковой имеется
Все верно, я почти так и писал. Переключение на userChoice из любого отличного значения это уже вами добавленный бонус.
Заметил, что в каждом(!) pref'е, в конце,
продублировано имя настройки, чтобы оно отображалось в тултипе.
Показалось похожим на концепцию, поэтому поудалял их все, а отображение
имени настройки в тултипе добавил в код.
Тоже верно. Тултип никому не мешает, но зато всегда можно увидеть реальный преф скрытый под заголовком.
Ну и оставшиеся пустые "" под accesskey тоже удалил.
Я ими не пользуюсь. Возможно они тут работают, но я уже привык, что, как правило, они полностью неработоспособны, то ли с неанглийскими, то ли с измененными раскладками.
" & > — которые там прописались, как-то
Из-за перевода? Как их увидеть? Если об этом речь.
node.style.removeProperty("color"), и node.style.setProperty("color", "maroon", "important");
Отредактировано _zt (15-08-2020 17:25:31)
Отсутствует
Dobrov
Просто удалите иконки, приведите соответствующие строки к такому виду:
Отредактировано _zt (15-08-2020 18:27:24)
Отсутствует
Добрый день. Посмотрите пожалуйста код для FF71 "Удалить скролл" . Работал нормально , но после моих переделок, перестал. Какой код конфликтует не нашел. Возможно изменить этот или добавить код , устанавливающий приоритет над всеми другими кодами.
/* Scrollbar hidden / hide scrollbars totally */ //@-moz-document url("https://yandex.ru/"), url("https://www.yandex.ru/") { /* Disable scrollbar Firefox только yandex.ru*/ @-moz-document url-prefix() { /* Disable scrollbar Firefox */ html{ scrollbar-width: none; } } body { margin: 0; /* remove default margin */ scrollbar-width: none; /* Also needed to disable scrollbar Firefox */ overflow-y: scroll; }
Вопрос снимается ,разобрался.
Отредактировано Duche (16-08-2020 13:22:43)
Отсутствует
_zt
Из-за перевода? Как их увидеть? Если об этом речь.
Не-не, увидеть очень просто: если открыть во вкладке base64 адрес с кодом
из этого поста, и приглядеться к содержимому, то видно, что оно словно
пропущено через подготовщик для XML. Самое заметное — " вместо кавычек.
Можно удалить, ничего не поломав?
Думаю да, на эти строки ничего не завязано, закомментировал.
Согласен с Dobrov, быстрое переключение "скрывать"/"не скрывать" меню после клика, тут не помешало бы. Для тестов удобнее как сейчас, а при постоянном использовании нескрываемое меню будет отвлекать.
А интересно, нельзя ли эту опцию во вторичное меню вывести? ) Например, добавлением этой настройки в about:config и последующем ее чтением.
OK, попробую добавить во вторичное меню.
Сам этот пункт, при переключении, закрытие меню не вызывает (фишка такая).
Предусмотрено не закрывать, если зажат Ctrl.
... return { label: "Quick toggle", id: "QuickToggleAboutConfigSettings", localized: false, image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFPSURBVDhPnVPNSsNAEJ5tamnBk+A7BMEcikohp/gi9i18nRafQoT00kK16tnn8CJo4vp9m5m41eSgH0zmd3d+diJ/gfdedvl0QW7k1PcLwem+3TjowZagK+Nn6yc3gNCJ+LCCh9LzzTMdqeoNbkQSFZmpJLGCW5Gx2hZaQahMbZ52VuDSfHpnAVJXOb4FKzianbzCXiLrHLYl5C3t5NTRwtxaKJxUTZ/JcOTr6q2Rxwf0aVb2/hLs4KqL3Isckz/mmSdRRksjyg+z7IM6LzDCBfuvAEOJmIKBOqAWmo1YodxLlQNsyO0rsIV/AZM+JGc2a4GgzhZ2p9mFmrpboCMqNYBDdMlwompoTWN6F2nFT5hBXb0PEpmo/Gk+oH+RrqNZINPeIlnZViV1jQuLFJQuWGB0gJdwgShvqdPXZv6J+F/QS7oXqQ9xBTFZ5oa8fAGs9fed5YhPSwAAAABJRU5ErkJggg==", onCreated(btn) { btn.setAttribute("image", this.image); var doc = btn.ownerDocument; btn.btn = true; btn.domParent = null; btn.popups = new btn.ownerGlobal.Array(); this.createPopup(doc, btn, "primary", primary); this.createPopup(doc, btn, "secondary", secondary); this.createCloseMenusOption(doc, btn); btn.linkedObject = this; for(var type of ["command", "contextmenu"]) btn.setAttribute("on" + type, `linkedObject.${type}(event)`); }, createPopup(doc, btn, name, data) { var popup = doc.createElementNS(xul_ns, "menupopup"); var prop = name + "Popup"; btn.popups.push(btn[prop] = popup); popup.id = this.id + "-" + prop; for (var type of ["popupshowing", "click"]) popup.setAttribute("on" + type, `parentNode.linkedObject.${type}(event)`); for(var obj of data) popup.append(this.createElement(doc, obj)); btn.append(popup); }, map: {b: "Bool", n: "Int", s: "String"}, createElement(doc, obj) { if (!obj) return doc.createElementNS(xul_ns, "menuseparator"); var pref = doc.ownerGlobal.Object.create(null), node, img, bool; for(var [key, val] of Object.entries(obj)) { if (key == "pref") { var [apref, lab, akey, ttt] = val; pref.pref = apref; pref.lab = lab || apref; if (ttt) pref.ttt = ttt; } else if (key == "image") img = val, pref.img = true; else if (key != "values") pref[key] = val; else pref.hasVals = true; } var type = prefs.getPrefType(pref.pref); var str = this.map[type == prefs.PREF_INVALID ? obj.values ? (typeof obj.values[0][0])[0] : "b" : type == prefs.PREF_BOOL ? "b" : type == prefs.PREF_INT ? "n" : "s" ]; pref.get = prefs[`get${str}Pref`]; pref.set = prefs[`set${str}Pref`]; node = doc.createElementNS(xul_ns, "menu"); node.className = "menu-iconic"; node.setAttribute("closemenu", "none"); img && node.setAttribute("image", img); akey && node.setAttribute("accesskey", akey); (node.pref = pref).vals = doc.ownerGlobal.Object.create(null); this.createRadios(doc, str.startsWith("B") && !pref.hasVals ? [[true, "true"], [false, "false"]] : obj.values, node.appendChild(doc.createElementNS(xul_ns, "menupopup")) ); if ("userChoice" in obj) pref.noAlt = !("userAlt" in obj); return node; }, createCloseMenusOption(doc, btn) { var pn = this.closePref = "QuickToggleAboutConfigSettings.closeMenus"; var data = [null, { pref: [pn, "Закрывать меню этой кнопки"], values: [[true, "Да"], [false, "Нет"]] }]; var setCloseMenus = e => { e.stopPropagation(); var trg = e.target, {pref, val} = trg, updPopup = true, clear; switch(e.type) { case "command": pref = (trg = trg.closest("menu")).pref; updPopup = false; break; case "click": if (e.button) return; break; case "contextmenu": e.preventDefault(); clear = pref; } if (!pref) return; if (clear) prefs.clearUserPref(pn); else if (!updPopup && val === pref.val) return; else pref.set(pn, val !== undefined ? val : !pref.val); this.upd(trg); updPopup && this.popupshowing(null, trg.querySelector("menupopup")); } (this.createCloseMenusOption = (doc, btn) => { for(var obj of data) btn.secondaryPopup.append(this.createElement(doc, obj)); var m = btn.secondaryPopup.lastChild; m.style.cssText = "fill: lightblue !important; list-style-image: url(chrome://browser/skin/menu.svg) !important;"; m.setAttribute("oncommand", "setCloseMenus(event)"); m.onclick = m.oncontextmenu = m.setCloseMenus = setCloseMenus; })(doc, btn); }, UserChoiceImg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACRUlEQVR42qWTS2gTQRjH/zPJZo2BDfgkB62vYg5CjQdvRUE8WB8HKyahYotIQQOeFKGCF7EgvQlBqOCjWFKlevBRDyL4uHloLXhYqWJroaEqlETSptndGb+ZPDH0ojN8O8vA98vv+/Itw38u1nSRYRE6UhKyg4FF1R292/Q+xhhLi4TIrgjgIzwe4MbgmR2nrZMtxxEN63zYORuPZp7gzpehvCu9XjfuPmwCUHIiEtw4fK89zVvD2+FHAD56quXBpV3CVO4ret6nxHzxZxdBRuqADCKmz7RHD9y2tlmbYbBVfwE8DXBkEd/y39H5+mze8ZyoSIpsFXC9u/VE3/ldpyg5AAMEoJMTQi2hANKBgyKdy0h/eoChqcf9MimvVAHjd/fdiG0NRwgQpDAp1agBpDZwdHKJLKZzc+h5e3kCSexh5c5j8fmhW0HGpNZXFkqfsQpAKgcFKGmAlAxHXp5bkkmsrhosjh4cCIJ5pG5qfQXgtMslqO1qgEMWTPrR+eriEhoA4wN7L8TWh0KVXzfgY2RQAUjVBenWLH4UCrj04Wa9BNXEo5va+w63xCiJ6WRVP2MVgNQIgjgEA17MTODZ7Lt+AtSaGDG4377a1m2FAkKrc11/dUwIID1dSKHEcW3yft4RbpR6kK1PYgaJtaY1nNp5jIeMsjKNbs1AWRUcjvTnp2Kh9LtLJGTDINUhcTIZ3L+hzdq9ZgvWmSF9/Wu5gI8L03gzP5l3hddL/3/zKDdA9MdE0UERrdzaFGMUaap75Y/pX9Yfap76EQYaCeEAAAAASUVORK5CYII=", notUserChoiceImg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACNUlEQVR42qXTT2jTUBwH8G9e0ta2ks5ND0Ww/qX1oGyevEwQnOBA6EHXwLwoUh3eRGRs501RPE6xgp6KrexQECZY8DBPXmbRS4Z/K0gRtmmDa2yb5PlLX7p2Gwpi4EfCy8sn3/dPwn9e0saGnCRF6XYFnA9DkhKtRs51ep6jmtEcp/JHIM9Yivl9mf0XNDV2Ngn1YLzVxdB1lJ8U8P5hzuCWnR6xrPwmIM8kLRjdkT326BaLHNgLKAFA9ouXdhOw6qi++4j589cd89vSaMqyc2sAPUXlgF8fyt9WI3t2Av4w4NsCMJ8AHAKav6hqqH76iuLINcNuNhOawyttYCp+7tRE/6XT9GFQAG4CpniATQkIaNQIMVG6/xSL2WfTGueTbWDh5L2rA9t29QGBrQQEPUDuAuoEmFSr+P5lGc8v33mtAUfaQO3M4/GgDOoYCIkUin8D0BDDoBQ2ZMxqN0wCQh0gMxaUnYb4uzt+dwIZ8wBHTGQbYAHMpu+uAxaGxpMDvSr3AHcFaAIlD+BtoN6ag5WqhOLNwrohTMWPH5roP7pdLIwb3wW6EziWGAZhpVdLWHzxdpqAyc4yKrJ+4uKg2oMV+lgRK9CdwAVsG1WpF8UH84Zt2QkCKmsbiRAtFAllB5OHWQ9fpr81OwlcgBL9kPrwsvDGMQ1zNMV5ZyN1ISlZYZl9/TE1tjuMSFgA1VWO8uef+FAqG47tpFMcm7dyFyIOEzBMlfCadao5qhk39l9P479evwFbiOcRSXKueAAAAABJRU5ErkJggg==", UserAltImg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIfSURBVDhPpVM9b9NQFD02cSKKFVGKIFFREFsmFiCA1AEQQrQjC0gssLCkC0jJj0iFWFoGdiT4Ay0SEmJBhPI5FBokikL4SCC0Te2UxInt13Mdu1CVrVc6713fe86x/T6w09DCeTNKJ7Q0pzyUmoCmZYOiUhXms8RMcd6vB7UwthhM5fTLWix2L3PmYjKdOwdz9DDFGtr1KuovnqD29JGlfO9Goew9DCV/DaZy2pXE8PD9Y/mbupk6xE6cVWPQhEujHo2+4fXdO76ztnq1UPYfSCcwKB1HWjeMyunCraSZOsDqbkBPsBOTNoMGvkOTLto/f+F56bble262OK/qesiYzIydTJojFLjrgEe4bcIOEdXWYe6LITN2KgmFSRFGBuPpo0eAngX0SexTJHD5LOgLpEZTcgKuUuMijAyy5l7+r0NSb21g5LQI5gGYSy2AjYBLjQyRAUniTnJXsBoayBzm3RBBndwwIoOK3fgNdIREQYCV/0DqLdiNZqCRITKYayx85RfQuUNiZ3k7IgO+vfGeXGpkiAyma++WLHtZhZ8o5H/FEVpos1V7u8TFwLQId8nw+Afa51Oq2vyycmlk9KCW0GXFZeu63IUO8z88Bx5s28SbuUXfddzrxVcobxpI0GTh7H734/dPzQt9d0/CGBpCPB7nbhmwbAPVxR4+PPtsuU7/WuElth/lKORUcsoTE8TgMg0WbJaY4Zu3XKYdBrABARUk+ls4DfQAAAAASUVORK5CYII=", upd(node) { var {pref} = node, def = false, user = false, val; if (prefs.getPrefType(pref.pref) != prefs.PREF_INVALID) { var pn = pref.pref; try {val = pref.defVal = db[pref.get.name](pn); def = true} catch(ex) {def = false;} var user = prefs.prefHasUserValue(pn); if (user) try {val = pref.get(pn, undefined);} catch(ex) {} } if (val == pref.val && def == pref.def && user == pref.user) return; pref.val = val; pref.def = def; pref.user = user; var exists = def || user; var ttt = exists ? val : "Этого префа не существует"; if (ttt === "") ttt = "[ empty_string ]"; ttt += "\n" + pref.pref; if (pref.ttt) ttt += "\n" + pref.ttt; node.tooltipText = ttt; var img, alt = "userAlt" in pref && val == pref.userAlt; if (alt) img = this.UserAltImg; if ("userChoice" in pref) if (val == pref.userChoice) //node.style.removeProperty("color"), img = this.UserChoiceImg; else { //node.style.setProperty("color", "maroon", "important"); if (!alt) img = this.notUserChoiceImg; } if (!pref.img) img ? node.setAttribute("image", img) : node.removeAttribute("image"); user ? node.style.setProperty("font-style", "italic", "important") : node.style.removeProperty("font-style"); var {lab} = pref; if (exists && pref.hasVals) { if (val in pref.vals) var sfx = pref.vals[val] || val; else var sfx = user ? "Другое" : "По умолчанию"; lab += ` — "${sfx}"`; } node.setAttribute("label", lab); }, createRadios(doc, vals, popup) { for(var arr of vals) { if (!arr) { popup.append(doc.createElementNS(xul_ns, "menuseparator")); continue; } var [val, lab, key, ttt] = arr; var menuitem = doc.createElementNS(xul_ns, "menuitem"); menuitem.setAttribute("type", "radio"); menuitem.setAttribute("closemenu", "none"); menuitem.style.setProperty("font-style", "italic", "important"), menuitem.setAttribute("label", popup.parentNode.pref.vals[val] = lab); key && menuitem.setAttribute("accesskey", key); var tip = menuitem.val = val; if (ttt) tip += "\n" + ttt; menuitem.tooltipText = tip; popup.append(menuitem); } }, openPopup(popup) { var btn = popup.parentNode; if (btn.domParent != btn.parentNode) { btn.domParent = btn.parentNode; var pos; if (btn.matches(".widget-overflow-list > :scope")) pos = "after_start"; else var win = btn.ownerGlobal, {width, height, top, bottom, left, right} = btn.closest("toolbar").getBoundingClientRect(), pos = width > height ? `${win.innerHeight - bottom > top ? "after" : "before"}_start` : `${win.innerWidth - right > left ? "end" : "start"}_before`; for(var p of btn.popups) p.setAttribute("position", pos); } popup.openPopup(btn); }, maybeRestart(node, conf) { var msgRest = "Перезапустить браузер?", msgAbort = "Запрос на выход отменен."; if (pv >= 77) { var title = node.closest("toolbarbutton").label; var pp = domWin => Services.prompt.wrappedJSObject.pickPrompter({ domWin, modalType: Ci.nsIPrompt.MODAL_TYPE_WINDOW }); var confirm = win => pp(win).confirm(title, msgRest); var alert = win => pp(win).alert(title, msgAbort); } else { var confirm = win => win.confirm(msgRest); var alert = win => win.alert(msgAbort); } return (this.mayBeRestart = (node, conf) => { var win = node.ownerGlobal; if (conf && !confirm(win)) return; if (win.BrowserUtils.restartApplication() === false) alert(win); else return true; })(node, conf); }, regexpRefresh: /^(?:view-source:)?(?:https?|ftp)/, maybeRe(node, fe) { var {pref} = node; if ("restart" in pref) { if (this.maybeRestart(node, pref.restart)) return; } else this.popupshowing(fe, node.parentNode); if ("refresh" in pref) { var win = node.ownerGlobal; if (this.regexpRefresh.test(win.gBrowser.currentURI.spec)) pref.refresh ? win.BrowserReloadSkipCache() : win.BrowserReload(); } }, maybeClosePopup(e, trg) { !e.ctrlKey && prefs.getBoolPref(this.closePref, undefined) && trg.parentNode.hidePopup(); }, command(e) { var trg = e.target; if (trg.btn) return this.openPopup(trg.primaryPopup); var menu = trg.closest("menu"), newVal = trg.val; this.maybeClosePopup(e, menu); if (newVal != menu.pref.val) menu.pref.set(menu.pref.pref, newVal), this.maybeRe(menu, true); }, popupshowing(e, trg = e.target) { if (trg.state == "closed") return; if (trg.id) { for(var node of trg.children) { if (node.nodeName.endsWith("r")) continue; this.upd(node); !e && node.open && this.popupshowing(null, node.querySelector("menupopup")); } return; } var {pref} = trg.closest("menu"), findChecked = true; var findDef = "defVal" in pref; var checked = trg.querySelector("[checked]"); if (checked) { if (checked.val == pref.val) { if (findDef) findChecked = false; else return; } else checked.removeAttribute("checked"); } if (findDef) { var def = trg.querySelector("menuitem:not([style*=font-style]"); if (def) if (def.val == pref.defVal) { if (findChecked) findDef = false; else return; } else def.style.setProperty("font-style", "italic", "important"); } for(var node of trg.children) if ("val" in node) { if (findChecked && node.val == pref.val) { node.setAttribute("checked", true); if (findDef) findChecked = false; else break; } if (findDef && node.val == pref.defVal) { node.style.removeProperty("font-style"); if (findChecked) findDef = false; else break; } } }, contextmenu(e) { var trg = e.target; if (trg.btn) { if (e.ctrlKey || e.shiftKey) return; if (e.detail == 2) return trg.secondaryPopup.hidePopup(); this.openPopup(trg.secondaryPopup); } else if ("pref" in trg) { this.maybeClosePopup(e, trg); if (trg.pref.user) prefs.clearUserPref(trg.pref.pref), this.maybeRe(trg); } e.preventDefault(); }, click(e) { if (e.button) return; var trg = e.target, {pref} = trg; if (!pref) return; this.maybeClosePopup(e, trg); if (!("noAlt" in pref)) return; if (pref.val == pref.userChoice) if (pref.noAlt) return; else pref.set(pref.pref, pref.userAlt); else pref.set(pref.pref, pref.userChoice); this.maybeRe(trg); } }; });
Отсутствует
Dumby
" вместо кавычек
Делал первым попавшимся онлайн-сервисом, теперь нашел плагин для npp++, в нем такого нет. Учту на будущее.
Спасибо. Получилась отличное меню в едином стиле, с традиционной индикацией состояния параметров и всякими дополнительными плюшками. Так намного лучше воспринимается, чем все вместе в стилях шрифта.
Отсутствует
Dumby
Подправьте пожалуйста, если возможно, этот скрипт для 79+
javascript.options.asyncstack — true в 79+ теперь по умолчанию, но никак не влияет на нужное поведение скрипта.
Add: т.е. в любом случае, через звёздочку или меню страницы, сохранение идёт в меню закладок. Спасибо.
Отредактировано sandro79 (17-08-2020 00:33:50)
Отсутствует
Dumby QuickSettings не работает на Basilisk (старый код работал)
можно сделать отдельную версию или адаптировать новый код для совместимости с Basilisk ?
Vitaliy V. а как отлаживать код для user_chrome_files без перезагрузки браузера ?
или это уже есть ? То есть в [CB] я выбираю: Редактировать код и изменения сразу начинают работать.
Как сделать, чтобы после правки скриптов user_chrome_files изменённые скрипты перезагружались автоматически ?
Отсутствует
javascript.options.asyncstack — true в 79+ теперь по умолчанию
Да, вижу (bug). Поставили true и выключили (псевдопарадокс).
На сей раз предлагать включить обратно не стану,
поскольку запугали, что мол это не по-перформансу.
Может тогда попробуй ещё более грубое
try {((obj, key) => { var funcs = [eval(`(${obj[key]})`.replace(" ", " function ").replace("unfiledGuid", "menuGuid")), obj[key]]; obj[key] = (...args) => funcs[+Components.stack.formattedStack.includes("nsContextMenu")](...args); })(PlacesCommandHook, "bookmarkPage");} catch(ex) {Cu.reportError(ex);}
QuickSettings не работает на Basilisk
Ага, на Firefox 2.0.0.8 тоже не работает.
А вообще который? Я вот попробовал поставить (как кнопку) тот,
что последний для _zt на Basilisk 2020.08.05, и, не скажу чтобы
прямо всё проверил, но на первый взгляд выглядит вполне рабочей.
Но засчёт того, что там (в кнопке) нет строковых настроек.
Если «не работает» в этом смысле, тогда попробуй заменить свойство map
на такой геттер
... //map: {b: "Bool", n: "Int", s: "String"}, get map() { if (!prefs.getStringPref) { var ssi = Components.interfaces.nsISupportsString; var gs = (o, name) => o.getComplexValue(name, ssi).data; var ss = (o, name, val) => { var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(ssi); str.data = val; o.setComplexValue(name, ssi, str); } var p = {...prefs}, d = {...db}; [[p, prefs], [d, db]].forEach(([o, b]) => { o.getStringPref = function getStringPref(name) {return gs(b, name);} o.setStringPref = function setStringPref(name, val) {ss(b, name, val);} }); prefs = p; db = d; } delete this.map; return this.map = {b: "Bool", n: "Int", s: "String"}; },
Отсутствует
Как сделать, чтобы после правки скриптов user_chrome_files изменённые скрипты перезагружались автоматически ?
Не к чему это усложнять, к тому же это нужно в каждом куске коде предусматривать методы для инициализации и разрушения,
почти на каждый листенер, обсервер, добавленный элемент и т.д. лепить addDestructor() как в CB... Кроме того есть инструменты браузера.
Отсутствует
Не к чему это усложнять … Кроме того есть инструменты браузера.
А как после правки user_chrome_files скриптов перезагрузить весь их код кнопкой или HotKey ?
То есть неавтоматически, но без перезапуска браузера ?
Отсутствует
Общий вопрос - нужна кнопка, которая откроет html-файл, расположенный например, в profile/chrome
Нужно открыть справку в новой вкладке, а по повторному клику закрыть (если во вкладке открыта именно htm-справка)
В html будет справка по горячим клавишам, использованию функций кнопок (в моём профиле их много)…
Отсутствует
Общий вопрос - нужна кнопка, которая откроет html-файл, расположенный например, в profile/chrome
Нужно открыть справку в новой вкладке, а по повторному клику закрыть (если во вкладке открыта именно htm-справка)
Звучит как-то так
this._handleClick = () => { var fileName = "help.html"; var params = { inBackground: false, relatedToCurrent: true }; var file = Services.dirsvc.get("UChrm", Ci.nsIFile); file.append(fileName); var uri = Services.io.newFileURI(file); var open = window.openTrustedLinkIn || openUILinkIn; (this._handleClick = () => uri.equals(gBrowser.currentURI) ? gBrowser.removeCurrentTab() : open(uri.spec, "tab", params) )(); }
Отсутствует