CHAT_OUTPUT_BEGIN
COMMAND_ID=SUPPORT-260909-GRAM-XF-FLEET-FOOTER-UI-AUDIT-085R2
STATUS=FAIL
RC=3
HOST=pve01
MODE=read-only
COMPONENT=gram-support-fleet-footer-ui-readonly-audit-r2
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=8dcee3ee82375b43608e16025232e1a2f9b20cec49465145bfb5820a53a98f3f
DUPLICATE_FAILED_COMMAND_BLOCKED=false
EXECUTION_STARTED=true
CHANGE_DECLARED=false
RESULT_CONTRACT_VALID=true
RESULT_CONTRACT_STATUS=NOT_APPLICABLE
RESULT_CONTRACT_ERROR=NONE
COMMAND_RC=3
CHANGES_MADE=false
ROLLBACK_STARTED=false
ROLLBACK_RESTORED=null
MUTATION_OUTCOME=NO_MUTATION
SANITIZED=yes
SECRETS_INCLUDED=no
PRIVATE_ADDRESSES_INCLUDED=no
RAW_EVIDENCE_SHA256=09d495acea9116d2bbc3431d7af60e65d81c1198066db419f2c86acd054ca8ca
SANITIZED_OUTPUT_SHA256=09d495acea9116d2bbc3431d7af60e65d81c1198066db419f2c86acd054ca8ca
OUTPUT_BEGIN
GRAM_FOOTER_AUDIT_BEGIN
COMMAND_ID=SUPPORT-260909-GRAM-XF-FLEET-FOOTER-UI-AUDIT-085R2
GRAM_FOOTER_SOURCE={"addon_candidates":[],"branch":"main","clean":true,"exists":true,"git":true,"head":"0910c8f60796a783ca11af69b1c5ed775ae79ee5","repo":"/root/gram-support","selected_addon_dir":null,"tracked_count":3,"tracked_relevant":["release/FIX4_SHA256.txt","release/GRAM_SUPPORT_FIX4_FINAL.zip"],"ui_hits":[]}
GRAM_FOOTER_CLUSTER={"160":{"name":"forum-prod","node":"pve02","status":"running"},"210":{"name":"newfi-prod","node":"pve01","status":"running"},"211":{"name":"newfi-staging","node":"pve03","status":"running"}}
GRAM_FOOTER_VM160={"host":"forum-prod","sites":[{"name":"codevipe","php_rc":0,"php_stderr":"","root":"/var/www/forums/codevipe/public","services":{"mariadb":true,"nginx":true,"php8.3-fpm":true},"state":{"addon":{"active":1,"addon_id":"Gram/Support","is_processing":0,"last_pending_action":null,"title":"Gram Support","version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"addon_schema":["addon_id","title","version_string","version_id","json_hash","active","is_legacy","is_processing","last_pending_action"],"errors":{"count":0,"max_id":0},"extra_less_support_hits":[],"ok":true,"options":{"boardActive":"1","boardTitle":"\u0424\u043e\u0440\u0443\u043c CodeVipe","boardUrl":"https://codevipe.ru","defaultStyleId":"2"},"root":"/var/www/forums/codevipe/public","styles":[{"parent_id":0,"style_id":1,"title":"Default style","user_selectable":0},{"parent_id":1,"style_id":2,"title":"Default style 2","user_selectable":1}],"template_inventory":[{"addon_id":"Gram/Support","bytes":136,"sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}],"template_mod_schema":["modification_id","addon_id","type","template","modification_key","description","execution_order","enabled","action","find","replace"],"template_mods":[{"addon_id":"Gram/Support","enabled":1,"execution_order":100,"find":{"bytes":7,"sample":"</body>","sha256":"124207d84bdc8a107cbcc04212a091e85157e09d7bf208f7afb4839498fef083"},"modification_key":"gram_support_launcher","replace":{"bytes":55,"sample":"<xf:include template=\"gram_support_launcher\" />\n</body>","sha256":"076cbf5ada30272d9b9bb748bd2faf7fe8849cbcd0c4da698939e21cb1f8e214"},"template":"PAGE_CONTAINER","type":"public"}],"template_schema":["template_id","type","title","style_id","template","template_parsed","addon_id","version_id","version_string","last_edit_date"],"ui_templates":[{"addon_id":"Gram/Support","bytes":136,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_alert_ticket_event', {"}],"sample":"<xf:macro id=\"content\">\n\t{{ phrase('gram_support_alert_ticket_event', {\n\t\t'public_ref': $alert.extra_data.public_ref\n\t}) }}\n</xf:macro>\n","sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"hit_lines":[{"line":1,"text":".gramSupport-launcher"},{"line":11,"text":".gramSupport-messageMeta"},{"line":18,"text":".gramSupport-message--internal"},{"line":26,"text":".gramSupport-launcher"},{"line":34,"text":".gramSupport-messageBody"}],"sample":".gramSupport-launcher\n{\n\tposition: fixed;\n\tright: 18px;\n\tbottom: 18px;\n\tz-index: 500;\n\tborder-radius: 999px;\n\tbox-shadow: 0 6px 24px rgba(0, 0, 0, .22);\n}\n\n.gramSupport-messageMeta\n{\n\tfont-size: 12px;\n\topacity: .7;\n\tmargin-bottom: 6px;\n}\n\n.gramSupport-message--internal\n{\n\tborder-left: 4px solid currentColor;\n\topacity: .9;\n}\n\n@media (max-width: 650px)\n{\n\t.gramSupport-launcher\n\t{\n\t\tright: 12px;\n\t\tbottom: 12px;\n\t\tmax-width: calc(100vw - 24px);\n\t}\n}\n\n.gramSupport-messageBody\n{\n\twhite-space: pre-wrap;\n\toverflow-wrap: anywhere;\n}\n","sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>"},{"line":2,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">"},{"line":7,"text":"<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\""},{"line":10,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />\n\n<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\"\n\t\t\t\tautocomplete=\"off\" />\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />\n\t</div>\n</xf:form>\n","sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">"},{"line":15,"text":"<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>"}],"sample":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t<xf:else />\n\t\t\t\t<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">"},{"line":12,"text":"label=\"{{ phrase('gram_support_category') }}\">"},{"line":13,"text":"<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>"},{"line":14,"text":"<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>"},{"line":15,"text":"<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>"},{"line":16,"text":"<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>"},{"line":19,"text":"label=\"{{ phrase('gram_support_subject') }}\" />"},{"line":21,"text":"label=\"{{ phrase('gram_support_description') }}\" />"},{"line":23,"text":"label=\"{{ phrase('gram_support_screenshot_optional') }}\" />"},{"line":29,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:textboxrow name=\"email\" type=\"email\" required=\"required\"\n\t\t\t\t\tlabel=\"{{ phrase('email') }}\" />\n\t\t\t</xf:if>\n\t\t\t<xf:selectrow name=\"category\" required=\"required\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_category') }}\">\n\t\t\t\t<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>\n\t\t\t\t<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>\n\t\t\t\t<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>\n\t\t\t\t<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>\n\t\t\t</xf:selectrow>\n\t\t\t<xf:textboxrow name=\"subject\" maxlength=\"255\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_subject') }}\" />\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"8\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_description') }}\" />\n\t\t\t<xf:uploadrow name=\"screenshot\" accept=\".gif,.jpeg,.jpg,.jpe,.png,.webp\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_screenshot_optional') }}\" />\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:captcharow label=\"{{ phrase('verification') }}\"\n\t\t\t\t\thint=\"{{ phrase('required') }}\" force=\"true\" />\n\t\t\t</xf:if>\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />\n\t</div>\n</xf:form>\n","sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<p>{{ phrase('gram_support_save_access_code') }}</p>"},{"line":17,"text":"<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>"}],"sample":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<p>{{ phrase('gram_support_save_access_code') }}</p>\n\t\t\t\t<code class=\"js-copyTarget\">{{ $accessCode }}</code>\n\t\t\t\t<xf:button icon=\"copy\"\n\t\t\t\t\tdata-xf-init=\"copy-to-clipboard\"\n\t\t\t\t\tdata-copy-target=\".js-copyTarget\"\n\t\t\t\t\tclass=\"button--link is-hidden\">{{ phrase('copy') }}</xf:button>\n\t\t\t</div>\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"hit_lines":[{"line":1,"text":"<xf:if is=\"$xf.options.gramSupportSiteId\">"},{"line":2,"text":"<a class=\"gramSupport-launcher button button--primary\""},{"line":3,"text":"href=\"{{ link('support/create') }}\""},{"line":4,"text":"aria-label=\"{{ phrase('gram_support_open_support') }}\">"},{"line":5,"text":"{{ phrase('gram_support_open_support') }}"}],"sample":"<xf:if is=\"$xf.options.gramSupportSiteId\">\n\t<a class=\"gramSupport-launcher button button--primary\"\n\t\thref=\"{{ link('support/create') }}\"\n\t\taria-label=\"{{ phrase('gram_support_open_support') }}\">\n\t\t{{ phrase('gram_support_open_support') }}\n\t</a>\n</xf:if>\n","sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">"}],"sample":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"hit_lines":[{"line":3,"text":"const OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';"},{"line":4,"text":"const STATIC_CACHE = 'gram-support-staff-static-v1';"},{"line":18,"text":".filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)"},{"line":36,"text":"// SECURITY: all support/ticket/account/admin-like content is network-only."},{"line":40,"text":"url.pathname.startsWith('/support/') ||"}],"sample":"'use strict';\n\nconst OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';\nconst STATIC_CACHE = 'gram-support-staff-static-v1';\n\nself.addEventListener('install', event => {\n\tevent.waitUntil(\n\t\tcaches.open(STATIC_CACHE)\n\t\t\t.then(cache => cache.addAll([OFFLINE_URL]))\n\t\t\t.then(() => self.skipWaiting())\n\t);\n});\n\nself.addEventListener('activate', event => {\n\tevent.waitUntil(\n\t\tcaches.keys().then(keys =>\n\t\t\tPromise.all(keys\n\t\t\t\t.filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)\n\t\t\t\t.map(key => caches.delete(key))\n\t\t\t)\n\t\t).then(() => self.clients.claim())\n\t);\n});\n\nself.addEventListener('fetch', event => {\n\tconst request = event.request;\n\tif (request.method !== 'GET') {\n\t\treturn;\n\t}\n\n\tconst url = new URL(request.url);\n\tif (url.origin !== self.location.origin) {\n\t\treturn;\n\t}\n\n\t// SECURITY: all support/ticket/account/admin-like content is network-only.\n\t// Never cache HTML/API responses that can contain ticket data, identities,\n\t// access state, internal notes, attachments or staff-only information.\n\tconst sensitive =\n\t\turl.pathname.startsWith('/support/') ||\n\t\turl.pathname.startsWith('/account/') ||\n\t\turl.pathname.startsWith('/admin.php') ||\n\t\trequest.headers.get('accept')?.includes('text/html');\n\n\tif (sensitive) {\n\t\tevent.respondWith(\n\t\t\tfetch(request, {cache: 'no-store'}).catch(() => {\n\t\t\t\tif (request.mode === 'navigate') {\n\t\t\t\t\treturn caches.match(OFFLINE_URL);\n\t\t\t\t}\n\t\t\t\tthrow new Error('OFFLINE_NETWORK_ONLY');\n\t\t\t})\n\t\t);\n\t\treturn;\n\t}\n\n\t// Same-origin static assets only; stale-while-revalidate.\n\tevent.respondWith(\n\t\tcaches.open(STATIC_CACHE).then(cache =>\n\t\t\tcache.match(request).then(cached => {\n\t\t\t\tconst network = fetch(request).then(response => {\n\t\t\t\t\tif (response.ok && response.type === 'basic') {\n\t\t\t\t\t\tcache.put","sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">"},{"line":14,"text":"<div class=\"gramSupport-messageMeta\">"},{"line":16,"text":"<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>"},{"line":18,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":29,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":41,"text":"<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":44,"text":"<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":45,"text":"<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes')\">"},{"line":47,"text":"<xf:option name=\"is_internal\" value=\"1\">{{ phrase('gram_support_internal_note') }}</xf:option>"},{"line":51,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"},{"line":55,"text":"<xf:form action=\"{{ link('support/staff/update', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":58,"text":"<xf:selectrow name=\"status\" value=\"{$ticket.status}\" label=\"{{ phrase('gram_support_status') }}\">"},{"line":64,"text":"label=\"{{ phrase('gram_support_assigned_user_id') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">\n\t\t\t\t\t\t{{ date_time($message.message_date) }}\n\t\t\t\t\t\t<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes","sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"hit_lines":[{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}"},{"line":12,"text":"<div class=\"block-row gramSupport-message\">"},{"line":13,"text":"<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>"},{"line":14,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":25,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":38,"text":"<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":42,"text":"label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":44,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"}],"sample":"<xf:title>{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}\n\t\t\t</div>\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row gramSupport-message\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:if is=\"$ticket.status != 'CLOSED'\">\n\t<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\"\n\t\t\t\t\tlabel=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t</div>\n\t\t\t<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />\n\t\t</div>\n\t</xf:form>\n</xf:if>\n","sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_registered', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_registered', {\n\t'public_ref': $ticket.public_ref\n}) }}\n","sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_guest', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_guest', {\n\t'public_ref': $ticket.public_ref,\n\t'access_url': $accessUrl\n}) }}\n","sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}]}},{"name":"dsmods","php_rc":0,"php_stderr":"","root":"/var/www/forums/dsmods/public","services":{"mariadb":true,"nginx":true,"php8.3-fpm":true},"state":{"addon":{"active":1,"addon_id":"Gram/Support","is_processing":0,"last_pending_action":null,"title":"Gram Support","version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"addon_schema":["addon_id","title","version_string","version_id","json_hash","active","is_legacy","is_processing","last_pending_action"],"errors":{"count":0,"max_id":0},"extra_less_support_hits":[],"ok":true,"options":{"boardActive":"1","boardTitle":"\u0421\u0435\u043a\u0440\u0435\u0442\u044b \u0438 \u043c\u043e\u0434\u044b Doom","boardUrl":"https://dsmods.ru","defaultStyleId":"2"},"root":"/var/www/forums/dsmods/public","styles":[{"parent_id":0,"style_id":1,"title":"Default style","user_selectable":0},{"parent_id":1,"style_id":2,"title":"Default style 2","user_selectable":1}],"template_inventory":[{"addon_id":"Gram/Support","bytes":136,"sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}],"template_mod_schema":["modification_id","addon_id","type","template","modification_key","description","execution_order","enabled","action","find","replace"],"template_mods":[{"addon_id":"Gram/Support","enabled":1,"execution_order":100,"find":{"bytes":7,"sample":"</body>","sha256":"124207d84bdc8a107cbcc04212a091e85157e09d7bf208f7afb4839498fef083"},"modification_key":"gram_support_launcher","replace":{"bytes":55,"sample":"<xf:include template=\"gram_support_launcher\" />\n</body>","sha256":"076cbf5ada30272d9b9bb748bd2faf7fe8849cbcd0c4da698939e21cb1f8e214"},"template":"PAGE_CONTAINER","type":"public"}],"template_schema":["template_id","type","title","style_id","template","template_parsed","addon_id","version_id","version_string","last_edit_date"],"ui_templates":[{"addon_id":"Gram/Support","bytes":136,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_alert_ticket_event', {"}],"sample":"<xf:macro id=\"content\">\n\t{{ phrase('gram_support_alert_ticket_event', {\n\t\t'public_ref': $alert.extra_data.public_ref\n\t}) }}\n</xf:macro>\n","sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"hit_lines":[{"line":1,"text":".gramSupport-launcher"},{"line":11,"text":".gramSupport-messageMeta"},{"line":18,"text":".gramSupport-message--internal"},{"line":26,"text":".gramSupport-launcher"},{"line":34,"text":".gramSupport-messageBody"}],"sample":".gramSupport-launcher\n{\n\tposition: fixed;\n\tright: 18px;\n\tbottom: 18px;\n\tz-index: 500;\n\tborder-radius: 999px;\n\tbox-shadow: 0 6px 24px rgba(0, 0, 0, .22);\n}\n\n.gramSupport-messageMeta\n{\n\tfont-size: 12px;\n\topacity: .7;\n\tmargin-bottom: 6px;\n}\n\n.gramSupport-message--internal\n{\n\tborder-left: 4px solid currentColor;\n\topacity: .9;\n}\n\n@media (max-width: 650px)\n{\n\t.gramSupport-launcher\n\t{\n\t\tright: 12px;\n\t\tbottom: 12px;\n\t\tmax-width: calc(100vw - 24px);\n\t}\n}\n\n.gramSupport-messageBody\n{\n\twhite-space: pre-wrap;\n\toverflow-wrap: anywhere;\n}\n","sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>"},{"line":2,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">"},{"line":7,"text":"<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\""},{"line":10,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />\n\n<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\"\n\t\t\t\tautocomplete=\"off\" />\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />\n\t</div>\n</xf:form>\n","sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">"},{"line":15,"text":"<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>"}],"sample":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t<xf:else />\n\t\t\t\t<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">"},{"line":12,"text":"label=\"{{ phrase('gram_support_category') }}\">"},{"line":13,"text":"<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>"},{"line":14,"text":"<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>"},{"line":15,"text":"<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>"},{"line":16,"text":"<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>"},{"line":19,"text":"label=\"{{ phrase('gram_support_subject') }}\" />"},{"line":21,"text":"label=\"{{ phrase('gram_support_description') }}\" />"},{"line":23,"text":"label=\"{{ phrase('gram_support_screenshot_optional') }}\" />"},{"line":29,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:textboxrow name=\"email\" type=\"email\" required=\"required\"\n\t\t\t\t\tlabel=\"{{ phrase('email') }}\" />\n\t\t\t</xf:if>\n\t\t\t<xf:selectrow name=\"category\" required=\"required\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_category') }}\">\n\t\t\t\t<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>\n\t\t\t\t<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>\n\t\t\t\t<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>\n\t\t\t\t<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>\n\t\t\t</xf:selectrow>\n\t\t\t<xf:textboxrow name=\"subject\" maxlength=\"255\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_subject') }}\" />\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"8\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_description') }}\" />\n\t\t\t<xf:uploadrow name=\"screenshot\" accept=\".gif,.jpeg,.jpg,.jpe,.png,.webp\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_screenshot_optional') }}\" />\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:captcharow label=\"{{ phrase('verification') }}\"\n\t\t\t\t\thint=\"{{ phrase('required') }}\" force=\"true\" />\n\t\t\t</xf:if>\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />\n\t</div>\n</xf:form>\n","sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<p>{{ phrase('gram_support_save_access_code') }}</p>"},{"line":17,"text":"<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>"}],"sample":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<p>{{ phrase('gram_support_save_access_code') }}</p>\n\t\t\t\t<code class=\"js-copyTarget\">{{ $accessCode }}</code>\n\t\t\t\t<xf:button icon=\"copy\"\n\t\t\t\t\tdata-xf-init=\"copy-to-clipboard\"\n\t\t\t\t\tdata-copy-target=\".js-copyTarget\"\n\t\t\t\t\tclass=\"button--link is-hidden\">{{ phrase('copy') }}</xf:button>\n\t\t\t</div>\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"hit_lines":[{"line":1,"text":"<xf:if is=\"$xf.options.gramSupportSiteId\">"},{"line":2,"text":"<a class=\"gramSupport-launcher button button--primary\""},{"line":3,"text":"href=\"{{ link('support/create') }}\""},{"line":4,"text":"aria-label=\"{{ phrase('gram_support_open_support') }}\">"},{"line":5,"text":"{{ phrase('gram_support_open_support') }}"}],"sample":"<xf:if is=\"$xf.options.gramSupportSiteId\">\n\t<a class=\"gramSupport-launcher button button--primary\"\n\t\thref=\"{{ link('support/create') }}\"\n\t\taria-label=\"{{ phrase('gram_support_open_support') }}\">\n\t\t{{ phrase('gram_support_open_support') }}\n\t</a>\n</xf:if>\n","sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">"}],"sample":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"hit_lines":[{"line":3,"text":"const OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';"},{"line":4,"text":"const STATIC_CACHE = 'gram-support-staff-static-v1';"},{"line":18,"text":".filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)"},{"line":36,"text":"// SECURITY: all support/ticket/account/admin-like content is network-only."},{"line":40,"text":"url.pathname.startsWith('/support/') ||"}],"sample":"'use strict';\n\nconst OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';\nconst STATIC_CACHE = 'gram-support-staff-static-v1';\n\nself.addEventListener('install', event => {\n\tevent.waitUntil(\n\t\tcaches.open(STATIC_CACHE)\n\t\t\t.then(cache => cache.addAll([OFFLINE_URL]))\n\t\t\t.then(() => self.skipWaiting())\n\t);\n});\n\nself.addEventListener('activate', event => {\n\tevent.waitUntil(\n\t\tcaches.keys().then(keys =>\n\t\t\tPromise.all(keys\n\t\t\t\t.filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)\n\t\t\t\t.map(key => caches.delete(key))\n\t\t\t)\n\t\t).then(() => self.clients.claim())\n\t);\n});\n\nself.addEventListener('fetch', event => {\n\tconst request = event.request;\n\tif (request.method !== 'GET') {\n\t\treturn;\n\t}\n\n\tconst url = new URL(request.url);\n\tif (url.origin !== self.location.origin) {\n\t\treturn;\n\t}\n\n\t// SECURITY: all support/ticket/account/admin-like content is network-only.\n\t// Never cache HTML/API responses that can contain ticket data, identities,\n\t// access state, internal notes, attachments or staff-only information.\n\tconst sensitive =\n\t\turl.pathname.startsWith('/support/') ||\n\t\turl.pathname.startsWith('/account/') ||\n\t\turl.pathname.startsWith('/admin.php') ||\n\t\trequest.headers.get('accept')?.includes('text/html');\n\n\tif (sensitive) {\n\t\tevent.respondWith(\n\t\t\tfetch(request, {cache: 'no-store'}).catch(() => {\n\t\t\t\tif (request.mode === 'navigate') {\n\t\t\t\t\treturn caches.match(OFFLINE_URL);\n\t\t\t\t}\n\t\t\t\tthrow new Error('OFFLINE_NETWORK_ONLY');\n\t\t\t})\n\t\t);\n\t\treturn;\n\t}\n\n\t// Same-origin static assets only; stale-while-revalidate.\n\tevent.respondWith(\n\t\tcaches.open(STATIC_CACHE).then(cache =>\n\t\t\tcache.match(request).then(cached => {\n\t\t\t\tconst network = fetch(request).then(response => {\n\t\t\t\t\tif (response.ok && response.type === 'basic') {\n\t\t\t\t\t\tcache.put","sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">"},{"line":14,"text":"<div class=\"gramSupport-messageMeta\">"},{"line":16,"text":"<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>"},{"line":18,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":29,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":41,"text":"<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":44,"text":"<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":45,"text":"<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes')\">"},{"line":47,"text":"<xf:option name=\"is_internal\" value=\"1\">{{ phrase('gram_support_internal_note') }}</xf:option>"},{"line":51,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"},{"line":55,"text":"<xf:form action=\"{{ link('support/staff/update', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":58,"text":"<xf:selectrow name=\"status\" value=\"{$ticket.status}\" label=\"{{ phrase('gram_support_status') }}\">"},{"line":64,"text":"label=\"{{ phrase('gram_support_assigned_user_id') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">\n\t\t\t\t\t\t{{ date_time($message.message_date) }}\n\t\t\t\t\t\t<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes","sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"hit_lines":[{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}"},{"line":12,"text":"<div class=\"block-row gramSupport-message\">"},{"line":13,"text":"<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>"},{"line":14,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":25,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":38,"text":"<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":42,"text":"label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":44,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"}],"sample":"<xf:title>{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}\n\t\t\t</div>\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row gramSupport-message\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:if is=\"$ticket.status != 'CLOSED'\">\n\t<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\"\n\t\t\t\t\tlabel=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t</div>\n\t\t\t<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />\n\t\t</div>\n\t</xf:form>\n</xf:if>\n","sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_registered', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_registered', {\n\t'public_ref': $ticket.public_ref\n}) }}\n","sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_guest', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_guest', {\n\t'public_ref': $ticket.public_ref,\n\t'access_url': $accessUrl\n}) }}\n","sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}]}},{"name":"gamevipe","php_rc":0,"php_stderr":"","root":"/var/www/forums/gamevipe/public","services":{"mariadb":true,"nginx":true,"php8.3-fpm":true},"state":{"addon":{"active":1,"addon_id":"Gram/Support","is_processing":0,"last_pending_action":null,"title":"Gram Support","version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"addon_schema":["addon_id","title","version_string","version_id","json_hash","active","is_legacy","is_processing","last_pending_action"],"errors":{"count":0,"max_id":0},"extra_less_support_hits":[],"ok":true,"options":{"boardActive":"1","boardTitle":"\u0424\u043e\u0440\u0443\u043c GameVipe","boardUrl":"https://gamevipe.ru","defaultStyleId":"2"},"root":"/var/www/forums/gamevipe/public","styles":[{"parent_id":0,"style_id":1,"title":"Default style","user_selectable":0},{"parent_id":1,"style_id":2,"title":"Default style 2","user_selectable":1}],"template_inventory":[{"addon_id":"Gram/Support","bytes":136,"sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}],"template_mod_schema":["modification_id","addon_id","type","template","modification_key","description","execution_order","enabled","action","find","replace"],"template_mods":[{"addon_id":"Gram/Support","enabled":1,"execution_order":100,"find":{"bytes":7,"sample":"</body>","sha256":"124207d84bdc8a107cbcc04212a091e85157e09d7bf208f7afb4839498fef083"},"modification_key":"gram_support_launcher","replace":{"bytes":55,"sample":"<xf:include template=\"gram_support_launcher\" />\n</body>","sha256":"076cbf5ada30272d9b9bb748bd2faf7fe8849cbcd0c4da698939e21cb1f8e214"},"template":"PAGE_CONTAINER","type":"public"}],"template_schema":["template_id","type","title","style_id","template","template_parsed","addon_id","version_id","version_string","last_edit_date"],"ui_templates":[{"addon_id":"Gram/Support","bytes":136,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_alert_ticket_event', {"}],"sample":"<xf:macro id=\"content\">\n\t{{ phrase('gram_support_alert_ticket_event', {\n\t\t'public_ref': $alert.extra_data.public_ref\n\t}) }}\n</xf:macro>\n","sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"hit_lines":[{"line":1,"text":".gramSupport-launcher"},{"line":11,"text":".gramSupport-messageMeta"},{"line":18,"text":".gramSupport-message--internal"},{"line":26,"text":".gramSupport-launcher"},{"line":34,"text":".gramSupport-messageBody"}],"sample":".gramSupport-launcher\n{\n\tposition: fixed;\n\tright: 18px;\n\tbottom: 18px;\n\tz-index: 500;\n\tborder-radius: 999px;\n\tbox-shadow: 0 6px 24px rgba(0, 0, 0, .22);\n}\n\n.gramSupport-messageMeta\n{\n\tfont-size: 12px;\n\topacity: .7;\n\tmargin-bottom: 6px;\n}\n\n.gramSupport-message--internal\n{\n\tborder-left: 4px solid currentColor;\n\topacity: .9;\n}\n\n@media (max-width: 650px)\n{\n\t.gramSupport-launcher\n\t{\n\t\tright: 12px;\n\t\tbottom: 12px;\n\t\tmax-width: calc(100vw - 24px);\n\t}\n}\n\n.gramSupport-messageBody\n{\n\twhite-space: pre-wrap;\n\toverflow-wrap: anywhere;\n}\n","sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>"},{"line":2,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">"},{"line":7,"text":"<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\""},{"line":10,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />\n\n<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\"\n\t\t\t\tautocomplete=\"off\" />\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />\n\t</div>\n</xf:form>\n","sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">"},{"line":15,"text":"<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>"}],"sample":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t<xf:else />\n\t\t\t\t<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">"},{"line":12,"text":"label=\"{{ phrase('gram_support_category') }}\">"},{"line":13,"text":"<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>"},{"line":14,"text":"<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>"},{"line":15,"text":"<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>"},{"line":16,"text":"<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>"},{"line":19,"text":"label=\"{{ phrase('gram_support_subject') }}\" />"},{"line":21,"text":"label=\"{{ phrase('gram_support_description') }}\" />"},{"line":23,"text":"label=\"{{ phrase('gram_support_screenshot_optional') }}\" />"},{"line":29,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:textboxrow name=\"email\" type=\"email\" required=\"required\"\n\t\t\t\t\tlabel=\"{{ phrase('email') }}\" />\n\t\t\t</xf:if>\n\t\t\t<xf:selectrow name=\"category\" required=\"required\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_category') }}\">\n\t\t\t\t<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>\n\t\t\t\t<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>\n\t\t\t\t<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>\n\t\t\t\t<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>\n\t\t\t</xf:selectrow>\n\t\t\t<xf:textboxrow name=\"subject\" maxlength=\"255\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_subject') }}\" />\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"8\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_description') }}\" />\n\t\t\t<xf:uploadrow name=\"screenshot\" accept=\".gif,.jpeg,.jpg,.jpe,.png,.webp\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_screenshot_optional') }}\" />\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:captcharow label=\"{{ phrase('verification') }}\"\n\t\t\t\t\thint=\"{{ phrase('required') }}\" force=\"true\" />\n\t\t\t</xf:if>\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />\n\t</div>\n</xf:form>\n","sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<p>{{ phrase('gram_support_save_access_code') }}</p>"},{"line":17,"text":"<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>"}],"sample":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<p>{{ phrase('gram_support_save_access_code') }}</p>\n\t\t\t\t<code class=\"js-copyTarget\">{{ $accessCode }}</code>\n\t\t\t\t<xf:button icon=\"copy\"\n\t\t\t\t\tdata-xf-init=\"copy-to-clipboard\"\n\t\t\t\t\tdata-copy-target=\".js-copyTarget\"\n\t\t\t\t\tclass=\"button--link is-hidden\">{{ phrase('copy') }}</xf:button>\n\t\t\t</div>\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"hit_lines":[{"line":1,"text":"<xf:if is=\"$xf.options.gramSupportSiteId\">"},{"line":2,"text":"<a class=\"gramSupport-launcher button button--primary\""},{"line":3,"text":"href=\"{{ link('support/create') }}\""},{"line":4,"text":"aria-label=\"{{ phrase('gram_support_open_support') }}\">"},{"line":5,"text":"{{ phrase('gram_support_open_support') }}"}],"sample":"<xf:if is=\"$xf.options.gramSupportSiteId\">\n\t<a class=\"gramSupport-launcher button button--primary\"\n\t\thref=\"{{ link('support/create') }}\"\n\t\taria-label=\"{{ phrase('gram_support_open_support') }}\">\n\t\t{{ phrase('gram_support_open_support') }}\n\t</a>\n</xf:if>\n","sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">"}],"sample":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"hit_lines":[{"line":3,"text":"const OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';"},{"line":4,"text":"const STATIC_CACHE = 'gram-support-staff-static-v1';"},{"line":18,"text":".filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)"},{"line":36,"text":"// SECURITY: all support/ticket/account/admin-like content is network-only."},{"line":40,"text":"url.pathname.startsWith('/support/') ||"}],"sample":"'use strict';\n\nconst OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';\nconst STATIC_CACHE = 'gram-support-staff-static-v1';\n\nself.addEventListener('install', event => {\n\tevent.waitUntil(\n\t\tcaches.open(STATIC_CACHE)\n\t\t\t.then(cache => cache.addAll([OFFLINE_URL]))\n\t\t\t.then(() => self.skipWaiting())\n\t);\n});\n\nself.addEventListener('activate', event => {\n\tevent.waitUntil(\n\t\tcaches.keys().then(keys =>\n\t\t\tPromise.all(keys\n\t\t\t\t.filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)\n\t\t\t\t.map(key => caches.delete(key))\n\t\t\t)\n\t\t).then(() => self.clients.claim())\n\t);\n});\n\nself.addEventListener('fetch', event => {\n\tconst request = event.request;\n\tif (request.method !== 'GET') {\n\t\treturn;\n\t}\n\n\tconst url = new URL(request.url);\n\tif (url.origin !== self.location.origin) {\n\t\treturn;\n\t}\n\n\t// SECURITY: all support/ticket/account/admin-like content is network-only.\n\t// Never cache HTML/API responses that can contain ticket data, identities,\n\t// access state, internal notes, attachments or staff-only information.\n\tconst sensitive =\n\t\turl.pathname.startsWith('/support/') ||\n\t\turl.pathname.startsWith('/account/') ||\n\t\turl.pathname.startsWith('/admin.php') ||\n\t\trequest.headers.get('accept')?.includes('text/html');\n\n\tif (sensitive) {\n\t\tevent.respondWith(\n\t\t\tfetch(request, {cache: 'no-store'}).catch(() => {\n\t\t\t\tif (request.mode === 'navigate') {\n\t\t\t\t\treturn caches.match(OFFLINE_URL);\n\t\t\t\t}\n\t\t\t\tthrow new Error('OFFLINE_NETWORK_ONLY');\n\t\t\t})\n\t\t);\n\t\treturn;\n\t}\n\n\t// Same-origin static assets only; stale-while-revalidate.\n\tevent.respondWith(\n\t\tcaches.open(STATIC_CACHE).then(cache =>\n\t\t\tcache.match(request).then(cached => {\n\t\t\t\tconst network = fetch(request).then(response => {\n\t\t\t\t\tif (response.ok && response.type === 'basic') {\n\t\t\t\t\t\tcache.put","sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">"},{"line":14,"text":"<div class=\"gramSupport-messageMeta\">"},{"line":16,"text":"<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>"},{"line":18,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":29,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":41,"text":"<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":44,"text":"<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":45,"text":"<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes')\">"},{"line":47,"text":"<xf:option name=\"is_internal\" value=\"1\">{{ phrase('gram_support_internal_note') }}</xf:option>"},{"line":51,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"},{"line":55,"text":"<xf:form action=\"{{ link('support/staff/update', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":58,"text":"<xf:selectrow name=\"status\" value=\"{$ticket.status}\" label=\"{{ phrase('gram_support_status') }}\">"},{"line":64,"text":"label=\"{{ phrase('gram_support_assigned_user_id') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">\n\t\t\t\t\t\t{{ date_time($message.message_date) }}\n\t\t\t\t\t\t<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes","sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"hit_lines":[{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}"},{"line":12,"text":"<div class=\"block-row gramSupport-message\">"},{"line":13,"text":"<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>"},{"line":14,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":25,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":38,"text":"<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":42,"text":"label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":44,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"}],"sample":"<xf:title>{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}\n\t\t\t</div>\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row gramSupport-message\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:if is=\"$ticket.status != 'CLOSED'\">\n\t<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\"\n\t\t\t\t\tlabel=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t</div>\n\t\t\t<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />\n\t\t</div>\n\t</xf:form>\n</xf:if>\n","sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_registered', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_registered', {\n\t'public_ref': $ticket.public_ref\n}) }}\n","sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_guest', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_guest', {\n\t'public_ref': $ticket.public_ref,\n\t'access_url': $accessUrl\n}) }}\n","sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}]}},{"name":"hkmods","php_rc":0,"php_stderr":"","root":"/var/www/forums/hkmods/public","services":{"mariadb":true,"nginx":true,"php8.3-fpm":true},"state":{"addon":{"active":1,"addon_id":"Gram/Support","is_processing":0,"last_pending_action":null,"title":"Gram Support","version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"addon_schema":["addon_id","title","version_string","version_id","json_hash","active","is_legacy","is_processing","last_pending_action"],"errors":{"count":10,"max_id":12},"extra_less_support_hits":[],"ok":true,"options":{"boardActive":"1","boardTitle":"\u041c\u043e\u0434\u044b \u0434\u043b\u044f Hollow Knight","boardUrl":"https://hkmods.ru","defaultStyleId":"2"},"root":"/var/www/forums/hkmods/public","styles":[{"parent_id":0,"style_id":1,"title":"Default style","user_selectable":0},{"parent_id":1,"style_id":2,"title":"Default style 2","user_selectable":1}],"template_inventory":[{"addon_id":"Gram/Support","bytes":136,"sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}],"template_mod_schema":["modification_id","addon_id","type","template","modification_key","description","execution_order","enabled","action","find","replace"],"template_mods":[{"addon_id":"Gram/Support","enabled":1,"execution_order":100,"find":{"bytes":7,"sample":"</body>","sha256":"124207d84bdc8a107cbcc04212a091e85157e09d7bf208f7afb4839498fef083"},"modification_key":"gram_support_launcher","replace":{"bytes":55,"sample":"<xf:include template=\"gram_support_launcher\" />\n</body>","sha256":"076cbf5ada30272d9b9bb748bd2faf7fe8849cbcd0c4da698939e21cb1f8e214"},"template":"PAGE_CONTAINER","type":"public"}],"template_schema":["template_id","type","title","style_id","template","template_parsed","addon_id","version_id","version_string","last_edit_date"],"ui_templates":[{"addon_id":"Gram/Support","bytes":136,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_alert_ticket_event', {"}],"sample":"<xf:macro id=\"content\">\n\t{{ phrase('gram_support_alert_ticket_event', {\n\t\t'public_ref': $alert.extra_data.public_ref\n\t}) }}\n</xf:macro>\n","sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"hit_lines":[{"line":1,"text":".gramSupport-launcher"},{"line":11,"text":".gramSupport-messageMeta"},{"line":18,"text":".gramSupport-message--internal"},{"line":26,"text":".gramSupport-launcher"},{"line":34,"text":".gramSupport-messageBody"}],"sample":".gramSupport-launcher\n{\n\tposition: fixed;\n\tright: 18px;\n\tbottom: 18px;\n\tz-index: 500;\n\tborder-radius: 999px;\n\tbox-shadow: 0 6px 24px rgba(0, 0, 0, .22);\n}\n\n.gramSupport-messageMeta\n{\n\tfont-size: 12px;\n\topacity: .7;\n\tmargin-bottom: 6px;\n}\n\n.gramSupport-message--internal\n{\n\tborder-left: 4px solid currentColor;\n\topacity: .9;\n}\n\n@media (max-width: 650px)\n{\n\t.gramSupport-launcher\n\t{\n\t\tright: 12px;\n\t\tbottom: 12px;\n\t\tmax-width: calc(100vw - 24px);\n\t}\n}\n\n.gramSupport-messageBody\n{\n\twhite-space: pre-wrap;\n\toverflow-wrap: anywhere;\n}\n","sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>"},{"line":2,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">"},{"line":7,"text":"<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\""},{"line":10,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />\n\n<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\"\n\t\t\t\tautocomplete=\"off\" />\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />\n\t</div>\n</xf:form>\n","sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">"},{"line":15,"text":"<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>"}],"sample":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t<xf:else />\n\t\t\t\t<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">"},{"line":12,"text":"label=\"{{ phrase('gram_support_category') }}\">"},{"line":13,"text":"<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>"},{"line":14,"text":"<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>"},{"line":15,"text":"<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>"},{"line":16,"text":"<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>"},{"line":19,"text":"label=\"{{ phrase('gram_support_subject') }}\" />"},{"line":21,"text":"label=\"{{ phrase('gram_support_description') }}\" />"},{"line":23,"text":"label=\"{{ phrase('gram_support_screenshot_optional') }}\" />"},{"line":29,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:textboxrow name=\"email\" type=\"email\" required=\"required\"\n\t\t\t\t\tlabel=\"{{ phrase('email') }}\" />\n\t\t\t</xf:if>\n\t\t\t<xf:selectrow name=\"category\" required=\"required\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_category') }}\">\n\t\t\t\t<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>\n\t\t\t\t<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>\n\t\t\t\t<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>\n\t\t\t\t<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>\n\t\t\t</xf:selectrow>\n\t\t\t<xf:textboxrow name=\"subject\" maxlength=\"255\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_subject') }}\" />\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"8\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_description') }}\" />\n\t\t\t<xf:uploadrow name=\"screenshot\" accept=\".gif,.jpeg,.jpg,.jpe,.png,.webp\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_screenshot_optional') }}\" />\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:captcharow label=\"{{ phrase('verification') }}\"\n\t\t\t\t\thint=\"{{ phrase('required') }}\" force=\"true\" />\n\t\t\t</xf:if>\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />\n\t</div>\n</xf:form>\n","sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<p>{{ phrase('gram_support_save_access_code') }}</p>"},{"line":17,"text":"<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>"}],"sample":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<p>{{ phrase('gram_support_save_access_code') }}</p>\n\t\t\t\t<code class=\"js-copyTarget\">{{ $accessCode }}</code>\n\t\t\t\t<xf:button icon=\"copy\"\n\t\t\t\t\tdata-xf-init=\"copy-to-clipboard\"\n\t\t\t\t\tdata-copy-target=\".js-copyTarget\"\n\t\t\t\t\tclass=\"button--link is-hidden\">{{ phrase('copy') }}</xf:button>\n\t\t\t</div>\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"hit_lines":[{"line":1,"text":"<xf:if is=\"$xf.options.gramSupportSiteId\">"},{"line":2,"text":"<a class=\"gramSupport-launcher button button--primary\""},{"line":3,"text":"href=\"{{ link('support/create') }}\""},{"line":4,"text":"aria-label=\"{{ phrase('gram_support_open_support') }}\">"},{"line":5,"text":"{{ phrase('gram_support_open_support') }}"}],"sample":"<xf:if is=\"$xf.options.gramSupportSiteId\">\n\t<a class=\"gramSupport-launcher button button--primary\"\n\t\thref=\"{{ link('support/create') }}\"\n\t\taria-label=\"{{ phrase('gram_support_open_support') }}\">\n\t\t{{ phrase('gram_support_open_support') }}\n\t</a>\n</xf:if>\n","sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">"}],"sample":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"hit_lines":[{"line":3,"text":"const OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';"},{"line":4,"text":"const STATIC_CACHE = 'gram-support-staff-static-v1';"},{"line":18,"text":".filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)"},{"line":36,"text":"// SECURITY: all support/ticket/account/admin-like content is network-only."},{"line":40,"text":"url.pathname.startsWith('/support/') ||"}],"sample":"'use strict';\n\nconst OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';\nconst STATIC_CACHE = 'gram-support-staff-static-v1';\n\nself.addEventListener('install', event => {\n\tevent.waitUntil(\n\t\tcaches.open(STATIC_CACHE)\n\t\t\t.then(cache => cache.addAll([OFFLINE_URL]))\n\t\t\t.then(() => self.skipWaiting())\n\t);\n});\n\nself.addEventListener('activate', event => {\n\tevent.waitUntil(\n\t\tcaches.keys().then(keys =>\n\t\t\tPromise.all(keys\n\t\t\t\t.filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)\n\t\t\t\t.map(key => caches.delete(key))\n\t\t\t)\n\t\t).then(() => self.clients.claim())\n\t);\n});\n\nself.addEventListener('fetch', event => {\n\tconst request = event.request;\n\tif (request.method !== 'GET') {\n\t\treturn;\n\t}\n\n\tconst url = new URL(request.url);\n\tif (url.origin !== self.location.origin) {\n\t\treturn;\n\t}\n\n\t// SECURITY: all support/ticket/account/admin-like content is network-only.\n\t// Never cache HTML/API responses that can contain ticket data, identities,\n\t// access state, internal notes, attachments or staff-only information.\n\tconst sensitive =\n\t\turl.pathname.startsWith('/support/') ||\n\t\turl.pathname.startsWith('/account/') ||\n\t\turl.pathname.startsWith('/admin.php') ||\n\t\trequest.headers.get('accept')?.includes('text/html');\n\n\tif (sensitive) {\n\t\tevent.respondWith(\n\t\t\tfetch(request, {cache: 'no-store'}).catch(() => {\n\t\t\t\tif (request.mode === 'navigate') {\n\t\t\t\t\treturn caches.match(OFFLINE_URL);\n\t\t\t\t}\n\t\t\t\tthrow new Error('OFFLINE_NETWORK_ONLY');\n\t\t\t})\n\t\t);\n\t\treturn;\n\t}\n\n\t// Same-origin static assets only; stale-while-revalidate.\n\tevent.respondWith(\n\t\tcaches.open(STATIC_CACHE).then(cache =>\n\t\t\tcache.match(request).then(cached => {\n\t\t\t\tconst network = fetch(request).then(response => {\n\t\t\t\t\tif (response.ok && response.type === 'basic') {\n\t\t\t\t\t\tcache.put","sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">"},{"line":14,"text":"<div class=\"gramSupport-messageMeta\">"},{"line":16,"text":"<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>"},{"line":18,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":29,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":41,"text":"<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":44,"text":"<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":45,"text":"<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes')\">"},{"line":47,"text":"<xf:option name=\"is_internal\" value=\"1\">{{ phrase('gram_support_internal_note') }}</xf:option>"},{"line":51,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"},{"line":55,"text":"<xf:form action=\"{{ link('support/staff/update', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":58,"text":"<xf:selectrow name=\"status\" value=\"{$ticket.status}\" label=\"{{ phrase('gram_support_status') }}\">"},{"line":64,"text":"label=\"{{ phrase('gram_support_assigned_user_id') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">\n\t\t\t\t\t\t{{ date_time($message.message_date) }}\n\t\t\t\t\t\t<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes","sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"hit_lines":[{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}"},{"line":12,"text":"<div class=\"block-row gramSupport-message\">"},{"line":13,"text":"<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>"},{"line":14,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":25,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":38,"text":"<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":42,"text":"label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":44,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"}],"sample":"<xf:title>{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}\n\t\t\t</div>\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row gramSupport-message\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:if is=\"$ticket.status != 'CLOSED'\">\n\t<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\"\n\t\t\t\t\tlabel=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t</div>\n\t\t\t<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />\n\t\t</div>\n\t</xf:form>\n</xf:if>\n","sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_registered', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_registered', {\n\t'public_ref': $ticket.public_ref\n}) }}\n","sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_guest', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_guest', {\n\t'public_ref': $ticket.public_ref,\n\t'access_url': $accessUrl\n}) }}\n","sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}]}},{"name":"kingofwolk","php_rc":0,"php_stderr":"","root":"/var/www/forums/kingofwolk/public","services":{"mariadb":true,"nginx":true,"php8.3-fpm":true},"state":{"addon":{"active":1,"addon_id":"Gram/Support","is_processing":0,"last_pending_action":null,"title":"Gram Support","version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"addon_schema":["addon_id","title","version_string","version_id","json_hash","active","is_legacy","is_processing","last_pending_action"],"errors":{"count":0,"max_id":0},"extra_less_support_hits":[],"ok":true,"options":{"boardActive":"1","boardTitle":"KingOfWolk","boardUrl":"https://kingofwolk.ru","defaultStyleId":"2"},"root":"/var/www/forums/kingofwolk/public","styles":[{"parent_id":0,"style_id":1,"title":"Default style","user_selectable":1},{"parent_id":1,"style_id":2,"title":"KingOfWolk Dark","user_selectable":1}],"template_inventory":[{"addon_id":"Gram/Support","bytes":136,"sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}],"template_mod_schema":["modification_id","addon_id","type","template","modification_key","description","execution_order","enabled","action","find","replace"],"template_mods":[{"addon_id":"Gram/Support","enabled":1,"execution_order":100,"find":{"bytes":7,"sample":"</body>","sha256":"124207d84bdc8a107cbcc04212a091e85157e09d7bf208f7afb4839498fef083"},"modification_key":"gram_support_launcher","replace":{"bytes":55,"sample":"<xf:include template=\"gram_support_launcher\" />\n</body>","sha256":"076cbf5ada30272d9b9bb748bd2faf7fe8849cbcd0c4da698939e21cb1f8e214"},"template":"PAGE_CONTAINER","type":"public"}],"template_schema":["template_id","type","title","style_id","template","template_parsed","addon_id","version_id","version_string","last_edit_date"],"ui_templates":[{"addon_id":"Gram/Support","bytes":136,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_alert_ticket_event', {"}],"sample":"<xf:macro id=\"content\">\n\t{{ phrase('gram_support_alert_ticket_event', {\n\t\t'public_ref': $alert.extra_data.public_ref\n\t}) }}\n</xf:macro>\n","sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"hit_lines":[{"line":1,"text":".gramSupport-launcher"},{"line":11,"text":".gramSupport-messageMeta"},{"line":18,"text":".gramSupport-message--internal"},{"line":26,"text":".gramSupport-launcher"},{"line":34,"text":".gramSupport-messageBody"}],"sample":".gramSupport-launcher\n{\n\tposition: fixed;\n\tright: 18px;\n\tbottom: 18px;\n\tz-index: 500;\n\tborder-radius: 999px;\n\tbox-shadow: 0 6px 24px rgba(0, 0, 0, .22);\n}\n\n.gramSupport-messageMeta\n{\n\tfont-size: 12px;\n\topacity: .7;\n\tmargin-bottom: 6px;\n}\n\n.gramSupport-message--internal\n{\n\tborder-left: 4px solid currentColor;\n\topacity: .9;\n}\n\n@media (max-width: 650px)\n{\n\t.gramSupport-launcher\n\t{\n\t\tright: 12px;\n\t\tbottom: 12px;\n\t\tmax-width: calc(100vw - 24px);\n\t}\n}\n\n.gramSupport-messageBody\n{\n\twhite-space: pre-wrap;\n\toverflow-wrap: anywhere;\n}\n","sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>"},{"line":2,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">"},{"line":7,"text":"<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\""},{"line":10,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />\n\n<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\"\n\t\t\t\tautocomplete=\"off\" />\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />\n\t</div>\n</xf:form>\n","sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">"},{"line":15,"text":"<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>"}],"sample":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t<xf:else />\n\t\t\t\t<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">"},{"line":12,"text":"label=\"{{ phrase('gram_support_category') }}\">"},{"line":13,"text":"<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>"},{"line":14,"text":"<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>"},{"line":15,"text":"<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>"},{"line":16,"text":"<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>"},{"line":19,"text":"label=\"{{ phrase('gram_support_subject') }}\" />"},{"line":21,"text":"label=\"{{ phrase('gram_support_description') }}\" />"},{"line":23,"text":"label=\"{{ phrase('gram_support_screenshot_optional') }}\" />"},{"line":29,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:textboxrow name=\"email\" type=\"email\" required=\"required\"\n\t\t\t\t\tlabel=\"{{ phrase('email') }}\" />\n\t\t\t</xf:if>\n\t\t\t<xf:selectrow name=\"category\" required=\"required\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_category') }}\">\n\t\t\t\t<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>\n\t\t\t\t<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>\n\t\t\t\t<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>\n\t\t\t\t<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>\n\t\t\t</xf:selectrow>\n\t\t\t<xf:textboxrow name=\"subject\" maxlength=\"255\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_subject') }}\" />\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"8\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_description') }}\" />\n\t\t\t<xf:uploadrow name=\"screenshot\" accept=\".gif,.jpeg,.jpg,.jpe,.png,.webp\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_screenshot_optional') }}\" />\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:captcharow label=\"{{ phrase('verification') }}\"\n\t\t\t\t\thint=\"{{ phrase('required') }}\" force=\"true\" />\n\t\t\t</xf:if>\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />\n\t</div>\n</xf:form>\n","sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<p>{{ phrase('gram_support_save_access_code') }}</p>"},{"line":17,"text":"<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>"}],"sample":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<p>{{ phrase('gram_support_save_access_code') }}</p>\n\t\t\t\t<code class=\"js-copyTarget\">{{ $accessCode }}</code>\n\t\t\t\t<xf:button icon=\"copy\"\n\t\t\t\t\tdata-xf-init=\"copy-to-clipboard\"\n\t\t\t\t\tdata-copy-target=\".js-copyTarget\"\n\t\t\t\t\tclass=\"button--link is-hidden\">{{ phrase('copy') }}</xf:button>\n\t\t\t</div>\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"hit_lines":[{"line":1,"text":"<xf:if is=\"$xf.options.gramSupportSiteId\">"},{"line":2,"text":"<a class=\"gramSupport-launcher button button--primary\""},{"line":3,"text":"href=\"{{ link('support/create') }}\""},{"line":4,"text":"aria-label=\"{{ phrase('gram_support_open_support') }}\">"},{"line":5,"text":"{{ phrase('gram_support_open_support') }}"}],"sample":"<xf:if is=\"$xf.options.gramSupportSiteId\">\n\t<a class=\"gramSupport-launcher button button--primary\"\n\t\thref=\"{{ link('support/create') }}\"\n\t\taria-label=\"{{ phrase('gram_support_open_support') }}\">\n\t\t{{ phrase('gram_support_open_support') }}\n\t</a>\n</xf:if>\n","sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">"}],"sample":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"hit_lines":[{"line":3,"text":"const OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';"},{"line":4,"text":"const STATIC_CACHE = 'gram-support-staff-static-v1';"},{"line":18,"text":".filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)"},{"line":36,"text":"// SECURITY: all support/ticket/account/admin-like content is network-only."},{"line":40,"text":"url.pathname.startsWith('/support/') ||"}],"sample":"'use strict';\n\nconst OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';\nconst STATIC_CACHE = 'gram-support-staff-static-v1';\n\nself.addEventListener('install', event => {\n\tevent.waitUntil(\n\t\tcaches.open(STATIC_CACHE)\n\t\t\t.then(cache => cache.addAll([OFFLINE_URL]))\n\t\t\t.then(() => self.skipWaiting())\n\t);\n});\n\nself.addEventListener('activate', event => {\n\tevent.waitUntil(\n\t\tcaches.keys().then(keys =>\n\t\t\tPromise.all(keys\n\t\t\t\t.filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)\n\t\t\t\t.map(key => caches.delete(key))\n\t\t\t)\n\t\t).then(() => self.clients.claim())\n\t);\n});\n\nself.addEventListener('fetch', event => {\n\tconst request = event.request;\n\tif (request.method !== 'GET') {\n\t\treturn;\n\t}\n\n\tconst url = new URL(request.url);\n\tif (url.origin !== self.location.origin) {\n\t\treturn;\n\t}\n\n\t// SECURITY: all support/ticket/account/admin-like content is network-only.\n\t// Never cache HTML/API responses that can contain ticket data, identities,\n\t// access state, internal notes, attachments or staff-only information.\n\tconst sensitive =\n\t\turl.pathname.startsWith('/support/') ||\n\t\turl.pathname.startsWith('/account/') ||\n\t\turl.pathname.startsWith('/admin.php') ||\n\t\trequest.headers.get('accept')?.includes('text/html');\n\n\tif (sensitive) {\n\t\tevent.respondWith(\n\t\t\tfetch(request, {cache: 'no-store'}).catch(() => {\n\t\t\t\tif (request.mode === 'navigate') {\n\t\t\t\t\treturn caches.match(OFFLINE_URL);\n\t\t\t\t}\n\t\t\t\tthrow new Error('OFFLINE_NETWORK_ONLY');\n\t\t\t})\n\t\t);\n\t\treturn;\n\t}\n\n\t// Same-origin static assets only; stale-while-revalidate.\n\tevent.respondWith(\n\t\tcaches.open(STATIC_CACHE).then(cache =>\n\t\t\tcache.match(request).then(cached => {\n\t\t\t\tconst network = fetch(request).then(response => {\n\t\t\t\t\tif (response.ok && response.type === 'basic') {\n\t\t\t\t\t\tcache.put","sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">"},{"line":14,"text":"<div class=\"gramSupport-messageMeta\">"},{"line":16,"text":"<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>"},{"line":18,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":29,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":41,"text":"<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":44,"text":"<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":45,"text":"<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes')\">"},{"line":47,"text":"<xf:option name=\"is_internal\" value=\"1\">{{ phrase('gram_support_internal_note') }}</xf:option>"},{"line":51,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"},{"line":55,"text":"<xf:form action=\"{{ link('support/staff/update', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":58,"text":"<xf:selectrow name=\"status\" value=\"{$ticket.status}\" label=\"{{ phrase('gram_support_status') }}\">"},{"line":64,"text":"label=\"{{ phrase('gram_support_assigned_user_id') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">\n\t\t\t\t\t\t{{ date_time($message.message_date) }}\n\t\t\t\t\t\t<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes","sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"hit_lines":[{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}"},{"line":12,"text":"<div class=\"block-row gramSupport-message\">"},{"line":13,"text":"<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>"},{"line":14,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":25,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":38,"text":"<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":42,"text":"label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":44,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"}],"sample":"<xf:title>{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}\n\t\t\t</div>\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row gramSupport-message\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:if is=\"$ticket.status != 'CLOSED'\">\n\t<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\"\n\t\t\t\t\tlabel=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t</div>\n\t\t\t<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />\n\t\t</div>\n\t</xf:form>\n</xf:if>\n","sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_registered', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_registered', {\n\t'public_ref': $ticket.public_ref\n}) }}\n","sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_guest', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_guest', {\n\t'public_ref': $ticket.public_ref,\n\t'access_url': $accessUrl\n}) }}\n","sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}]}},{"name":"zakrutim","php_rc":0,"php_stderr":"","root":"/var/www/forums/zakrutim/public","services":{"mariadb":true,"nginx":true,"php8.3-fpm":true},"state":{"addon":{"active":1,"addon_id":"Gram/Support","is_processing":0,"last_pending_action":null,"title":"Gram Support","version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"addon_schema":["addon_id","title","version_string","version_id","json_hash","active","is_legacy","is_processing","last_pending_action"],"errors":{"count":0,"max_id":0},"extra_less_support_hits":[],"ok":true,"options":{"boardActive":"1","boardTitle":"\u041a\u043e\u043d\u0441\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u043a\u0440\u0443\u0442\u043a\u0438","boardUrl":"https://zakrutim.ru","defaultStyleId":"2"},"root":"/var/www/forums/zakrutim/public","styles":[{"parent_id":0,"style_id":1,"title":"Default style","user_selectable":0},{"parent_id":1,"style_id":2,"title":"Default style 2","user_selectable":1}],"template_inventory":[{"addon_id":"Gram/Support","bytes":136,"sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}],"template_mod_schema":["modification_id","addon_id","type","template","modification_key","description","execution_order","enabled","action","find","replace"],"template_mods":[{"addon_id":"Gram/Support","enabled":1,"execution_order":100,"find":{"bytes":7,"sample":"</body>","sha256":"124207d84bdc8a107cbcc04212a091e85157e09d7bf208f7afb4839498fef083"},"modification_key":"gram_support_launcher","replace":{"bytes":55,"sample":"<xf:include template=\"gram_support_launcher\" />\n</body>","sha256":"076cbf5ada30272d9b9bb748bd2faf7fe8849cbcd0c4da698939e21cb1f8e214"},"template":"PAGE_CONTAINER","type":"public"}],"template_schema":["template_id","type","title","style_id","template","template_parsed","addon_id","version_id","version_string","last_edit_date"],"ui_templates":[{"addon_id":"Gram/Support","bytes":136,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_alert_ticket_event', {"}],"sample":"<xf:macro id=\"content\">\n\t{{ phrase('gram_support_alert_ticket_event', {\n\t\t'public_ref': $alert.extra_data.public_ref\n\t}) }}\n</xf:macro>\n","sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"hit_lines":[{"line":1,"text":".gramSupport-launcher"},{"line":11,"text":".gramSupport-messageMeta"},{"line":18,"text":".gramSupport-message--internal"},{"line":26,"text":".gramSupport-launcher"},{"line":34,"text":".gramSupport-messageBody"}],"sample":".gramSupport-launcher\n{\n\tposition: fixed;\n\tright: 18px;\n\tbottom: 18px;\n\tz-index: 500;\n\tborder-radius: 999px;\n\tbox-shadow: 0 6px 24px rgba(0, 0, 0, .22);\n}\n\n.gramSupport-messageMeta\n{\n\tfont-size: 12px;\n\topacity: .7;\n\tmargin-bottom: 6px;\n}\n\n.gramSupport-message--internal\n{\n\tborder-left: 4px solid currentColor;\n\topacity: .9;\n}\n\n@media (max-width: 650px)\n{\n\t.gramSupport-launcher\n\t{\n\t\tright: 12px;\n\t\tbottom: 12px;\n\t\tmax-width: calc(100vw - 24px);\n\t}\n}\n\n.gramSupport-messageBody\n{\n\twhite-space: pre-wrap;\n\toverflow-wrap: anywhere;\n}\n","sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>"},{"line":2,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">"},{"line":7,"text":"<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\""},{"line":10,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />\n\n<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\"\n\t\t\t\tautocomplete=\"off\" />\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />\n\t</div>\n</xf:form>\n","sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">"},{"line":15,"text":"<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>"}],"sample":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t<xf:else />\n\t\t\t\t<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">"},{"line":12,"text":"label=\"{{ phrase('gram_support_category') }}\">"},{"line":13,"text":"<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>"},{"line":14,"text":"<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>"},{"line":15,"text":"<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>"},{"line":16,"text":"<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>"},{"line":19,"text":"label=\"{{ phrase('gram_support_subject') }}\" />"},{"line":21,"text":"label=\"{{ phrase('gram_support_description') }}\" />"},{"line":23,"text":"label=\"{{ phrase('gram_support_screenshot_optional') }}\" />"},{"line":29,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:textboxrow name=\"email\" type=\"email\" required=\"required\"\n\t\t\t\t\tlabel=\"{{ phrase('email') }}\" />\n\t\t\t</xf:if>\n\t\t\t<xf:selectrow name=\"category\" required=\"required\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_category') }}\">\n\t\t\t\t<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>\n\t\t\t\t<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>\n\t\t\t\t<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>\n\t\t\t\t<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>\n\t\t\t</xf:selectrow>\n\t\t\t<xf:textboxrow name=\"subject\" maxlength=\"255\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_subject') }}\" />\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"8\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_description') }}\" />\n\t\t\t<xf:uploadrow name=\"screenshot\" accept=\".gif,.jpeg,.jpg,.jpe,.png,.webp\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_screenshot_optional') }}\" />\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:captcharow label=\"{{ phrase('verification') }}\"\n\t\t\t\t\thint=\"{{ phrase('required') }}\" force=\"true\" />\n\t\t\t</xf:if>\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />\n\t</div>\n</xf:form>\n","sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<p>{{ phrase('gram_support_save_access_code') }}</p>"},{"line":17,"text":"<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>"}],"sample":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<p>{{ phrase('gram_support_save_access_code') }}</p>\n\t\t\t\t<code class=\"js-copyTarget\">{{ $accessCode }}</code>\n\t\t\t\t<xf:button icon=\"copy\"\n\t\t\t\t\tdata-xf-init=\"copy-to-clipboard\"\n\t\t\t\t\tdata-copy-target=\".js-copyTarget\"\n\t\t\t\t\tclass=\"button--link is-hidden\">{{ phrase('copy') }}</xf:button>\n\t\t\t</div>\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"hit_lines":[{"line":1,"text":"<xf:if is=\"$xf.options.gramSupportSiteId\">"},{"line":2,"text":"<a class=\"gramSupport-launcher button button--primary\""},{"line":3,"text":"href=\"{{ link('support/create') }}\""},{"line":4,"text":"aria-label=\"{{ phrase('gram_support_open_support') }}\">"},{"line":5,"text":"{{ phrase('gram_support_open_support') }}"}],"sample":"<xf:if is=\"$xf.options.gramSupportSiteId\">\n\t<a class=\"gramSupport-launcher button button--primary\"\n\t\thref=\"{{ link('support/create') }}\"\n\t\taria-label=\"{{ phrase('gram_support_open_support') }}\">\n\t\t{{ phrase('gram_support_open_support') }}\n\t</a>\n</xf:if>\n","sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">"}],"sample":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"hit_lines":[{"line":3,"text":"const OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';"},{"line":4,"text":"const STATIC_CACHE = 'gram-support-staff-static-v1';"},{"line":18,"text":".filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)"},{"line":36,"text":"// SECURITY: all support/ticket/account/admin-like content is network-only."},{"line":40,"text":"url.pathname.startsWith('/support/') ||"}],"sample":"'use strict';\n\nconst OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';\nconst STATIC_CACHE = 'gram-support-staff-static-v1';\n\nself.addEventListener('install', event => {\n\tevent.waitUntil(\n\t\tcaches.open(STATIC_CACHE)\n\t\t\t.then(cache => cache.addAll([OFFLINE_URL]))\n\t\t\t.then(() => self.skipWaiting())\n\t);\n});\n\nself.addEventListener('activate', event => {\n\tevent.waitUntil(\n\t\tcaches.keys().then(keys =>\n\t\t\tPromise.all(keys\n\t\t\t\t.filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)\n\t\t\t\t.map(key => caches.delete(key))\n\t\t\t)\n\t\t).then(() => self.clients.claim())\n\t);\n});\n\nself.addEventListener('fetch', event => {\n\tconst request = event.request;\n\tif (request.method !== 'GET') {\n\t\treturn;\n\t}\n\n\tconst url = new URL(request.url);\n\tif (url.origin !== self.location.origin) {\n\t\treturn;\n\t}\n\n\t// SECURITY: all support/ticket/account/admin-like content is network-only.\n\t// Never cache HTML/API responses that can contain ticket data, identities,\n\t// access state, internal notes, attachments or staff-only information.\n\tconst sensitive =\n\t\turl.pathname.startsWith('/support/') ||\n\t\turl.pathname.startsWith('/account/') ||\n\t\turl.pathname.startsWith('/admin.php') ||\n\t\trequest.headers.get('accept')?.includes('text/html');\n\n\tif (sensitive) {\n\t\tevent.respondWith(\n\t\t\tfetch(request, {cache: 'no-store'}).catch(() => {\n\t\t\t\tif (request.mode === 'navigate') {\n\t\t\t\t\treturn caches.match(OFFLINE_URL);\n\t\t\t\t}\n\t\t\t\tthrow new Error('OFFLINE_NETWORK_ONLY');\n\t\t\t})\n\t\t);\n\t\treturn;\n\t}\n\n\t// Same-origin static assets only; stale-while-revalidate.\n\tevent.respondWith(\n\t\tcaches.open(STATIC_CACHE).then(cache =>\n\t\t\tcache.match(request).then(cached => {\n\t\t\t\tconst network = fetch(request).then(response => {\n\t\t\t\t\tif (response.ok && response.type === 'basic') {\n\t\t\t\t\t\tcache.put","sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">"},{"line":14,"text":"<div class=\"gramSupport-messageMeta\">"},{"line":16,"text":"<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>"},{"line":18,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":29,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":41,"text":"<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":44,"text":"<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":45,"text":"<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes')\">"},{"line":47,"text":"<xf:option name=\"is_internal\" value=\"1\">{{ phrase('gram_support_internal_note') }}</xf:option>"},{"line":51,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"},{"line":55,"text":"<xf:form action=\"{{ link('support/staff/update', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":58,"text":"<xf:selectrow name=\"status\" value=\"{$ticket.status}\" label=\"{{ phrase('gram_support_status') }}\">"},{"line":64,"text":"label=\"{{ phrase('gram_support_assigned_user_id') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">\n\t\t\t\t\t\t{{ date_time($message.message_date) }}\n\t\t\t\t\t\t<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes","sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"hit_lines":[{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}"},{"line":12,"text":"<div class=\"block-row gramSupport-message\">"},{"line":13,"text":"<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>"},{"line":14,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":25,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":38,"text":"<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":42,"text":"label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":44,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"}],"sample":"<xf:title>{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}\n\t\t\t</div>\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row gramSupport-message\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:if is=\"$ticket.status != 'CLOSED'\">\n\t<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\"\n\t\t\t\t\tlabel=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t</div>\n\t\t\t<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />\n\t\t</div>\n\t</xf:form>\n</xf:if>\n","sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_registered', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_registered', {\n\t'public_ref': $ticket.public_ref\n}) }}\n","sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_guest', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_guest', {\n\t'public_ref': $ticket.public_ref,\n\t'access_url': $accessUrl\n}) }}\n","sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}]}}]}
GRAM_FOOTER_VM210={"host":"newfi-prod","sites":[{"name":"newfi-prod","php_rc":0,"php_stderr":"","root":"/var/www/forums/newfi/public","services":{"mariadb":true,"nginx":true,"php8.3-fpm":true},"state":{"addon":{"active":1,"addon_id":"Gram/Support","is_processing":0,"last_pending_action":null,"title":"Gram Support","version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"addon_schema":["addon_id","title","version_string","version_id","json_hash","active","is_legacy","is_processing","last_pending_action"],"errors":{"count":0,"max_id":0},"extra_less_support_hits":[],"ok":true,"options":{"boardActive":"0","boardTitle":"\u041d\u044c\u044e\u0444\u0414\u043e\u043c","boardUrl":"https://newfi.ru","defaultStyleId":"4"},"root":"/var/www/forums/newfi/public","styles":[{"parent_id":0,"style_id":1,"title":"Default style","user_selectable":1},{"parent_id":1,"style_id":4,"title":"\u041d\u044c\u044e\u0444\u0414\u043e\u043c","user_selectable":1}],"template_inventory":[{"addon_id":"Gram/Support","bytes":136,"sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}],"template_mod_schema":["modification_id","addon_id","type","template","modification_key","description","execution_order","enabled","action","find","replace"],"template_mods":[{"addon_id":"Gram/Support","enabled":1,"execution_order":100,"find":{"bytes":7,"sample":"</body>","sha256":"124207d84bdc8a107cbcc04212a091e85157e09d7bf208f7afb4839498fef083"},"modification_key":"gram_support_launcher","replace":{"bytes":55,"sample":"<xf:include template=\"gram_support_launcher\" />\n</body>","sha256":"076cbf5ada30272d9b9bb748bd2faf7fe8849cbcd0c4da698939e21cb1f8e214"},"template":"PAGE_CONTAINER","type":"public"}],"template_schema":["template_id","type","title","style_id","template","template_parsed","addon_id","version_id","version_string","last_edit_date"],"ui_templates":[{"addon_id":"Gram/Support","bytes":136,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_alert_ticket_event', {"}],"sample":"<xf:macro id=\"content\">\n\t{{ phrase('gram_support_alert_ticket_event', {\n\t\t'public_ref': $alert.extra_data.public_ref\n\t}) }}\n</xf:macro>\n","sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"hit_lines":[{"line":1,"text":".gramSupport-launcher"},{"line":11,"text":".gramSupport-messageMeta"},{"line":18,"text":".gramSupport-message--internal"},{"line":26,"text":".gramSupport-launcher"},{"line":34,"text":".gramSupport-messageBody"}],"sample":".gramSupport-launcher\n{\n\tposition: fixed;\n\tright: 18px;\n\tbottom: 18px;\n\tz-index: 500;\n\tborder-radius: 999px;\n\tbox-shadow: 0 6px 24px rgba(0, 0, 0, .22);\n}\n\n.gramSupport-messageMeta\n{\n\tfont-size: 12px;\n\topacity: .7;\n\tmargin-bottom: 6px;\n}\n\n.gramSupport-message--internal\n{\n\tborder-left: 4px solid currentColor;\n\topacity: .9;\n}\n\n@media (max-width: 650px)\n{\n\t.gramSupport-launcher\n\t{\n\t\tright: 12px;\n\t\tbottom: 12px;\n\t\tmax-width: calc(100vw - 24px);\n\t}\n}\n\n.gramSupport-messageBody\n{\n\twhite-space: pre-wrap;\n\toverflow-wrap: anywhere;\n}\n","sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>"},{"line":2,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">"},{"line":7,"text":"<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\""},{"line":10,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />\n\n<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\"\n\t\t\t\tautocomplete=\"off\" />\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />\n\t</div>\n</xf:form>\n","sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">"},{"line":15,"text":"<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>"}],"sample":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t<xf:else />\n\t\t\t\t<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">"},{"line":12,"text":"label=\"{{ phrase('gram_support_category') }}\">"},{"line":13,"text":"<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>"},{"line":14,"text":"<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>"},{"line":15,"text":"<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>"},{"line":16,"text":"<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>"},{"line":19,"text":"label=\"{{ phrase('gram_support_subject') }}\" />"},{"line":21,"text":"label=\"{{ phrase('gram_support_description') }}\" />"},{"line":23,"text":"label=\"{{ phrase('gram_support_screenshot_optional') }}\" />"},{"line":29,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:textboxrow name=\"email\" type=\"email\" required=\"required\"\n\t\t\t\t\tlabel=\"{{ phrase('email') }}\" />\n\t\t\t</xf:if>\n\t\t\t<xf:selectrow name=\"category\" required=\"required\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_category') }}\">\n\t\t\t\t<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>\n\t\t\t\t<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>\n\t\t\t\t<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>\n\t\t\t\t<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>\n\t\t\t</xf:selectrow>\n\t\t\t<xf:textboxrow name=\"subject\" maxlength=\"255\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_subject') }}\" />\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"8\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_description') }}\" />\n\t\t\t<xf:uploadrow name=\"screenshot\" accept=\".gif,.jpeg,.jpg,.jpe,.png,.webp\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_screenshot_optional') }}\" />\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:captcharow label=\"{{ phrase('verification') }}\"\n\t\t\t\t\thint=\"{{ phrase('required') }}\" force=\"true\" />\n\t\t\t</xf:if>\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />\n\t</div>\n</xf:form>\n","sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<p>{{ phrase('gram_support_save_access_code') }}</p>"},{"line":17,"text":"<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>"}],"sample":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<p>{{ phrase('gram_support_save_access_code') }}</p>\n\t\t\t\t<code class=\"js-copyTarget\">{{ $accessCode }}</code>\n\t\t\t\t<xf:button icon=\"copy\"\n\t\t\t\t\tdata-xf-init=\"copy-to-clipboard\"\n\t\t\t\t\tdata-copy-target=\".js-copyTarget\"\n\t\t\t\t\tclass=\"button--link is-hidden\">{{ phrase('copy') }}</xf:button>\n\t\t\t</div>\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"hit_lines":[{"line":1,"text":"<xf:if is=\"$xf.options.gramSupportSiteId\">"},{"line":2,"text":"<a class=\"gramSupport-launcher button button--primary\""},{"line":3,"text":"href=\"{{ link('support/create') }}\""},{"line":4,"text":"aria-label=\"{{ phrase('gram_support_open_support') }}\">"},{"line":5,"text":"{{ phrase('gram_support_open_support') }}"}],"sample":"<xf:if is=\"$xf.options.gramSupportSiteId\">\n\t<a class=\"gramSupport-launcher button button--primary\"\n\t\thref=\"{{ link('support/create') }}\"\n\t\taria-label=\"{{ phrase('gram_support_open_support') }}\">\n\t\t{{ phrase('gram_support_open_support') }}\n\t</a>\n</xf:if>\n","sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">"}],"sample":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"hit_lines":[{"line":3,"text":"const OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';"},{"line":4,"text":"const STATIC_CACHE = 'gram-support-staff-static-v1';"},{"line":18,"text":".filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)"},{"line":36,"text":"// SECURITY: all support/ticket/account/admin-like content is network-only."},{"line":40,"text":"url.pathname.startsWith('/support/') ||"}],"sample":"'use strict';\n\nconst OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';\nconst STATIC_CACHE = 'gram-support-staff-static-v1';\n\nself.addEventListener('install', event => {\n\tevent.waitUntil(\n\t\tcaches.open(STATIC_CACHE)\n\t\t\t.then(cache => cache.addAll([OFFLINE_URL]))\n\t\t\t.then(() => self.skipWaiting())\n\t);\n});\n\nself.addEventListener('activate', event => {\n\tevent.waitUntil(\n\t\tcaches.keys().then(keys =>\n\t\t\tPromise.all(keys\n\t\t\t\t.filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)\n\t\t\t\t.map(key => caches.delete(key))\n\t\t\t)\n\t\t).then(() => self.clients.claim())\n\t);\n});\n\nself.addEventListener('fetch', event => {\n\tconst request = event.request;\n\tif (request.method !== 'GET') {\n\t\treturn;\n\t}\n\n\tconst url = new URL(request.url);\n\tif (url.origin !== self.location.origin) {\n\t\treturn;\n\t}\n\n\t// SECURITY: all support/ticket/account/admin-like content is network-only.\n\t// Never cache HTML/API responses that can contain ticket data, identities,\n\t// access state, internal notes, attachments or staff-only information.\n\tconst sensitive =\n\t\turl.pathname.startsWith('/support/') ||\n\t\turl.pathname.startsWith('/account/') ||\n\t\turl.pathname.startsWith('/admin.php') ||\n\t\trequest.headers.get('accept')?.includes('text/html');\n\n\tif (sensitive) {\n\t\tevent.respondWith(\n\t\t\tfetch(request, {cache: 'no-store'}).catch(() => {\n\t\t\t\tif (request.mode === 'navigate') {\n\t\t\t\t\treturn caches.match(OFFLINE_URL);\n\t\t\t\t}\n\t\t\t\tthrow new Error('OFFLINE_NETWORK_ONLY');\n\t\t\t})\n\t\t);\n\t\treturn;\n\t}\n\n\t// Same-origin static assets only; stale-while-revalidate.\n\tevent.respondWith(\n\t\tcaches.open(STATIC_CACHE).then(cache =>\n\t\t\tcache.match(request).then(cached => {\n\t\t\t\tconst network = fetch(request).then(response => {\n\t\t\t\t\tif (response.ok && response.type === 'basic') {\n\t\t\t\t\t\tcache.put","sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">"},{"line":14,"text":"<div class=\"gramSupport-messageMeta\">"},{"line":16,"text":"<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>"},{"line":18,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":29,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":41,"text":"<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":44,"text":"<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":45,"text":"<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes')\">"},{"line":47,"text":"<xf:option name=\"is_internal\" value=\"1\">{{ phrase('gram_support_internal_note') }}</xf:option>"},{"line":51,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"},{"line":55,"text":"<xf:form action=\"{{ link('support/staff/update', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":58,"text":"<xf:selectrow name=\"status\" value=\"{$ticket.status}\" label=\"{{ phrase('gram_support_status') }}\">"},{"line":64,"text":"label=\"{{ phrase('gram_support_assigned_user_id') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">\n\t\t\t\t\t\t{{ date_time($message.message_date) }}\n\t\t\t\t\t\t<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes","sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"hit_lines":[{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}"},{"line":12,"text":"<div class=\"block-row gramSupport-message\">"},{"line":13,"text":"<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>"},{"line":14,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":25,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":38,"text":"<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":42,"text":"label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":44,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"}],"sample":"<xf:title>{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}\n\t\t\t</div>\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row gramSupport-message\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:if is=\"$ticket.status != 'CLOSED'\">\n\t<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\"\n\t\t\t\t\tlabel=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t</div>\n\t\t\t<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />\n\t\t</div>\n\t</xf:form>\n</xf:if>\n","sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_registered', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_registered', {\n\t'public_ref': $ticket.public_ref\n}) }}\n","sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_guest', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_guest', {\n\t'public_ref': $ticket.public_ref,\n\t'access_url': $accessUrl\n}) }}\n","sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}]}}]}
GRAM_FOOTER_VM211={"host":"newfi-staging","sites":[{"name":"newfi-staging","php_rc":0,"php_stderr":"","root":"/var/www/forums/newfi/public","services":{"mariadb":true,"nginx":true,"php8.3-fpm":true},"state":{"addon":{"active":1,"addon_id":"Gram/Support","is_processing":0,"last_pending_action":null,"title":"Gram Support","version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"addon_schema":["addon_id","title","version_string","version_id","json_hash","active","is_legacy","is_processing","last_pending_action"],"errors":{"count":14,"max_id":46},"extra_less_support_hits":[],"ok":true,"options":{"boardActive":"0","boardTitle":"Newfi Staging","boardUrl":"http://newfi-staging.gram1.ru","defaultStyleId":"4"},"root":"/var/www/forums/newfi/public","styles":[{"parent_id":0,"style_id":1,"title":"Default style","user_selectable":1},{"parent_id":1,"style_id":4,"title":"Newfi Staging","user_selectable":1}],"template_inventory":[{"addon_id":"Gram/Support","bytes":136,"sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}],"template_mod_schema":["modification_id","addon_id","type","template","modification_key","description","execution_order","enabled","action","find","replace"],"template_mods":[{"addon_id":"Gram/Support","enabled":1,"execution_order":100,"find":{"bytes":7,"sample":"</body>","sha256":"124207d84bdc8a107cbcc04212a091e85157e09d7bf208f7afb4839498fef083"},"modification_key":"gram_support_launcher","replace":{"bytes":55,"sample":"<xf:include template=\"gram_support_launcher\" />\n</body>","sha256":"076cbf5ada30272d9b9bb748bd2faf7fe8849cbcd0c4da698939e21cb1f8e214"},"template":"PAGE_CONTAINER","type":"public"}],"template_schema":["template_id","type","title","style_id","template","template_parsed","addon_id","version_id","version_string","last_edit_date"],"ui_templates":[{"addon_id":"Gram/Support","bytes":136,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_alert_ticket_event', {"}],"sample":"<xf:macro id=\"content\">\n\t{{ phrase('gram_support_alert_ticket_event', {\n\t\t'public_ref': $alert.extra_data.public_ref\n\t}) }}\n</xf:macro>\n","sha256":"cf73ad1b787e1bcb03c160a491ee7f714a4e73b72a118bcaf71bd6396e1e6a29","style_id":0,"title":"alert_user_gram_support_evt","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":530,"hit_lines":[{"line":1,"text":".gramSupport-launcher"},{"line":11,"text":".gramSupport-messageMeta"},{"line":18,"text":".gramSupport-message--internal"},{"line":26,"text":".gramSupport-launcher"},{"line":34,"text":".gramSupport-messageBody"}],"sample":".gramSupport-launcher\n{\n\tposition: fixed;\n\tright: 18px;\n\tbottom: 18px;\n\tz-index: 500;\n\tborder-radius: 999px;\n\tbox-shadow: 0 6px 24px rgba(0, 0, 0, .22);\n}\n\n.gramSupport-messageMeta\n{\n\tfont-size: 12px;\n\topacity: .7;\n\tmargin-bottom: 6px;\n}\n\n.gramSupport-message--internal\n{\n\tborder-left: 4px solid currentColor;\n\topacity: .9;\n}\n\n@media (max-width: 650px)\n{\n\t.gramSupport-launcher\n\t{\n\t\tright: 12px;\n\t\tbottom: 12px;\n\t\tmax-width: calc(100vw - 24px);\n\t}\n}\n\n.gramSupport-messageBody\n{\n\twhite-space: pre-wrap;\n\toverflow-wrap: anywhere;\n}\n","sha256":"1b16b3ea2f1b6d8e382cbaa8875e42b389054527a160c771de2e1675917882ed","style_id":0,"title":"gram_support.less","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":493,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>"},{"line":2,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">"},{"line":7,"text":"<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\""},{"line":10,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_access_title') }}</xf:title>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/access.js\" min=\"1\" />\n\n<xf:form action=\"{{ link('support/access') }}\" method=\"post\" class=\"block js-supportAccessForm\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textboxrow name=\"access_code\" label=\"{{ phrase('gram_support_access_code') }}\"\n\t\t\t\tautocomplete=\"off\" />\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_continue') }}\" />\n\t</div>\n</xf:form>\n","sha256":"78a1fd4a1ce75f196f78d04f92e8b2f578531daca66a285fb29aaa50ae757969","style_id":0,"title":"gram_support_access","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":601,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">"},{"line":15,"text":"<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>"}],"sample":"<xf:title>{{ phrase('gram_support_my_tickets') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('account/support/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t<xf:else />\n\t\t\t\t<div class=\"block-row\">{{ phrase('gram_support_no_tickets') }}</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"75f6f9c1a2e4b61ad4340c0ce00cc40171be17729675116ca4e619acef8cc52a","style_id":0,"title":"gram_support_account","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1488,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":4,"text":"<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">"},{"line":12,"text":"label=\"{{ phrase('gram_support_category') }}\">"},{"line":13,"text":"<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>"},{"line":14,"text":"<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>"},{"line":15,"text":"<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>"},{"line":16,"text":"<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>"},{"line":19,"text":"label=\"{{ phrase('gram_support_subject') }}\" />"},{"line":21,"text":"label=\"{{ phrase('gram_support_description') }}\" />"},{"line":23,"text":"label=\"{{ phrase('gram_support_screenshot_optional') }}\" />"},{"line":29,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_create_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<xf:form action=\"{{ link('support/create') }}\" method=\"post\" upload=\"true\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:textboxrow name=\"email\" type=\"email\" required=\"required\"\n\t\t\t\t\tlabel=\"{{ phrase('email') }}\" />\n\t\t\t</xf:if>\n\t\t\t<xf:selectrow name=\"category\" required=\"required\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_category') }}\">\n\t\t\t\t<xf:option value=\"technical\">{{ phrase('gram_support_category_technical') }}</xf:option>\n\t\t\t\t<xf:option value=\"account\">{{ phrase('gram_support_category_account') }}</xf:option>\n\t\t\t\t<xf:option value=\"content\">{{ phrase('gram_support_category_content') }}</xf:option>\n\t\t\t\t<xf:option value=\"other\">{{ phrase('gram_support_category_other') }}</xf:option>\n\t\t\t</xf:selectrow>\n\t\t\t<xf:textboxrow name=\"subject\" maxlength=\"255\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_subject') }}\" />\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"8\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_description') }}\" />\n\t\t\t<xf:uploadrow name=\"screenshot\" accept=\".gif,.jpeg,.jpg,.jpe,.png,.webp\"\n\t\t\t\tlabel=\"{{ phrase('gram_support_screenshot_optional') }}\" />\n\t\t\t<xf:if is=\"!$xf.visitor.user_id\">\n\t\t\t\t<xf:captcharow label=\"{{ phrase('verification') }}\"\n\t\t\t\t\thint=\"{{ phrase('required') }}\" force=\"true\" />\n\t\t\t</xf:if>\n\t\t</div>\n\t\t<xf:submitrow submit=\"{{ phrase('gram_support_submit') }}\" />\n\t</div>\n</xf:form>\n","sha256":"28cc5674de9d83ab0ae468e0fd789b44b2b88a0fab9f959e75f26d7508e87287","style_id":0,"title":"gram_support_create","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":707,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<p>{{ phrase('gram_support_save_access_code') }}</p>"},{"line":17,"text":"<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>"}],"sample":"<xf:title>{{ phrase('gram_support_created_title') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<p>{{ phrase('gram_support_save_access_code') }}</p>\n\t\t\t\t<code class=\"js-copyTarget\">{{ $accessCode }}</code>\n\t\t\t\t<xf:button icon=\"copy\"\n\t\t\t\t\tdata-xf-init=\"copy-to-clipboard\"\n\t\t\t\t\tdata-copy-target=\".js-copyTarget\"\n\t\t\t\t\tclass=\"button--link is-hidden\">{{ phrase('copy') }}</xf:button>\n\t\t\t</div>\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<a href=\"{$magicLink}\" rel=\"nofollow\">{{ phrase('gram_support_open_ticket') }}</a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"59f4609e245c125cf2a39a03d325c0faef6dfe0517824bd2eeee5a0a11b260c4","style_id":0,"title":"gram_support_created_guest","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":254,"hit_lines":[{"line":1,"text":"<xf:if is=\"$xf.options.gramSupportSiteId\">"},{"line":2,"text":"<a class=\"gramSupport-launcher button button--primary\""},{"line":3,"text":"href=\"{{ link('support/create') }}\""},{"line":4,"text":"aria-label=\"{{ phrase('gram_support_open_support') }}\">"},{"line":5,"text":"{{ phrase('gram_support_open_support') }}"}],"sample":"<xf:if is=\"$xf.options.gramSupportSiteId\">\n\t<a class=\"gramSupport-launcher button button--primary\"\n\t\thref=\"{{ link('support/create') }}\"\n\t\taria-label=\"{{ phrase('gram_support_open_support') }}\">\n\t\t{{ phrase('gram_support_open_support') }}\n\t</a>\n</xf:if>\n","sha256":"19dd8429e2ad0dfce31d69b33b310d349a408558c1ce05dda6ee64b4b834ef20","style_id":0,"title":"gram_support_launcher","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":768,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">"}],"sample":"<xf:title>{{ phrase('gram_support_staff_queue') }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$tickets\" value=\"$ticket\">\n\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t<a href=\"{{ link('support/staff/ticket', null, {'ref': $ticket.public_ref}) }}\">\n\t\t\t\t\t\t{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span class=\"u-muted\">{{ $ticket.status }}</span>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n","sha256":"de77a6c2043e3db3d0f8fe00bd705e4b269b201ce63a2e47c144f875ea600c56","style_id":0,"title":"gram_support_staff_queue","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1914,"hit_lines":[{"line":3,"text":"const OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';"},{"line":4,"text":"const STATIC_CACHE = 'gram-support-staff-static-v1';"},{"line":18,"text":".filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)"},{"line":36,"text":"// SECURITY: all support/ticket/account/admin-like content is network-only."},{"line":40,"text":"url.pathname.startsWith('/support/') ||"}],"sample":"'use strict';\n\nconst OFFLINE_URL = '{{ base_url('js/gram/support/pwa/offline.html')|escape('js') }}';\nconst STATIC_CACHE = 'gram-support-staff-static-v1';\n\nself.addEventListener('install', event => {\n\tevent.waitUntil(\n\t\tcaches.open(STATIC_CACHE)\n\t\t\t.then(cache => cache.addAll([OFFLINE_URL]))\n\t\t\t.then(() => self.skipWaiting())\n\t);\n});\n\nself.addEventListener('activate', event => {\n\tevent.waitUntil(\n\t\tcaches.keys().then(keys =>\n\t\t\tPromise.all(keys\n\t\t\t\t.filter(key => key.startsWith('gram-support-staff-static-') && key !== STATIC_CACHE)\n\t\t\t\t.map(key => caches.delete(key))\n\t\t\t)\n\t\t).then(() => self.clients.claim())\n\t);\n});\n\nself.addEventListener('fetch', event => {\n\tconst request = event.request;\n\tif (request.method !== 'GET') {\n\t\treturn;\n\t}\n\n\tconst url = new URL(request.url);\n\tif (url.origin !== self.location.origin) {\n\t\treturn;\n\t}\n\n\t// SECURITY: all support/ticket/account/admin-like content is network-only.\n\t// Never cache HTML/API responses that can contain ticket data, identities,\n\t// access state, internal notes, attachments or staff-only information.\n\tconst sensitive =\n\t\turl.pathname.startsWith('/support/') ||\n\t\turl.pathname.startsWith('/account/') ||\n\t\turl.pathname.startsWith('/admin.php') ||\n\t\trequest.headers.get('accept')?.includes('text/html');\n\n\tif (sensitive) {\n\t\tevent.respondWith(\n\t\t\tfetch(request, {cache: 'no-store'}).catch(() => {\n\t\t\t\tif (request.mode === 'navigate') {\n\t\t\t\t\treturn caches.match(OFFLINE_URL);\n\t\t\t\t}\n\t\t\t\tthrow new Error('OFFLINE_NETWORK_ONLY');\n\t\t\t})\n\t\t);\n\t\treturn;\n\t}\n\n\t// Same-origin static assets only; stale-while-revalidate.\n\tevent.respondWith(\n\t\tcaches.open(STATIC_CACHE).then(cache =>\n\t\t\tcache.match(request).then(cached => {\n\t\t\t\tconst network = fetch(request).then(response => {\n\t\t\t\t\tif (response.ok && response.type === 'basic') {\n\t\t\t\t\t\tcache.put","sha256":"c3cbc44db9be7b95f470a25b0d783ac7ba8778b643662957cba4e197c4267844","style_id":0,"title":"gram_support_staff_service_worker","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":2704,"hit_lines":[{"line":1,"text":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>"},{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":3,"text":"<span class=\"js-gramSupportPwaConfig\" hidden"},{"line":4,"text":"data-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\""},{"line":5,"text":"data-sw-url=\"{{ link('support/service-worker') }}\"></span>"},{"line":6,"text":"<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />"},{"line":13,"text":"<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">"},{"line":14,"text":"<div class=\"gramSupport-messageMeta\">"},{"line":16,"text":"<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>"},{"line":18,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":29,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":41,"text":"<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":44,"text":"<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":45,"text":"<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes')\">"},{"line":47,"text":"<xf:option name=\"is_internal\" value=\"1\">{{ phrase('gram_support_internal_note') }}</xf:option>"},{"line":51,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"},{"line":55,"text":"<xf:form action=\"{{ link('support/staff/update', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":58,"text":"<xf:selectrow name=\"status\" value=\"{$ticket.status}\" label=\"{{ phrase('gram_support_status') }}\">"},{"line":64,"text":"label=\"{{ phrase('gram_support_assigned_user_id') }}\" />"}],"sample":"<xf:title>{{ phrase('gram_support_staff_ticket') }} {{ $ticket.public_ref }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n<span class=\"js-gramSupportPwaConfig\" hidden\n\tdata-manifest-url=\"{{ base_url('js/gram/support/pwa/manifest.webmanifest') }}\"\n\tdata-sw-url=\"{{ link('support/service-worker') }}\"></span>\n<xf:js addon=\"Gram/Support\" src=\"gram/support/staff-pwa.js\" min=\"1\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row {{ $message.is_internal ? 'gramSupport-message--internal' : '' }}\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">\n\t\t\t\t\t\t{{ date_time($message.message_date) }}\n\t\t\t\t\t\t<xf:if is=\"$message.is_internal\"> \u00b7 {{ phrase('gram_support_internal_note') }}</xf:if>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t<div class=\"block-container\">\n\t\t<div class=\"block-body\">\n\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t<xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes","sha256":"fa9dc6b120c7a8c38910493d4d49ab847d2f88ecff63f7aadd3f5f45f6809aad","style_id":0,"title":"gram_support_staff_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":1542,"hit_lines":[{"line":2,"text":"<xf:css src=\"gram_support.less\" />"},{"line":9,"text":"<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}"},{"line":12,"text":"<div class=\"block-row gramSupport-message\">"},{"line":13,"text":"<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>"},{"line":14,"text":"<div class=\"gramSupport-messageBody\">{$message.message}</div>"},{"line":25,"text":"<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>"},{"line":38,"text":"<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">"},{"line":42,"text":"label=\"{{ phrase('gram_support_reply') }}\" />"},{"line":44,"text":"<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />"}],"sample":"<xf:title>{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}</xf:title>\n<xf:css src=\"gram_support.less\" />\n\n<div class=\"block\">\n\t<div class=\"block-container\">\n\t\t<h2 class=\"block-header\">{{ $ticket.public_ref }}</h2>\n\t\t<div class=\"block-body\">\n\t\t\t<div class=\"block-row\">\n\t\t\t\t<strong>{{ phrase('gram_support_status') }}:</strong> {{ $ticket.status }}\n\t\t\t</div>\n\t\t\t<xf:foreach loop=\"$messages\" value=\"$message\">\n\t\t\t\t<div class=\"block-row gramSupport-message\">\n\t\t\t\t\t<div class=\"gramSupport-messageMeta\">{{ date_time($message.message_date) }}</div>\n\t\t\t\t\t<div class=\"gramSupport-messageBody\">{$message.message}</div>\n\t\t\t\t</div>\n\t\t\t</xf:foreach>\n\t\t</div>\n\t</div>\n</div>\n\n\n<xf:if is=\"$ticket.Attachments is not empty\">\n\t<div class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<h3 class=\"block-minorHeader\">{{ phrase('gram_support_attachments') }}</h3>\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\">\n\t\t\t\t\t<div class=\"block-row\">\n\t\t\t\t\t\t<a href=\"{{ link('attachments', $attachment) }}\">{$attachment.filename}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</xf:foreach>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</xf:if>\n\n<xf:if is=\"$ticket.status != 'CLOSED'\">\n\t<xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\">\n\t\t<div class=\"block-container\">\n\t\t\t<div class=\"block-body\">\n\t\t\t\t<xf:textarearow name=\"message\" required=\"required\" rows=\"6\"\n\t\t\t\t\tlabel=\"{{ phrase('gram_support_reply') }}\" />\n\t\t\t</div>\n\t\t\t<xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" />\n\t\t</div>\n\t</xf:form>\n</xf:if>\n","sha256":"f13d36c71242adcc12b2ec218d5a0673704245495b3982dc98ad7d7ee8a93805","style_id":0,"title":"gram_support_ticket","type":"public","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":228,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_registered', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_registered', {\n\t'public_ref': $ticket.public_ref\n}) }}\n","sha256":"1292c840ac8d65f2531d6af31df0381ad1e864023f61472f7581693f1f13b6cd","style_id":0,"title":"gram_support_ticket_event","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},{"addon_id":"Gram/Support","bytes":250,"hit_lines":[{"line":2,"text":"{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":5,"text":"{{ phrase('gram_support_email_ticket_event_body_guest', {"}],"sample":"<mail:subject>\n\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}\n</mail:subject>\n\n{{ phrase('gram_support_email_ticket_event_body_guest', {\n\t'public_ref': $ticket.public_ref,\n\t'access_url': $accessUrl\n}) }}\n","sha256":"a427ce1da80b82bac28abc99150975c41f146163ea8a6728e3dacc290a078176","style_id":0,"title":"gram_support_ticket_event_guest","type":"email","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"}]}}]}
GRAM_FOOTER_PUBLIC_UI=[{"board_url":"https://codevipe.ru","name":"codevipe","root":{"bytes":47231,"ok":true,"sha256":"70fe60d06d2f8b745036c16610537b9d04080eefe5c3b4de80f15814fc277bfb","status":200,"truncated":false},"support_anchors":[{"ancestor_chain":[{"class":"has-no-js template-forum_list","tag":"html"},{"class":"","tag":"body"}],"class":"gramSupport-launcher button button--primary","href_path":"/support/create","id":"","tag":"a","text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"}],"support_page":{"bytes":29161,"ok":true,"status":200}},{"board_url":"https://dsmods.ru","name":"dsmods","root":{"bytes":176072,"ok":true,"sha256":"10e1cd2c905f8b7f671fc613b5d2ae3996b3724f1fd9c7593c4b8bf8b70bb192","status":200,"truncated":false},"support_anchors":[{"ancestor_chain":[{"class":"has-no-js template-forum_list","tag":"html"},{"class":"","tag":"body"}],"class":"gramSupport-launcher button button--primary","href_path":"/support/create","id":"","tag":"a","text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"}],"support_page":{"bytes":29193,"ok":true,"status":200}},{"board_url":"https://gamevipe.ru","name":"gamevipe","root":{"bytes":77668,"ok":true,"sha256":"31a4130a1c74a18dc7d1c46b61ae40a43572f47e81856337838a410167732244","status":200,"truncated":false},"support_anchors":[{"ancestor_chain":[{"class":"has-no-js template-forum_list","tag":"html"},{"class":"","tag":"body"}],"class":"gramSupport-launcher button button--primary","href_path":"/support/create","id":"","tag":"a","text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"}],"support_page":{"bytes":29178,"ok":true,"status":200}},{"board_url":"https://hkmods.ru","name":"hkmods","root":{"bytes":114631,"ok":true,"sha256":"eb33809b6b777183ae1d3fb53c0543e25cc9ee8af4bbf4dd64d2ef989777fadf","status":200,"truncated":false},"support_anchors":[{"ancestor_chain":[{"class":"has-no-js template-forum_list","tag":"html"},{"class":"","tag":"body"}],"class":"gramSupport-launcher button button--primary","href_path":"/support/create","id":"","tag":"a","text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"}],"support_page":{"bytes":29214,"ok":true,"status":200}},{"board_url":"https://kingofwolk.ru","name":"kingofwolk","root":{"bytes":70149,"ok":true,"sha256":"403d4ec72a21719e423df2df8fcdb3e32246746b225f01354a4126deed960331","status":200,"truncated":false},"support_anchors":[{"ancestor_chain":[{"class":"has-no-js template-forum_list","tag":"html"},{"class":"","tag":"body"}],"class":"gramSupport-launcher button button--primary","href_path":"/support/create","id":"","tag":"a","text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"}],"support_page":{"bytes":30524,"ok":true,"status":200}},{"board_url":"https://zakrutim.ru","name":"zakrutim","root":{"bytes":149970,"ok":true,"sha256":"29d3885312dd61d05d492debc034c969e8d7b70b59974298202e2a6339d559dc","status":200,"truncated":false},"support_anchors":[{"ancestor_chain":[{"class":"has-no-js template-forum_list","tag":"html"},{"class":"","tag":"body"}],"class":"gramSupport-launcher button button--primary","href_path":"/support/create","id":"","tag":"a","text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"}],"support_page":{"bytes":29384,"ok":true,"status":200}},{"board_url":"https://newfi.ru","name":"newfi-prod","root":{"bytes":25076,"ok":false,"sha256":"1bdb3ca1ac68e06f1d2bf95fe3b475b399dbe9ca01f0fe51ab24b15976b9a2ad","status":503,"truncated":false},"support_anchors":[{"ancestor_chain":[{"class":"has-no-js template-error","tag":"html"},{"class":"","tag":"body"}],"class":"gramSupport-launcher button button--primary","href_path":"/support/create","id":"","tag":"a","text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"}],"support_page":{"bytes":25084,"ok":false,"status":503}}]
GRAM_FOOTER_VERSION_MAP={"codevipe":{"active":1,"default_style_id":"2","processing":0,"version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"dsmods":{"active":1,"default_style_id":"2","processing":0,"version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"gamevipe":{"active":1,"default_style_id":"2","processing":0,"version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"hkmods":{"active":1,"default_style_id":"2","processing":0,"version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"kingofwolk":{"active":1,"default_style_id":"2","processing":0,"version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"newfi-prod":{"active":1,"default_style_id":"4","processing":0,"version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"newfi-staging":{"active":1,"default_style_id":"4","processing":0,"version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"},"zakrutim":{"active":1,"default_style_id":"2","processing":0,"version_id":1000060,"version_string":"1.0.0 Alpha 3 Unified Fix 4"}}
GRAM_FOOTER_UI_DRIFT=[{"anchor":{"ancestor_chain":[{"class":"has-no-js template-forum_list","tag":"html"},{"class":"","tag":"body"}],"class":"gramSupport-launcher button button--primary","href_path":"/support/create","id":"","tag":"a","text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"},"issue":"SUPPORT_ANCHOR_FACT","site":"codevipe"},{"anchor":{"ancestor_chain":[{"class":"has-no-js template-forum_list","tag":"html"},{"class":"","tag":"body"}],"class":"gramSupport-launcher button button--primary","href_path":"/support/create","id":"","tag":"a","text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"},"issue":"SUPPORT_ANCHOR_FACT","site":"dsmods"},{"anchor":{"ancestor_chain":[{"class":"has-no-js template-forum_list","tag":"html"},{"class":"","tag":"body"}],"class":"gramSupport-launcher button button--primary","href_path":"/support/create","id":"","tag":"a","text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"},"issue":"SUPPORT_ANCHOR_FACT","site":"gamevipe"},{"anchor":{"ancestor_chain":[{"class":"has-no-js template-forum_list","tag":"html"},{"class":"","tag":"body"}],"class":"gramSupport-launcher button button--primary","href_path":"/support/create","id":"","tag":"a","text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"},"issue":"SUPPORT_ANCHOR_FACT","site":"hkmods"},{"anchor":{"ancestor_chain":[{"class":"has-no-js template-forum_list","tag":"html"},{"class":"","tag":"body"}],"class":"gramSupport-launcher button button--primary","href_path":"/support/create","id":"","tag":"a","text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"},"issue":"SUPPORT_ANCHOR_FACT","site":"kingofwolk"},{"anchor":{"ancestor_chain":[{"class":"has-no-js template-forum_list","tag":"html"},{"class":"","tag":"body"}],"class":"gramSupport-launcher button button--primary","href_path":"/support/create","id":"","tag":"a","text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"},"issue":"SUPPORT_ANCHOR_FACT","site":"zakrutim"},{"anchor":{"ancestor_chain":[{"class":"has-no-js template-error","tag":"html"},{"class":"","tag":"body"}],"class":"gramSupport-launcher button button--primary","href_path":"/support/create","id":"","tag":"a","text":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430"},"issue":"SUPPORT_ANCHOR_FACT","site":"newfi-prod"}]
GRAM_FOOTER_COLLECTION_HOLDS=["ROOT_HTTP:newfi-prod:503","SUPPORT_HTTP:newfi-prod:503"]
GRAM_FOOTER_SOURCE_LAYOUT={"addon_candidates":[],"selected_addon_dir":null,"tracked_count":3,"tracked_relevant":["release/FIX4_SHA256.txt","release/GRAM_SUPPORT_FIX4_FINAL.zip"]}
GRAM_FOOTER_MUTATION_SCOPE=NONE_READ_ONLY
GRAM_FOOTER_DECISION=HOLD_COLLECTION_INCOMPLETE

OUTPUT_END
CHAT_OUTPUT_END
