From 165da8ffb0c8f8e9e74ac96d84dd8f14f305391b Mon Sep 17 00:00:00 2001 From: Arnab Nandy Date: Sun, 28 Jun 2026 21:50:50 +0530 Subject: [PATCH 1/5] Chrome extension added --- browser-extension/chrome/README.md | 41 + .../chrome/assets/icons/icon-128.png | Bin 0 -> 1659 bytes .../chrome/assets/icons/icon-16.png | Bin 0 -> 462 bytes .../chrome/assets/icons/icon-32.png | Bin 0 -> 603 bytes .../chrome/assets/icons/icon-48.png | Bin 0 -> 826 bytes .../assets/store/marquee-promo-1400x560.png | Bin 0 -> 102372 bytes .../screenshot-1-json-compare-1280x800.png | Bin 0 -> 30699 bytes .../store/screenshot-2-url-curl-1280x800.png | Bin 0 -> 30571 bytes .../store/screenshot-3-tree-view-1280x800.png | Bin 0 -> 24732 bytes .../assets/store/small-promo-440x280.png | Bin 0 -> 29172 bytes .../chrome/assets/store/store-icon-128.png | Bin 0 -> 1659 bytes browser-extension/chrome/manifest.json | 24 + browser-extension/chrome/popup.css | 440 ++++++++ browser-extension/chrome/popup.html | 180 ++++ browser-extension/chrome/popup.js | 970 ++++++++++++++++++ browser-extension/chrome/store-listing.md | 98 ++ test/app/page.test.tsx | 2 +- 17 files changed, 1754 insertions(+), 1 deletion(-) create mode 100644 browser-extension/chrome/README.md create mode 100644 browser-extension/chrome/assets/icons/icon-128.png create mode 100644 browser-extension/chrome/assets/icons/icon-16.png create mode 100644 browser-extension/chrome/assets/icons/icon-32.png create mode 100644 browser-extension/chrome/assets/icons/icon-48.png create mode 100644 browser-extension/chrome/assets/store/marquee-promo-1400x560.png create mode 100644 browser-extension/chrome/assets/store/screenshot-1-json-compare-1280x800.png create mode 100644 browser-extension/chrome/assets/store/screenshot-2-url-curl-1280x800.png create mode 100644 browser-extension/chrome/assets/store/screenshot-3-tree-view-1280x800.png create mode 100644 browser-extension/chrome/assets/store/small-promo-440x280.png create mode 100644 browser-extension/chrome/assets/store/store-icon-128.png create mode 100644 browser-extension/chrome/manifest.json create mode 100644 browser-extension/chrome/popup.css create mode 100644 browser-extension/chrome/popup.html create mode 100644 browser-extension/chrome/popup.js create mode 100644 browser-extension/chrome/store-listing.md diff --git a/browser-extension/chrome/README.md b/browser-extension/chrome/README.md new file mode 100644 index 0000000..a741ba3 --- /dev/null +++ b/browser-extension/chrome/README.md @@ -0,0 +1,41 @@ +# API Response Comparator Chrome Extension + +This is the Chrome-first browser extension version of API Response Comparator. +It is intentionally kept separate from the Next.js app and has no build step. + +## Load Locally + +1. Open `chrome://extensions`. +2. Enable **Developer mode**. +3. Click **Load unpacked**. +4. Select this folder: `browser-extension/chrome`. + +## Current Scope + +- Manifest V3 Chrome extension popup +- Manual JSON paste, format, file upload, and per-input clear controls +- Direct HTTPS URL fetch comparison from the extension popup +- Safe cURL parsing and structured browser fetch execution +- Optional Dev, QA, and Prod comparison with any two inputs +- Ignore leaf fields and volatility-based ignore suggestions +- `ADDED`, `REMOVED`, `CHANGED`, and `TYPE_CHANGE` rows +- Separate rows when one path has different outcome types +- Contract-change alert +- Diff counts, type filters, and path search +- Table view and color-coded JSON tree view +- Copy, JSON download, and Excel-compatible `.xls` download +- Full reset with in-flight URL and cURL request invalidation +- Light and dark themes +- Local draft persistence with `chrome.storage.local` + +## Notes + +- This extension fetches HTTPS API URLs directly using Chrome extension host + permissions instead of the Next.js app server proxy. +- cURL imports are parsed into structured requests. Shell operators and + file-based request bodies are rejected; browser-restricted headers are + filtered before fetch. +- The Excel export is an Excel-compatible `.xls` table so the extension can stay + dependency-free and load unpacked without a build step. +- Firefox, Edge, and other browser variants can be added under sibling folders + once the Chrome behavior is settled. diff --git a/browser-extension/chrome/assets/icons/icon-128.png b/browser-extension/chrome/assets/icons/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..8658432dfab6bebdaeaef4235d12981e9e4caeff GIT binary patch literal 1659 zcmZ8hc~BE}6a57tM2-~XiX3t%Rv@F*FC672hSM4#C4{IPwtfV#5GuFQhNDElhD%VC zf+3QETEbysEC~{d7HbqRs34{MRZ&nR8Ws$*Z91eut#-gQZAI|H=WsJWke$(Y$SEuFA2P`l$#>%p z>7VvKbd?PZ4CursZ8ra3qsP5sj(K$SP8L|4zCo*0?p$@@9PoLxnru%hsJn@s6{p&5 zWVtRDCA(Lya4mAU>gt@Bx`2a(zHg;Z8ByE(hwih>xa(FV^sJU-VvkF zOLJdA9QM6DX%+(;K|E{jbLg_4|BQZ1D$@ zb;+~UMv+u+M`Vg=@e2DX_01V+X6{Tn!sUcRZ5M8UWZWLwa0T>= z+1&t-a-Z;|tIgcLeui5vwfaMuOhT8vtwBt1erwoD6A0W*j?Z^Hl_K3zi69(_tyGvPC z8~mKZs$Am3clwI;Z5U9BgR9zsUT$P3%r`uSBG0DpQxsm2DHv(k@425(%XT9*!iryh zC8@HUj`L7>XbSW+Z77By@eX-QZ0SB}nYQA=yzs6}N$G4m1;|^NGtlu%v%=N2c0bkE z!~q~2{7Cq^5CjQz1#{zBk`MQERn7}v#U9(f?6Liy?omC!;I@`Ax)O4q;HhP-p;6HT z^R=}DMPXL}|CUMadSUNihsjU%N3_7c!o}uDh|Pk#TWpe9o_R5d+N%-wD=cru4qQ0* zk3fmJ`BTT00c1-<;GjXb)%a|?L7t{T-kSg4b2|*rYjtr2Zb-CH0*#Y5h=?sAW;$)r zj0_#$T=Z-Oyw7jW(?5oXIcWmi_of7$ouH?;L)H2JYYUd13|+dCSp)C;a!S5sm0R6q zegV!=^ zCyqJOC|kC;|I(h6wvkDixqW>8gn8`xi6Ne#|HPzQ_9_R+$!OTzh@a=E6Jo}S0(qZT*gjs z+*cpo^sujlIF51Ddu^H!_@fzXKC{95z)NZ9fu-^RO;?fvQC&6{zIe5XnBQPJYZ^|v zW__tyX)F3hcrsQ$QqnB1)ru>{cPm4Sxzxn`-z?y19XO|rT|W)=^jg5>Lr0|?7IMnl zMBwMdeKXQa<6DgxCZu?N#6MqrgdPip-Xgv>>4C66OShAm$Sl9uzf_*oF+N=6QaYId zX)r)7Wje06xWb?8|8z0yDfVF32=7q0oF7ly)nI71;n*!==R_83dqo{fcxTe4_1;DV u#qmp~TV0}+uB_W__|tXT|NX>(9=!I+N`Fw10YbXCnGE*FVp!<7g1-P0ss>~L literal 0 HcmV?d00001 diff --git a/browser-extension/chrome/assets/icons/icon-16.png b/browser-extension/chrome/assets/icons/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..bf6900f3683eb84ff271e06d36a1674dafd5d4dd GIT binary patch literal 462 zcmV;<0WtoGP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0b@x-K~y+TV_+C` zfWIW)fWIuafWI`i0Rxxi7VwtkTA=HJ1HRI{e*Ut&|Aa7KS>Aedy$t;2`3@jSf$sYM zA{*xa7um540}F3j@L#aM8DdaLP6CPnd?k4m0u=>dMV5!R{P#b#2Lpq|g|{vF&tF~m zALJzz13&@-b*2BMcdh)t_2sGmRo-g<r~Kcz_Rzs=P1|Bt+V`G4!n$6$GoI-CZ8 zox3>izmQEHf*sw2;uX9GfNZ#RWA=aFsw4lw;Ng=0z5z@AKm7my|E(_{iF84UBa*F6 z|AoY(NOQsRll}i~yr=(P`}XDkBNwOtw=7uyUwO|O!Uljs7Zl1KCno&Y6j%GNIcv{< zyCk*$LP?WQT~Jek&48Q$Q2Yu`??O?Gj)mqf<^1OY@F{6H{I3e}T3d zOx#coNr|Po_xbbl1yBtDxgtMb0FPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0q{vgK~z{rV_+Bs zqks^okLTbo&v)Q2&21nVgY@O+3!ocG6aZ=DE6bbDUzYcu3V1tLNtOh<9XJ6YfhMEol#pQ?J zKmWtQ!zKTHtBxSp0ZaZrM96{xNImV+K#3!gubci0iAQ0op=JnRV0uRZCI_Mb_~lYbHMzG7>1F9g_ceu!2u;X2{6Ti{mmGLk%K{P1DKh7 zC3zL-cA@}Ks|D^_P$;aLg<&8`c*Fev0u=>F4#@RDw-W>KmF1p?X#i;!oZJqMM^drS zte*e;)rE-QFUxxlYUHBZhXMFY@(uV)^S&d81T`>GzJ~!&(}}+f36Wa8%}Sq=yF p@f;wH;G97=&Ius9Z!ikz0RY6TAhZ_Qd8_~c002ovPDHLkV1fe@{ow!r literal 0 HcmV?d00001 diff --git a/browser-extension/chrome/assets/icons/icon-48.png b/browser-extension/chrome/assets/icons/icon-48.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7b81a69e06914a854132a8ea00b5b594738bbc GIT binary patch literal 826 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 b&!2we{`Y3RvNePMuDbHtE7o3q+p_-v#{dGC literal 0 HcmV?d00001 diff --git a/browser-extension/chrome/assets/store/screenshot-1-json-compare-1280x800.png b/browser-extension/chrome/assets/store/screenshot-1-json-compare-1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6e7340b0ff6a3394473b5a0af319a72ca1b578 GIT binary patch literal 30699 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 literal 0 HcmV?d00001 diff --git a/browser-extension/chrome/assets/store/screenshot-2-url-curl-1280x800.png b/browser-extension/chrome/assets/store/screenshot-2-url-curl-1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4c8c5963f6c7898cf375c5879c9f1e1e57620c GIT binary patch literal 30571 zcmeFZcT|&E*Ef72BRJ9=oiPdmI<}c{Bq|C@b;eOdR1{QHN>B$8F@z#L1uH57Dr!VZ zR79l42B9V(O^txm00BY|BtU==(v$aG;HdZgJnvf1THhbf`o8a8Yepc~&MCY8&ffbv z*AMKs(VDM2AA%q)+ueUTK+s(9tLpN3YTyUeSbjE z%UBKB37GVI-`&RoAV|9${$HgU^ZaiJ3WjX|`r}ZD+h`{)>zwBamQ-3TPiwe$ao_5d zTQYvj_0QNXUzzdbx02gFscu_#URnJ8YGH$0szYyh=3fOrq4)OYQ@iImEFWCG>brH{ zw=Q@z_u_KD6@k9Jhz-}{Ag%8b-Bs}_vax`ex@}fGc2?#VWH>oA*)#jtYj*sxx-2pF zDY=wAVi`U?f=f1*2A`f*kZO}lME2mHkk_kh?|}cFP6({`De4NM?)~$(2XuG#*IkJ! z2Vjy_wz__5+h?d(c~vZhR?mL%2haZy{#W)y;~|Ssj!U4dKc3TeDlKy@3HQe=)x)We z{IoSi_17IeQ}%i7jrIYA5*NY8fV2z@PFlbr(*&Ox-;{~5nBFU>Fh<_=S+J}II%?g( ztLIr6;<^o_WBlemdxOm6kiowMBQG6ihi-T(IT#`EIV2R=B)hfVrHVzbn_u=Jcj+}5 z$(FcviUH?)nIO%kWL@&x0N(ErYl=ikfPgBwQMrfrQBt90;^h z@x1(~*zY1j&HJ;3f@`6-_1+K zZ#Z6J*KECNRY%qypER{nNji<6DtKFI*HaA>Kqk-d8`@>@>2(&tzqRM=K?4$-)7BRY z6kas=@e6d?etW}5(|{?5JZs&qO=m7-#;c51q`!{SqqrSIqNbZrFx}OI1nP{@cVDo$^z$euJ0;|)J-E%b~{dZ;MA;c36i`H0tO1tj_y z@LI1)2ZAO12&zUsuyW5lyB?wyW0Ouqp-O|DS!J!d_hf?-f6o^dMTjeBa~Coi1fq0nH7a}nC7aAEKF zF`SU%I@7~W^7e$xOdt6`Pngho4Wn;0nc#X}UwWQTpsg¬f$em?~8(LfLDIU$0wP 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 Go&Og&lWLy; literal 0 HcmV?d00001 diff --git a/browser-extension/chrome/assets/store/screenshot-3-tree-view-1280x800.png b/browser-extension/chrome/assets/store/screenshot-3-tree-view-1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..193def163195650e9cade5cd099c43934ed4158e GIT binary patch literal 24732 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%0A^hsVqpn*$+|s}T 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%0ATf)rV7J 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 D#t6qf literal 0 HcmV?d00001 diff --git a/browser-extension/chrome/assets/store/store-icon-128.png b/browser-extension/chrome/assets/store/store-icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..8658432dfab6bebdaeaef4235d12981e9e4caeff GIT binary patch literal 1659 zcmZ8hc~BE}6a57tM2-~XiX3t%Rv@F*FC672hSM4#C4{IPwtfV#5GuFQhNDElhD%VC zf+3QETEbysEC~{d7HbqRs34{MRZ&nR8Ws$*Z91eut#-gQZAI|H=WsJWke$(Y$SEuFA2P`l$#>%p z>7VvKbd?PZ4CursZ8ra3qsP5sj(K$SP8L|4zCo*0?p$@@9PoLxnru%hsJn@s6{p&5 zWVtRDCA(Lya4mAU>gt@Bx`2a(zHg;Z8ByE(hwih>xa(FV^sJU-VvkF zOLJdA9QM6DX%+(;K|E{jbLg_4|BQZ1D$@ zb;+~UMv+u+M`Vg=@e2DX_01V+X6{Tn!sUcRZ5M8UWZWLwa0T>= z+1&t-a-Z;|tIgcLeui5vwfaMuOhT8vtwBt1erwoD6A0W*j?Z^Hl_K3zi69(_tyGvPC z8~mKZs$Am3clwI;Z5U9BgR9zsUT$P3%r`uSBG0DpQxsm2DHv(k@425(%XT9*!iryh zC8@HUj`L7>XbSW+Z77By@eX-QZ0SB}nYQA=yzs6}N$G4m1;|^NGtlu%v%=N2c0bkE z!~q~2{7Cq^5CjQz1#{zBk`MQERn7}v#U9(f?6Liy?omC!;I@`Ax)O4q;HhP-p;6HT z^R=}DMPXL}|CUMadSUNihsjU%N3_7c!o}uDh|Pk#TWpe9o_R5d+N%-wD=cru4qQ0* zk3fmJ`BTT00c1-<;GjXb)%a|?L7t{T-kSg4b2|*rYjtr2Zb-CH0*#Y5h=?sAW;$)r zj0_#$T=Z-Oyw7jW(?5oXIcWmi_of7$ouH?;L)H2JYYUd13|+dCSp)C;a!S5sm0R6q zegV!=^ zCyqJOC|kC;|I(h6wvkDixqW>8gn8`xi6Ne#|HPzQ_9_R+$!OTzh@a=E6Jo}S0(qZT*gjs z+*cpo^sujlIF51Ddu^H!_@fzXKC{95z)NZ9fu-^RO;?fvQC&6{zIe5XnBQPJYZ^|v zW__tyX)F3hcrsQ$QqnB1)ru>{cPm4Sxzxn`-z?y19XO|rT|W)=^jg5>Lr0|?7IMnl zMBwMdeKXQa<6DgxCZu?N#6MqrgdPip-Xgv>>4C66OShAm$Sl9uzf_*oF+N=6QaYId zX)r)7Wje06xWb?8|8z0yDfVF32=7q0oF7ly)nI71;n*!==R_83dqo{fcxTe4_1;DV u#qmp~TV0}+uB_W__|tXT|NX>(9=!I+N`Fw10YbXCnGE*FVp!<7g1-P0ss>~L literal 0 HcmV?d00001 diff --git a/browser-extension/chrome/manifest.json b/browser-extension/chrome/manifest.json new file mode 100644 index 0000000..8ebf24b --- /dev/null +++ b/browser-extension/chrome/manifest.json @@ -0,0 +1,24 @@ +{ + "manifest_version": 3, + "name": "API Response Comparator", + "description": "Compare JSON API responses across Dev, QA, and Prod from a browser popup.", + "version": "0.1.0", + "icons": { + "16": "assets/icons/icon-16.png", + "32": "assets/icons/icon-32.png", + "48": "assets/icons/icon-48.png", + "128": "assets/icons/icon-128.png" + }, + "action": { + "default_title": "API Response Comparator", + "default_popup": "popup.html", + "default_icon": { + "16": "assets/icons/icon-16.png", + "32": "assets/icons/icon-32.png", + "48": "assets/icons/icon-48.png", + "128": "assets/icons/icon-128.png" + } + }, + "permissions": ["storage", "clipboardWrite"], + "host_permissions": ["https://*/*"] +} diff --git a/browser-extension/chrome/popup.css b/browser-extension/chrome/popup.css new file mode 100644 index 0000000..e55f80f --- /dev/null +++ b/browser-extension/chrome/popup.css @@ -0,0 +1,440 @@ +:root { + color-scheme: light; + --bg: #f7f8fb; + --panel: #ffffff; + --panel-soft: #eef2f7; + --text: #111827; + --muted: #64748b; + --line: #d8dee8; + --brand: #0f766e; + --brand-strong: #115e59; + --danger: #b91c1c; + --added: #047857; + --removed: #b91c1c; + --changed: #b45309; + --type: #7c3aed; + --shadow: 0 1px 2px rgb(15 23 42 / 8%); +} + +body.theme-dark { + color-scheme: dark; + --bg: #111318; + --panel: #1a1d24; + --panel-soft: #242936; + --text: #f8fafc; + --muted: #9aa4b2; + --line: #303746; + --brand: #2dd4bf; + --brand-strong: #5eead4; + --danger: #f87171; +} + +* { + box-sizing: border-box; +} + +body { + width: 820px; + min-height: 600px; + margin: 0; + background: var(--bg); + color: var(--text); + font: 13px/1.45 system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +button, +input, +textarea { + font: inherit; +} + +button { + border: 1px solid transparent; + border-radius: 7px; + background: var(--brand); + color: #ffffff; + cursor: pointer; + font-weight: 700; + min-height: 34px; + padding: 7px 12px; +} + +button:hover { + background: var(--brand-strong); +} + +button:disabled { + cursor: not-allowed; + opacity: 0.65; +} + +.shell { + padding: 14px; +} + +.header, +.header-actions, +.actions, +.tools, +.summary, +.result-toolbar, +.mini-actions, +.env-head { + display: flex; + gap: 8px; +} + +.header { + align-items: start; + justify-content: space-between; + margin-bottom: 12px; +} + +.header-actions { + flex-shrink: 0; +} + +h1 { + font-size: 18px; + letter-spacing: 0; + line-height: 1.2; + margin: 0; +} + +h2 { + font-size: 13px; + letter-spacing: 0; + margin: 0; +} + +p { + color: var(--muted); + margin: 4px 0 0; +} + +.icon-button, +.mini-button, +.file-button, +.secondary, +.mode-button, +.count, +.view-button { + background: var(--panel); + border-color: var(--line); + color: var(--text); +} + +.icon-button:hover, +.mini-button:hover, +.file-button:hover, +.secondary:hover, +.mode-button:hover, +.count:hover, +.view-button:hover, +.mode-button.active, +.count.active, +.view-button.active { + background: var(--panel-soft); +} + +.icon-button, +.mini-button, +.file-button { + align-items: center; + display: inline-flex; + justify-content: center; + min-width: 34px; + padding: 0; +} + +.mini-button, +.file-button { + min-height: 26px; + min-width: 26px; +} + +.file-button { + border: 1px solid var(--line); + border-radius: 7px; + cursor: pointer; + font-weight: 800; +} + +.mode-bar { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 8px; + margin-bottom: 10px; +} + +.mode-panel, +.table-wrap, +.tree-panel, +.suggestions { + background: var(--panel); + border: 1px solid var(--line); + border-radius: 8px; + box-shadow: var(--shadow); +} + +.mode-panel { + padding: 10px; +} + +.hidden, +.file-input { + display: none !important; +} + +.env-grid { + display: grid; + gap: 10px; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.env-card, +.field { + display: grid; + gap: 5px; +} + +.env-head { + align-items: center; + justify-content: space-between; +} + +.env-head label, +.field span { + color: var(--muted); + font-weight: 700; +} + +textarea, +input { + background: var(--bg); + border: 1px solid var(--line); + border-radius: 7px; + color: var(--text); + min-width: 0; + outline: none; + padding: 8px; +} + +textarea:focus, +input:focus { + border-color: var(--brand); + box-shadow: 0 0 0 2px color-mix(in srgb, var(--brand), transparent 78%); +} + +textarea { + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + height: 132px; + resize: vertical; +} + +.actions { + justify-content: end; + margin-top: 10px; +} + +.tools { + align-items: end; + margin: 12px 0 8px; +} + +.compact { + flex: 1; +} + +.tall { + min-height: 36px; +} + +.status { + color: var(--danger); + min-height: 20px; +} + +.suggestions { + display: grid; + gap: 6px; + margin: 8px 0; + max-height: 92px; + overflow: auto; + padding: 8px; +} + +.suggestion { + align-items: center; + display: grid; + gap: 8px; + grid-template-columns: minmax(0, 1fr) auto auto; +} + +.suggestion strong, +.tree-key, +.mono { + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; +} + +.suggestion small { + color: var(--muted); +} + +.summary { + flex-wrap: wrap; + margin: 6px 0 10px; +} + +.count { + align-items: center; + display: inline-flex; + gap: 6px; +} + +.result-toolbar { + align-items: center; + justify-content: end; + margin-bottom: 8px; +} + +.contract-alert { + color: var(--danger); + font-weight: 800; + margin-right: auto; +} + +.view-tabs { + display: inline-flex; + gap: 4px; + margin-right: auto; +} + +.contract-alert:not(.hidden) + .view-tabs { + margin-left: 8px; + margin-right: 0; +} + +.table-wrap { + max-height: 260px; + overflow: auto; +} + +table { + border-collapse: collapse; + min-width: 100%; +} + +th, +td { + border-bottom: 1px solid var(--line); + max-width: 210px; + padding: 8px; + text-align: left; + vertical-align: top; +} + +th { + background: var(--panel-soft); + position: sticky; + top: 0; + z-index: 1; +} + +td { + overflow-wrap: anywhere; +} + +.empty { + color: var(--muted); + text-align: center; +} + +.badge { + border-radius: 999px; + color: #ffffff; + display: inline-block; + font-size: 11px; + font-weight: 800; + padding: 3px 7px; +} + +.ADDED, +.tree-node.ADDED > .tree-line { + background: color-mix(in srgb, var(--added), transparent 84%); +} + +.REMOVED, +.tree-node.REMOVED > .tree-line { + background: color-mix(in srgb, var(--removed), transparent 84%); +} + +.CHANGED, +.tree-node.CHANGED > .tree-line { + background: color-mix(in srgb, var(--changed), transparent 84%); +} + +.TYPE_CHANGE, +.tree-node.TYPE_CHANGE > .tree-line { + background: color-mix(in srgb, var(--type), transparent 84%); +} + +.badge.ADDED { + background: var(--added); +} + +.badge.REMOVED { + background: var(--removed); +} + +.badge.CHANGED { + background: var(--changed); +} + +.badge.TYPE_CHANGE { + background: var(--type); +} + +.tree-grid { + display: grid; + gap: 10px; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.tree-panel { + min-height: 220px; + overflow: hidden; +} + +.tree-panel h2 { + background: var(--panel-soft); + border-bottom: 1px solid var(--line); + padding: 8px; +} + +.tree-body { + max-height: 240px; + overflow: auto; + padding: 8px; +} + +.tree-node { + margin-left: 12px; +} + +.tree-node.root { + margin-left: 0; +} + +.tree-line { + border-radius: 6px; + display: flex; + gap: 6px; + min-height: 24px; + padding: 3px 5px; +} + +.tree-value { + color: var(--muted); + overflow-wrap: anywhere; +} diff --git a/browser-extension/chrome/popup.html b/browser-extension/chrome/popup.html new file mode 100644 index 0000000..826b757 --- /dev/null +++ b/browser-extension/chrome/popup.html @@ -0,0 +1,180 @@ + + + + + + API Response Comparator + + + +
+
+
+

API Response Comparator

+

Compare Dev, QA, and Prod responses from JSON, URL, or cURL.

+
+
+ + +
+
+ +
+ + + +
+ +
+
+
+
+ +
+ + +
+
+ + +
+
+
+ +
+ + +
+
+ + +
+
+
+ +
+ + +
+
+ + +
+
+
+ + +
+
+ + + + + +
+ + + +
+ + +
+ +
+ + + + + +
+ +
+ +
+ + +
+ + + +
+ +
+ + + + + + + + + + + + + + + +
PathTypeDevQAProd
No comparison yet.
+
+ + +
+ + + diff --git a/browser-extension/chrome/popup.js b/browser-extension/chrome/popup.js new file mode 100644 index 0000000..6ad435b --- /dev/null +++ b/browser-extension/chrome/popup.js @@ -0,0 +1,970 @@ +const ENVIRONMENTS = [ + { id: 'dev', label: 'Dev', valueKey: 'devValue' }, + { id: 'qa', label: 'QA', valueKey: 'qaValue' }, + { id: 'prod', label: 'Prod', valueKey: 'prodValue' }, +]; +const DATA_FLAGS = new Set(['-d', '--data', '--data-raw', '--data-binary', '--data-ascii']); +const SUGGESTION_THRESHOLD = 60; +const MAX_REQUEST_BODY_SIZE = 1024 * 1024; +const STRONG_VOLATILE_NAME_PATTERNS = [ + /timestamp/i, + /time/i, + /date/i, + /createdAt/i, + /updatedAt/i, + /requestId/i, + /traceId/i, + /correlationId/i, + /sessionId/i, + /token/i, + /uuid/i, + /guid/i, + /nonce/i, + /etag/i, + /version/i, +]; +const TEMPORAL_NAME_PATTERN = /(?:lastLogin|lastSeen|lastModified|expires|expiry|generated|modified)/i; +const WEAK_IDENTIFIER_NAME_PATTERN = /(?:tracking|transaction|operation|event|message)Id$/i; +const NOISY_PATH_SEGMENTS = new Set(['headers', 'metadata', 'audit', 'debug', 'links']); +const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; +const ISO_DATETIME_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/; +const EPOCH_PATTERN = /^\d{10,13}$/; +const PREFIXED_IDENTIFIER_PATTERN = /^[A-Z][A-Z0-9]{0,9}-[A-Z0-9]{6,}$/i; +const TOKEN_PATTERN = /^[A-Za-z0-9-_]{20,}$/; +const BLOCKED_REQUEST_HEADERS = new Set([ + 'connection', + 'content-length', + 'host', + 'origin', + 'proxy-authorization', + 'proxy-connection', + 'referer', + 'transfer-encoding', + 'upgrade', +]); + +const state = { + mode: 'json', + view: 'table', + theme: 'light', + diffs: [], + filter: 'ALL', + suggestions: [], + compared: { dev: undefined, qa: undefined, prod: undefined }, + active: { dev: false, qa: false, prod: false }, + urlController: undefined, + curlController: undefined, +}; + +const draftIds = [ + 'devJson', + 'qaJson', + 'prodJson', + 'devUrl', + 'qaUrl', + 'prodUrl', + 'devCurl', + 'qaCurl', + 'prodCurl', + 'ignoreFields', + 'pathSearch', +]; + +const elementIds = [ + ...draftIds, + 'jsonMode', + 'urlMode', + 'curlMode', + 'status', + 'suggestions', + 'diffTable', + 'contractAlert', + 'tableView', + 'treeView', + 'devTree', + 'qaTree', + 'prodTree', + 'countAll', + 'countAdded', + 'countRemoved', + 'countChanged', + 'countType', + 'compareJsonButton', + 'formatButton', + 'fetchButton', + 'curlButton', + 'suggestButton', + 'copyButton', + 'downloadButton', + 'excelButton', + 'resetButton', + 'themeButton', +]; + +const elements = Object.fromEntries(elementIds.map((id) => [id, document.getElementById(id)])); + +document.addEventListener('DOMContentLoaded', async () => { + await restoreDraft(); + bindEvents(); + render(); +}); + +function bindEvents() { + document.querySelectorAll('.mode-button').forEach((button) => { + button.addEventListener('click', () => setMode(button.dataset.mode)); + }); + + document.querySelectorAll('.view-button').forEach((button) => { + button.addEventListener('click', () => { + state.view = button.dataset.view; + persistDraft(); + render(); + }); + }); + + document.querySelectorAll('.count').forEach((button) => { + button.addEventListener('click', () => { + state.filter = button.dataset.filter; + render(); + }); + }); + + document.querySelectorAll('[data-clear]').forEach((button) => { + button.addEventListener('click', () => { + elements[button.dataset.clear].value = ''; + persistDraft(); + clearSourceDerivedState(); + }); + }); + + document.querySelectorAll('.file-input').forEach((input) => { + input.addEventListener('change', handleFileUpload); + }); + + draftIds.forEach((id) => { + elements[id].addEventListener('input', () => { + persistDraft(); + if (id === 'pathSearch') { + render(); + } else { + clearSourceDerivedState(); + } + }); + }); + + elements.compareJsonButton.addEventListener('click', compareFromJson); + elements.formatButton.addEventListener('click', formatJsonInputs); + elements.fetchButton.addEventListener('click', compareFromUrls); + elements.curlButton.addEventListener('click', compareFromCurl); + elements.suggestButton.addEventListener('click', generateSuggestions); + elements.copyButton.addEventListener('click', copyDiffs); + elements.downloadButton.addEventListener('click', downloadJson); + elements.excelButton.addEventListener('click', downloadExcel); + elements.resetButton.addEventListener('click', resetAll); + elements.themeButton.addEventListener('click', toggleTheme); +} + +function setMode(mode) { + state.mode = mode; + document.querySelectorAll('.mode-button').forEach((button) => { + button.classList.toggle('active', button.dataset.mode === mode); + }); + elements.jsonMode.classList.toggle('hidden', mode !== 'json'); + elements.urlMode.classList.toggle('hidden', mode !== 'url'); + elements.curlMode.classList.toggle('hidden', mode !== 'curl'); + clearStatus(); + persistDraft(); +} + +function toggleTheme() { + state.theme = state.theme === 'dark' ? 'light' : 'dark'; + applyTheme(); + persistDraft(); +} + +function applyTheme() { + document.body.classList.toggle('theme-dark', state.theme === 'dark'); + elements.themeButton.textContent = state.theme === 'dark' ? '☼' : '◐'; +} + +async function handleFileUpload(event) { + const input = event.currentTarget; + const file = input.files?.[0]; + if (!file) return; + + try { + const text = await file.text(); + JSON.parse(text); + elements[input.dataset.target].value = text; + persistDraft(); + clearSourceDerivedState(); + clearStatus(); + } catch { + showStatus(`${file.name} does not contain valid JSON.`); + } finally { + input.value = ''; + } +} + +function compareFromJson() { + const parsed = parseModeJson(); + if (!parsed) return; + compareParsed(parsed.values, parsed.active, getIgnoreFields()); +} + +async function compareFromUrls() { + const urls = getEnvironmentInputValues('Url'); + if (Object.values(urls).filter(Boolean).length < 2) { + showStatus('Provide at least two HTTPS URLs.'); + return; + } + + state.urlController?.abort(); + state.urlController = new AbortController(); + setLoading('url', true); + + try { + const results = await Promise.all( + ENVIRONMENTS.map(({ id, label }) => + fetchOptionalJson(urls[id], label, state.urlController.signal), + ), + ); + compareParsed( + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].value])), + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].active])), + [], + ); + } catch (error) { + if (!isAbortError(error)) { + showStatus(error instanceof Error ? error.message : 'Unable to fetch URLs.'); + } + } finally { + setLoading('url', false); + } +} + +async function compareFromCurl() { + const commands = getEnvironmentInputValues('Curl'); + if (Object.values(commands).filter(Boolean).length < 2) { + showStatus('Provide at least two cURL commands.'); + return; + } + + state.curlController?.abort(); + state.curlController = new AbortController(); + setLoading('curl', true); + + try { + const results = await Promise.all( + ENVIRONMENTS.map(({ id, label }) => + fetchOptionalCurlJson(commands[id], label, state.curlController.signal), + ), + ); + compareParsed( + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].value])), + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].active])), + [], + ); + } catch (error) { + if (!isAbortError(error)) { + showStatus(error instanceof Error ? error.message : 'Unable to import cURL commands.'); + } + } finally { + setLoading('curl', false); + } +} + +function compareParsed(values, active, ignoreFields) { + if (Object.values(active).filter(Boolean).length < 2) { + showStatus('Provide at least two populated environments.'); + return; + } + + state.compared = values; + state.active = active; + state.diffs = compareJson(values.dev, values.qa, values.prod, ignoreFields, active); + state.filter = 'ALL'; + state.suggestions = []; + showStatus(state.diffs.length ? '' : 'No differences found.'); + render(); +} + +function parseModeJson() { + const values = {}; + const active = {}; + for (const { id, label } of ENVIRONMENTS) { + const result = parseOptionalJson(elements[`${id}Json`].value, label); + if (!result.ok) return undefined; + values[id] = result.value; + active[id] = result.active; + } + return { values, active }; +} + +function formatJsonInputs() { + const updates = []; + for (const { id, label } of ENVIRONMENTS) { + const input = elements[`${id}Json`].value.trim(); + if (!input) continue; + try { + updates.push([`${id}Json`, JSON.stringify(JSON.parse(input), null, 2)]); + } catch { + showStatus(`${label} contains invalid JSON.`); + return; + } + } + updates.forEach(([id, value]) => { + elements[id].value = value; + }); + persistDraft(); + clearSourceDerivedState(); + clearStatus(); +} + +async function fetchOptionalJson(url, label, signal) { + if (!url.trim()) return { active: false, value: undefined }; + validateExtensionUrl(url, label); + + const response = await fetch(url, { + credentials: 'omit', + cache: 'no-store', + headers: { Accept: 'application/json' }, + signal, + }); + return parseJsonResponse(response, label); +} + +async function fetchOptionalCurlJson(command, label, signal) { + if (!command.trim()) return { active: false, value: undefined }; + const request = parseCurlCommand(command); + validateExtensionUrl(request.url, label); + if (request.body && new TextEncoder().encode(request.body).byteLength > MAX_REQUEST_BODY_SIZE) { + throw new Error(`${label} cURL request body is too large.`); + } + + const method = request.method.toUpperCase(); + const response = await fetch(request.url, { + method, + headers: sanitizeRequestHeaders(request.headers), + body: method === 'GET' || method === 'HEAD' ? undefined : request.body, + credentials: 'omit', + cache: 'no-store', + signal, + }); + return parseJsonResponse(response, label); +} + +async function parseJsonResponse(response, label) { + const text = await response.text(); + if (!response.ok) { + throw new Error(`${label} request failed: ${response.status} ${response.statusText}${text ? ` - ${text.slice(0, 240)}` : ''}`); + } + try { + return { active: true, value: JSON.parse(text) }; + } catch { + throw new Error(`${label} did not return valid JSON.`); + } +} + +function validateExtensionUrl(url, label) { + const target = new URL(url); + if (target.protocol !== 'https:') { + throw new Error(`${label} URL must start with https://`); + } +} + +function parseOptionalJson(input, label) { + if (!input.trim()) return { ok: true, active: false, value: undefined }; + try { + return { ok: true, active: true, value: JSON.parse(input) }; + } catch { + showStatus(`${label} contains invalid JSON.`); + return { ok: false, active: false, value: undefined }; + } +} + +function parseCurlCommand(command) { + const tokens = tokenizeCurl(command.trim()); + if (tokens[0]?.toLowerCase() !== 'curl') throw new Error('Command must start with curl'); + + let url = ''; + let method = ''; + let useGet = false; + const headers = {}; + const dataParts = []; + + for (let index = 1; index < tokens.length; index += 1) { + const token = tokens[index]; + if (token === '-X' || token === '--request') { + method = readFlagValue(tokens, ++index, token).toUpperCase(); + continue; + } + if (token === '-H' || token === '--header') { + const header = readFlagValue(tokens, ++index, token); + const separator = header.indexOf(':'); + if (separator <= 0) throw new Error(`Invalid header: ${header}`); + headers[header.slice(0, separator).trim()] = header.slice(separator + 1).trim(); + continue; + } + if (DATA_FLAGS.has(token)) { + const data = readFlagValue(tokens, ++index, token); + if (data.startsWith('@')) throw new Error('File-based cURL data is not supported'); + dataParts.push(data); + continue; + } + if (token === '-G' || token === '--get') { + useGet = true; + continue; + } + if (token === '--url') { + url = readFlagValue(tokens, ++index, token); + continue; + } + if (token === '-u' || token === '--user') { + headers.Authorization = `Basic ${btoa(readFlagValue(tokens, ++index, token))}`; + continue; + } + if (['--compressed', '-s', '--silent', '-L', '--location'].includes(token)) continue; + if (token === '-b' || token === '--cookie') { + headers.Cookie = readFlagValue(tokens, ++index, token); + continue; + } + if (token === '-A' || token === '--user-agent') { + headers['User-Agent'] = readFlagValue(tokens, ++index, token); + continue; + } + if (token === '-e' || token === '--referer') { + headers.Referer = readFlagValue(tokens, ++index, token); + continue; + } + if (token.startsWith('-')) throw new Error(`Unsupported cURL option: ${token}`); + if (url) throw new Error('cURL command contains more than one URL'); + url = token; + } + + if (!url) throw new Error('cURL command does not contain a URL'); + let body = dataParts.length ? dataParts.join('&') : undefined; + if (useGet && body) { + const target = new URL(url); + target.search += `${target.search ? '&' : ''}${body}`; + url = target.toString(); + body = undefined; + } + return { url, method: method || (body ? 'POST' : 'GET'), headers, ...(body === undefined ? {} : { body }) }; +} + +function tokenizeCurl(command) { + if (!command) throw new Error('cURL command is empty'); + const normalized = command.replace(/\\\r?\n/g, ' '); + const tokens = []; + let current = ''; + let quote; + + for (let index = 0; index < normalized.length; index += 1) { + const character = normalized[index]; + if (quote) { + if (character === quote) quote = undefined; + else if (character === '\\' && quote === '"' && index + 1 < normalized.length) current += normalized[++index]; + else current += character; + continue; + } + if (character === "'" || character === '"') { + quote = character; + continue; + } + if ( + character === '|' || + character === ';' || + character === '<' || + character === '>' || + character === '`' || + (character === '$' && normalized[index + 1] === '(') + ) { + throw new Error('Shell operators are not supported'); + } + if (/\s/.test(character)) { + if (current) { + tokens.push(current); + current = ''; + } + continue; + } + if (character === '\\' && index + 1 < normalized.length) { + current += normalized[++index]; + continue; + } + current += character; + } + + if (quote) throw new Error('cURL command contains an unclosed quote'); + if (current) tokens.push(current); + return tokens; +} + +function readFlagValue(tokens, index, flag) { + const value = tokens[index]; + if (value === undefined) throw new Error(`${flag} requires a value`); + return value; +} + +function sanitizeRequestHeaders(headers) { + return Object.entries(headers ?? {}).reduce((safeHeaders, [name, value]) => { + const normalizedName = name.trim().toLowerCase(); + if (!normalizedName || BLOCKED_REQUEST_HEADERS.has(normalizedName)) return safeHeaders; + safeHeaders[normalizedName] = value; + return safeHeaders; + }, {}); +} + +function compareJson(devJson, qaJson, prodJson, ignoreFields, comparedEnvironments) { + const environments = [ + { key: 'devValue', active: comparedEnvironments.dev, root: devJson, values: comparedEnvironments.dev ? flatten(devJson) : {} }, + { key: 'qaValue', active: comparedEnvironments.qa, root: qaJson, values: comparedEnvironments.qa ? flatten(qaJson) : {} }, + { key: 'prodValue', active: comparedEnvironments.prod, root: prodJson, values: comparedEnvironments.prod ? flatten(prodJson) : {} }, + ].filter((environment) => environment.active); + + const paths = Array.from(new Set(environments.flatMap((environment) => Object.keys(environment.values)))).sort((left, right) => + left.localeCompare(right), + ); + + return paths.reduce((diffs, path) => { + if (isIgnoredPath(path, ignoreFields)) return diffs; + const values = environments.map((environment) => ({ + ...environment, + comparable: getComparableValue(environment.root, environment.values, path), + })); + const baseline = values[0].comparable; + const diffsByType = new Map(); + + values.slice(1).forEach(({ key, comparable }) => { + const type = getDiffType(baseline, comparable); + if (!type) return; + let diff = diffsByType.get(type); + if (!diff) { + diff = { path, type }; + if (baseline.found) diff[values[0].key] = baseline.value; + diffsByType.set(type, diff); + } + if (comparable.found) diff[key] = comparable.value; + }); + + diffs.push(...diffsByType.values()); + return diffs; + }, []); +} + +function flatten(value) { + const result = {}; + visit(value, '', result); + return result; +} + +function visit(value, path, result) { + if (Array.isArray(value)) { + if (value.length === 0) { + result[path] = value; + return; + } + value.forEach((item, index) => visit(item, `${path}[${index}]`, result)); + return; + } + if (value && typeof value === 'object') { + const entries = Object.entries(value); + if (entries.length === 0) { + result[path] = value; + return; + } + entries.forEach(([key, childValue]) => visit(childValue, path ? `${path}.${key}` : key, result)); + return; + } + result[path] = value; +} + +function getDiffType(baseline, target) { + if (!baseline.found && !target.found) return undefined; + if (!baseline.found) return 'ADDED'; + if (!target.found) return 'REMOVED'; + if (JSON.stringify(baseline.value) === JSON.stringify(target.value)) return undefined; + if (baseline.value === null || target.value === null) return 'CHANGED'; + return getJsonType(baseline.value) === getJsonType(target.value) ? 'CHANGED' : 'TYPE_CHANGE'; +} + +function getComparableValue(root, flattened, path) { + if (Object.prototype.hasOwnProperty.call(flattened, path)) { + return { found: true, value: flattened[path] }; + } + return getValueAtPath(root, path); +} + +function getValueAtPath(root, path) { + if (path === '') return { found: true, value: root }; + const segments = path.match(/[^.[\]]+/g); + if (!segments) return { found: false, value: undefined }; + let current = root; + + for (const segment of segments) { + if (current === null || typeof current !== 'object') return { found: false, value: undefined }; + if (Array.isArray(current)) { + const index = Number(segment); + if (!Number.isInteger(index) || index < 0 || index >= current.length) return { found: false, value: undefined }; + current = current[index]; + } else { + if (!Object.prototype.hasOwnProperty.call(current, segment)) return { found: false, value: undefined }; + current = current[segment]; + } + } + return { found: true, value: current }; +} + +function isIgnoredPath(path, ignoreFields) { + if (!ignoreFields.length) return false; + const segments = path.split(/[.[\]]+/).filter(Boolean); + return segments.some((segment) => ignoreFields.includes(segment)); +} + +function getJsonType(value) { + if (value === null) return 'null'; + if (Array.isArray(value)) return 'array'; + return typeof value; +} + +function generateSuggestions() { + if (!state.diffs.length) { + showStatus('Compare responses before generating ignore rules.'); + return; + } + state.suggestions = generateIgnoreSuggestions(state.diffs); + if (!state.suggestions.length) showStatus('No volatile ignore rules detected.'); + renderSuggestions(); +} + +function generateIgnoreSuggestions(diffs) { + const changedDiffs = diffs.filter((diff) => diff.type === 'CHANGED'); + const pathFrequencies = countNormalizedPaths(changedDiffs); + const suggestions = new Map(); + + changedDiffs.forEach((diff) => { + const normalizedPath = normalizeArrayPath(diff.path); + const reasons = []; + let score = 0; + const nameResult = scoreFieldName(diff.path); + score += nameResult.score; + if (nameResult.reason) reasons.push(nameResult.reason); + const valueResult = scoreValues([diff.devValue, diff.qaValue, diff.prodValue]); + score += valueResult.score; + if (valueResult.reason) reasons.push(valueResult.reason); + if (looksLikeNoisyPath(diff.path)) { + score += 20; + reasons.push('path belongs to a noisy metadata area'); + } + const frequency = pathFrequencies.get(normalizedPath) ?? 0; + if (frequency >= 10) { + score += 30; + reasons.push('field changes repeatedly across 10 or more array items'); + } else if (frequency >= 3) { + score += 20; + reasons.push('field changes repeatedly across array items'); + } else if (frequency >= 2) { + score += 10; + reasons.push('field changes repeatedly across array items'); + } + if (score < SUGGESTION_THRESHOLD) return; + const suggestion = { path: normalizedPath, score, confidence: getConfidence(score), reason: reasons.join(', ') }; + const existing = suggestions.get(normalizedPath); + if (!existing || suggestion.score > existing.score) suggestions.set(normalizedPath, suggestion); + }); + + return Array.from(suggestions.values()).sort((left, right) => right.score - left.score || left.path.localeCompare(right.path)); +} + +function countNormalizedPaths(diffs) { + return Array.from(new Set(diffs.map((diff) => diff.path))).reduce((frequencies, diffPath) => { + const path = normalizeArrayPath(diffPath); + frequencies.set(path, (frequencies.get(path) ?? 0) + 1); + return frequencies; + }, new Map()); +} + +function scoreFieldName(path) { + const leaf = getIgnoreFieldFromPath(path); + if (!leaf) return { score: 0 }; + if (STRONG_VOLATILE_NAME_PATTERNS.some((pattern) => pattern.test(leaf))) return { score: 50, reason: 'field name looks dynamic' }; + if (TEMPORAL_NAME_PATTERN.test(leaf)) return { score: 25, reason: 'field name looks time-based' }; + if (WEAK_IDENTIFIER_NAME_PATTERN.test(leaf)) return { score: 20, reason: 'field name looks like a generated identifier' }; + return { score: 0 }; +} + +function scoreValues(values) { + return values.map(scoreValue).sort((left, right) => right.score - left.score)[0]; +} + +function scoreValue(value) { + const text = typeof value === 'number' ? String(value) : value; + if (typeof text !== 'string') return { score: 0 }; + if (UUID_PATTERN.test(text)) return { score: 40, reason: 'value looks like a UUID' }; + if (ISO_DATETIME_PATTERN.test(text)) return { score: 40, reason: 'value looks time-based' }; + if (EPOCH_PATTERN.test(text)) return { score: 35, reason: 'value looks like an epoch timestamp' }; + if (PREFIXED_IDENTIFIER_PATTERN.test(text)) return { score: 30, reason: 'value looks like a generated identifier' }; + if (TOKEN_PATTERN.test(text)) return { score: 30, reason: 'value looks like a generated token' }; + return { score: 0 }; +} + +function normalizeArrayPath(path) { + return path.replace(/\[\d+\]/g, '[*]'); +} + +function getIgnoreFieldFromPath(path) { + const segments = path.match(/[^.[\]]+/g); + const leaf = segments?.at(-1); + return leaf && leaf !== '*' && !/^\d+$/.test(leaf) ? leaf : undefined; +} + +function looksLikeNoisyPath(path) { + const segments = path.toLowerCase().split(/[.[\]]+/).filter(Boolean); + return segments.some((segment) => NOISY_PATH_SEGMENTS.has(segment)); +} + +function getConfidence(score) { + if (score >= 80) return 'High'; + if (score >= SUGGESTION_THRESHOLD) return 'Medium'; + return 'Low'; +} + +function render() { + updateCounts(); + renderModeAndView(); + renderTable(); + renderTrees(); + renderSuggestions(); + elements.contractAlert.classList.toggle('hidden', !state.diffs.some((diff) => ['ADDED', 'REMOVED', 'TYPE_CHANGE'].includes(diff.type))); +} + +function renderModeAndView() { + document.querySelectorAll('.count').forEach((button) => { + button.classList.toggle('active', button.dataset.filter === state.filter); + }); + document.querySelectorAll('.view-button').forEach((button) => { + button.classList.toggle('active', button.dataset.view === state.view); + }); + elements.tableView.classList.toggle('hidden', state.view !== 'table'); + elements.treeView.classList.toggle('hidden', state.view !== 'tree'); +} + +function renderTable() { + const visibleDiffs = getVisibleDiffs(); + if (!visibleDiffs.length) { + elements.diffTable.innerHTML = `${state.diffs.length ? 'No matching differences.' : 'No comparison yet.'}`; + return; + } + elements.diffTable.innerHTML = visibleDiffs + .map( + (diff) => ` + + ${escapeHtml(diff.path || '(root)')} + ${escapeHtml(diff.type)} + ${escapeHtml(formatValue(diff.devValue))} + ${escapeHtml(formatValue(diff.qaValue))} + ${escapeHtml(formatValue(diff.prodValue))} + + `, + ) + .join(''); +} + +function renderTrees() { + ENVIRONMENTS.forEach(({ id }) => { + const value = state.active[id] ? state.compared[id] : undefined; + elements[`${id}Tree`].innerHTML = value === undefined ? '
No active input.
' : renderTreeNode(value, id, '', '(root)', true); + }); +} + +function renderTreeNode(value, environmentId, path, label, isRoot = false) { + const diff = selectTreeDiff(path, environmentId); + const className = diff ? diff.type : ''; + if (Array.isArray(value)) { + const children = value.length + ? value.map((item, index) => renderTreeNode(item, environmentId, `${path}[${index}]`, `[${index}]`)).join('') + : '
[]
'; + return `
+
${escapeHtml(label)}Array(${value.length})
${children} +
`; + } + if (value && typeof value === 'object') { + const entries = Object.entries(value); + const children = entries.length + ? entries.map(([key, childValue]) => renderTreeNode(childValue, environmentId, path ? `${path}.${key}` : key, key)).join('') + : '
{}
'; + return `
+
${escapeHtml(label)}Object
${children} +
`; + } + return `
+
${escapeHtml(label)}${escapeHtml(formatValue(value))}
+
`; +} + +function selectTreeDiff(path, environmentId) { + const key = `${environmentId}Value`; + return state.diffs.find((diff) => diff.path === path && Object.prototype.hasOwnProperty.call(diff, key)); +} + +function renderSuggestions() { + elements.suggestions.classList.toggle('hidden', !state.suggestions.length); + elements.suggestions.innerHTML = state.suggestions + .map((suggestion) => { + const leaf = getIgnoreFieldFromPath(suggestion.path) ?? suggestion.path; + return `
+
${escapeHtml(suggestion.path)}
${escapeHtml(suggestion.confidence)} · ${suggestion.score} · ${escapeHtml(suggestion.reason)}
+ +
`; + }) + .join(''); + elements.suggestions.querySelectorAll('[data-add-ignore]').forEach((button) => { + button.addEventListener('click', () => addIgnoreField(button.dataset.addIgnore)); + }); +} + +function addIgnoreField(field) { + const fields = new Set(getIgnoreFields()); + fields.add(field); + elements.ignoreFields.value = Array.from(fields).join(', '); + persistDraft(); + showStatus(`Added ${field} to ignored fields. Compare again to apply it.`); +} + +function updateCounts() { + elements.countAll.textContent = String(state.diffs.length); + elements.countAdded.textContent = String(countType('ADDED')); + elements.countRemoved.textContent = String(countType('REMOVED')); + elements.countChanged.textContent = String(countType('CHANGED')); + elements.countType.textContent = String(countType('TYPE_CHANGE')); +} + +function getVisibleDiffs() { + const query = elements.pathSearch.value.trim().toLowerCase(); + return state.diffs.filter((diff) => { + const matchesFilter = state.filter === 'ALL' || diff.type === state.filter; + const matchesSearch = !query || diff.path.toLowerCase().includes(query); + return matchesFilter && matchesSearch; + }); +} + +function countType(type) { + return state.diffs.filter((diff) => diff.type === type).length; +} + +function copyDiffs() { + navigator.clipboard.writeText(JSON.stringify(state.diffs, null, 2)); + showStatus('Copied diff JSON.'); +} + +function downloadJson() { + downloadBlob(new Blob([JSON.stringify(state.diffs, null, 2)], { type: 'application/json' }), 'api-diff.json'); +} + +function downloadExcel() { + const header = ['Path', 'Type', 'Dev', 'QA', 'Prod']; + const rows = state.diffs.map((diff) => [diff.path, diff.type, formatValue(diff.devValue), formatValue(diff.qaValue), formatValue(diff.prodValue)]); + const html = `${[header, ...rows] + .map((row) => `${row.map((cell) => ``).join('')}`) + .join('')}
${escapeHtml(cell)}
`; + downloadBlob(new Blob([html], { type: 'application/vnd.ms-excel' }), 'api-diff.xls'); +} + +function downloadBlob(blob, fileName) { + const url = URL.createObjectURL(blob); + const anchor = document.createElement('a'); + anchor.href = url; + anchor.download = fileName; + anchor.click(); + URL.revokeObjectURL(url); +} + +function clearSourceDerivedState() { + state.diffs = []; + state.suggestions = []; + state.filter = 'ALL'; + state.compared = { dev: undefined, qa: undefined, prod: undefined }; + state.active = { dev: false, qa: false, prod: false }; + render(); +} + +function resetAll() { + state.urlController?.abort(); + state.curlController?.abort(); + draftIds.forEach((id) => { + elements[id].value = ''; + }); + state.mode = 'json'; + state.view = 'table'; + state.theme = 'light'; + setMode('json'); + applyTheme(); + clearSourceDerivedState(); + clearStatus(); + chrome.storage.local.remove('draft'); +} + +function setLoading(kind, isLoading) { + const button = kind === 'url' ? elements.fetchButton : elements.curlButton; + button.disabled = isLoading; + button.textContent = isLoading ? 'Comparing...' : kind === 'url' ? 'Fetch & Compare' : 'Import cURL & Compare'; +} + +function getEnvironmentInputValues(suffix) { + return Object.fromEntries(ENVIRONMENTS.map(({ id }) => [id, elements[`${id}${suffix}`].value.trim()])); +} + +function getIgnoreFields() { + return elements.ignoreFields.value + .split(',') + .map((field) => field.trim()) + .filter(Boolean); +} + +function showStatus(message) { + elements.status.textContent = message; +} + +function clearStatus() { + showStatus(''); +} + +function formatValue(value) { + if (value === undefined) return '-'; + if (typeof value === 'string') return value; + return JSON.stringify(value); +} + +function escapeHtml(value) { + return String(value) + .replaceAll('&', '&') + .replaceAll('<', '<') + .replaceAll('>', '>') + .replaceAll('"', '"') + .replaceAll("'", '''); +} + +function isAbortError(error) { + return error instanceof DOMException && error.name === 'AbortError'; +} + +function persistDraft() { + const draft = Object.fromEntries(draftIds.map((id) => [id, elements[id].value])); + draft.mode = state.mode; + draft.view = state.view; + draft.theme = state.theme; + chrome.storage.local.set({ draft }); +} + +async function restoreDraft() { + const stored = await chrome.storage.local.get('draft'); + const draft = stored.draft ?? {}; + draftIds.forEach((id) => { + elements[id].value = draft[id] ?? ''; + }); + state.view = draft.view === 'tree' ? 'tree' : 'table'; + state.theme = draft.theme === 'dark' ? 'dark' : 'light'; + applyTheme(); + setMode(['json', 'url', 'curl'].includes(draft.mode) ? draft.mode : 'json'); +} diff --git a/browser-extension/chrome/store-listing.md b/browser-extension/chrome/store-listing.md new file mode 100644 index 0000000..6acd299 --- /dev/null +++ b/browser-extension/chrome/store-listing.md @@ -0,0 +1,98 @@ +# Chrome Web Store Listing Draft + +## Product Details + +Name: +API Response Comparator + +Short description: +Compare JSON API responses across Dev, QA, and Prod from a Chrome popup. + +Detailed description: +API Response Comparator helps developers and QA teams spot API response drift before it reaches users. Paste JSON, upload response files, fetch HTTPS API URLs, or import safe cURL commands, then compare Dev, QA, and Prod responses from a compact Chrome extension popup. + +The first populated environment in Dev, QA, Prod order becomes the baseline. The extension flattens nested JSON paths and reports `ADDED`, `REMOVED`, `CHANGED`, and `TYPE_CHANGE` differences. Any two environments are enough, so you can compare Dev vs QA, QA vs Prod, or all three together. + +Features: +- Manual JSON paste, format, upload, and clear controls +- Direct HTTPS URL fetch comparison +- Safe cURL parsing with structured browser fetch execution +- Optional third environment +- Ignore leaf fields and generate volatility-based ignore suggestions +- Separate rows when one path has different outcome types +- Contract-change alert for added, removed, or type-changed fields +- Count filters and path search +- Table and color-coded JSON tree views +- Copy, JSON download, and Excel-compatible export +- Full reset with in-flight request cancellation +- Light and dark themes + +The extension runs locally in the browser. It does not use analytics, ads, tracking, or a remote app backend. + +Primary category: +Developer Tools + +Language: +English + +## Graphic Assets + +Extension package icons: +- `assets/icons/icon-16.png` +- `assets/icons/icon-32.png` +- `assets/icons/icon-48.png` +- `assets/icons/icon-128.png` + +Store icon: +- `assets/store/store-icon-128.png` + +Screenshots: +- `assets/store/screenshot-1-json-compare-1280x800.png` +- `assets/store/screenshot-2-url-curl-1280x800.png` +- `assets/store/screenshot-3-tree-view-1280x800.png` + +Promotional images: +- Small promo tile: `assets/store/small-promo-440x280.png` +- Marquee promo tile: `assets/store/marquee-promo-1400x560.png` + +## Privacy Practices + +Single purpose: +Compare JSON API responses across Dev, QA, and Prod so developers can identify response value changes and API contract changes. + +Permission justification: + +`storage`: +Stores draft inputs and UI preferences locally in Chrome storage so users do not lose in-progress comparisons when the popup closes. + +`clipboardWrite`: +Lets the user copy generated diff JSON to the clipboard after clicking the Copy button. + +`https://*/*` host permission: +Allows the extension to fetch user-entered HTTPS API URLs and HTTPS cURL targets for comparison. The extension only sends requests when the user clicks Fetch & Compare or Import cURL & Compare. + +Data collection disclosure: +The extension does not collect, sell, share, or transmit user data to the developer or third-party analytics services. JSON payloads, URLs, cURL commands, ignore fields, and UI preferences remain in the browser except when the user explicitly fetches a user-entered HTTPS API endpoint. + +User data handling: +- API requests are initiated only from user-provided URLs or cURL commands. +- Request bodies and headers from cURL imports are used only to execute the user-requested comparison. +- Drafts are stored locally with `chrome.storage.local`. +- No analytics, advertising, or tracking code is included. +- No account, payment, personal profile, or browsing history data is requested. + +Privacy policy summary: +API Response Comparator stores draft comparison inputs locally in the browser and sends network requests only to HTTPS API endpoints the user provides. It does not collect analytics, sell data, share data with the developer, or transmit comparison data to a separate backend. + +## Test Instructions + +1. Load the extension and open the toolbar popup. +2. In JSON mode, paste two JSON objects into Dev and QA, then click Compare. +3. Verify that the table reports changed paths and that Tree view highlights the changed values. +4. In URL mode, enter two HTTPS endpoints that return JSON and click Fetch & Compare. +5. In cURL mode, paste two HTTPS cURL commands and click Import cURL & Compare. +6. Verify Copy, JSON export, Excel export, ignore fields, path search, theme toggle, and Reset. + +## Submission Notes + +Current package behavior intentionally differs from the Next.js app proxy: the Chrome extension performs browser extension fetches directly using HTTPS host permissions. Browser-restricted headers are filtered from cURL imports before fetch. diff --git a/test/app/page.test.tsx b/test/app/page.test.tsx index 8d4499d..69f2f66 100644 --- a/test/app/page.test.tsx +++ b/test/app/page.test.tsx @@ -714,5 +714,5 @@ describe('Home', () => { expect( screen.getByRole('button', { name: 'Import cURL & Compare' }), ).toBeDisabled(); - }); + }, 10000); }); From 036ce9afad18d38e6e16ebaa7e3c60112652f709 Mon Sep 17 00:00:00 2001 From: Arnab Nandy Date: Sun, 28 Jun 2026 22:16:54 +0530 Subject: [PATCH 2/5] Created firefox extension --- browser-extension/chrome/popup.js | 7 +- browser-extension/firefox/README.md | 48 + .../firefox/assets/icons/icon-128.png | Bin 0 -> 1659 bytes .../firefox/assets/icons/icon-16.png | Bin 0 -> 462 bytes .../firefox/assets/icons/icon-32.png | Bin 0 -> 603 bytes .../firefox/assets/icons/icon-48.png | Bin 0 -> 826 bytes .../assets/store/marquee-promo-1400x560.png | Bin 0 -> 102372 bytes .../screenshot-1-json-compare-1280x800.png | Bin 0 -> 30699 bytes .../store/screenshot-2-url-curl-1280x800.png | Bin 0 -> 30571 bytes .../store/screenshot-3-tree-view-1280x800.png | Bin 0 -> 24732 bytes .../assets/store/small-promo-440x280.png | Bin 0 -> 29172 bytes .../firefox/assets/store/store-icon-128.png | Bin 0 -> 1659 bytes browser-extension/firefox/manifest.json | 36 + browser-extension/firefox/popup.css | 496 ++++++++ browser-extension/firefox/popup.html | 180 +++ browser-extension/firefox/popup.js | 1039 +++++++++++++++++ browser-extension/firefox/store-listing.md | 90 ++ 17 files changed, 1893 insertions(+), 3 deletions(-) create mode 100644 browser-extension/firefox/README.md create mode 100644 browser-extension/firefox/assets/icons/icon-128.png create mode 100644 browser-extension/firefox/assets/icons/icon-16.png create mode 100644 browser-extension/firefox/assets/icons/icon-32.png create mode 100644 browser-extension/firefox/assets/icons/icon-48.png create mode 100644 browser-extension/firefox/assets/store/marquee-promo-1400x560.png create mode 100644 browser-extension/firefox/assets/store/screenshot-1-json-compare-1280x800.png create mode 100644 browser-extension/firefox/assets/store/screenshot-2-url-curl-1280x800.png create mode 100644 browser-extension/firefox/assets/store/screenshot-3-tree-view-1280x800.png create mode 100644 browser-extension/firefox/assets/store/small-promo-440x280.png create mode 100644 browser-extension/firefox/assets/store/store-icon-128.png create mode 100644 browser-extension/firefox/manifest.json create mode 100644 browser-extension/firefox/popup.css create mode 100644 browser-extension/firefox/popup.html create mode 100644 browser-extension/firefox/popup.js create mode 100644 browser-extension/firefox/store-listing.md diff --git a/browser-extension/chrome/popup.js b/browser-extension/chrome/popup.js index 6ad435b..1c1cdbc 100644 --- a/browser-extension/chrome/popup.js +++ b/browser-extension/chrome/popup.js @@ -55,6 +55,7 @@ const state = { urlController: undefined, curlController: undefined, }; +const extensionApi = globalThis.browser ?? globalThis.chrome; const draftIds = [ 'devJson', @@ -902,7 +903,7 @@ function resetAll() { applyTheme(); clearSourceDerivedState(); clearStatus(); - chrome.storage.local.remove('draft'); + extensionApi.storage.local.remove('draft'); } function setLoading(kind, isLoading) { @@ -954,11 +955,11 @@ function persistDraft() { draft.mode = state.mode; draft.view = state.view; draft.theme = state.theme; - chrome.storage.local.set({ draft }); + extensionApi.storage.local.set({ draft }); } async function restoreDraft() { - const stored = await chrome.storage.local.get('draft'); + const stored = await extensionApi.storage.local.get('draft'); const draft = stored.draft ?? {}; draftIds.forEach((id) => { elements[id].value = draft[id] ?? ''; diff --git a/browser-extension/firefox/README.md b/browser-extension/firefox/README.md new file mode 100644 index 0000000..db0c09a --- /dev/null +++ b/browser-extension/firefox/README.md @@ -0,0 +1,48 @@ +# API Response Comparator Firefox Extension + +This is the Firefox browser extension version of API Response Comparator. +It is kept separate from the Next.js app and can be loaded without a build step. +The manifest is configured for Firefox desktop and Firefox for Android. + +## Load Temporarily + +1. Open `about:debugging#/runtime/this-firefox`. +2. Click **Load Temporary Add-on...**. +3. Select `browser-extension/firefox/manifest.json`. + +Temporary add-ons are removed when Firefox restarts. For regular distribution, +package this folder and submit it through Mozilla Add-ons. + +## Current Scope + +- Manifest V3 Firefox extension popup +- Manual JSON paste, format, file upload, and per-input clear controls +- Direct HTTPS URL fetch comparison from the extension popup +- Safe cURL parsing and structured browser fetch execution +- Optional Dev, QA, and Prod comparison with any two inputs +- Ignore leaf fields and volatility-based ignore suggestions +- `ADDED`, `REMOVED`, `CHANGED`, and `TYPE_CHANGE` rows +- Separate rows when one path has different outcome types +- Contract-change alert +- Diff counts, type filters, and path search +- Table view and color-coded JSON tree view +- Copy, JSON download, and Excel-compatible `.xls` download +- Full reset with in-flight URL and cURL request invalidation +- Light and dark themes +- Local draft persistence with extension storage +- Firefox for Android metadata and responsive popup layout + +## Notes + +- This extension fetches HTTPS API URLs directly using browser extension host + permissions instead of the Next.js app server proxy. +- cURL imports are parsed into structured requests. Shell operators and + file-based request bodies are rejected; browser-restricted headers are + filtered before fetch. +- The popup script uses `browser` when available and falls back to `chrome` so + the code stays portable across Chromium and Firefox extension runtimes. +- The manifest declares no transmitted data collection with + `browser_specific_settings.gecko.data_collection_permissions.required: + ["none"]`. +- The Excel export is an Excel-compatible `.xls` table so the extension can stay + dependency-free and load without a build step. diff --git a/browser-extension/firefox/assets/icons/icon-128.png b/browser-extension/firefox/assets/icons/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..8658432dfab6bebdaeaef4235d12981e9e4caeff GIT binary patch literal 1659 zcmZ8hc~BE}6a57tM2-~XiX3t%Rv@F*FC672hSM4#C4{IPwtfV#5GuFQhNDElhD%VC zf+3QETEbysEC~{d7HbqRs34{MRZ&nR8Ws$*Z91eut#-gQZAI|H=WsJWke$(Y$SEuFA2P`l$#>%p z>7VvKbd?PZ4CursZ8ra3qsP5sj(K$SP8L|4zCo*0?p$@@9PoLxnru%hsJn@s6{p&5 zWVtRDCA(Lya4mAU>gt@Bx`2a(zHg;Z8ByE(hwih>xa(FV^sJU-VvkF zOLJdA9QM6DX%+(;K|E{jbLg_4|BQZ1D$@ zb;+~UMv+u+M`Vg=@e2DX_01V+X6{Tn!sUcRZ5M8UWZWLwa0T>= z+1&t-a-Z;|tIgcLeui5vwfaMuOhT8vtwBt1erwoD6A0W*j?Z^Hl_K3zi69(_tyGvPC z8~mKZs$Am3clwI;Z5U9BgR9zsUT$P3%r`uSBG0DpQxsm2DHv(k@425(%XT9*!iryh zC8@HUj`L7>XbSW+Z77By@eX-QZ0SB}nYQA=yzs6}N$G4m1;|^NGtlu%v%=N2c0bkE z!~q~2{7Cq^5CjQz1#{zBk`MQERn7}v#U9(f?6Liy?omC!;I@`Ax)O4q;HhP-p;6HT z^R=}DMPXL}|CUMadSUNihsjU%N3_7c!o}uDh|Pk#TWpe9o_R5d+N%-wD=cru4qQ0* zk3fmJ`BTT00c1-<;GjXb)%a|?L7t{T-kSg4b2|*rYjtr2Zb-CH0*#Y5h=?sAW;$)r zj0_#$T=Z-Oyw7jW(?5oXIcWmi_of7$ouH?;L)H2JYYUd13|+dCSp)C;a!S5sm0R6q zegV!=^ zCyqJOC|kC;|I(h6wvkDixqW>8gn8`xi6Ne#|HPzQ_9_R+$!OTzh@a=E6Jo}S0(qZT*gjs z+*cpo^sujlIF51Ddu^H!_@fzXKC{95z)NZ9fu-^RO;?fvQC&6{zIe5XnBQPJYZ^|v zW__tyX)F3hcrsQ$QqnB1)ru>{cPm4Sxzxn`-z?y19XO|rT|W)=^jg5>Lr0|?7IMnl zMBwMdeKXQa<6DgxCZu?N#6MqrgdPip-Xgv>>4C66OShAm$Sl9uzf_*oF+N=6QaYId zX)r)7Wje06xWb?8|8z0yDfVF32=7q0oF7ly)nI71;n*!==R_83dqo{fcxTe4_1;DV u#qmp~TV0}+uB_W__|tXT|NX>(9=!I+N`Fw10YbXCnGE*FVp!<7g1-P0ss>~L literal 0 HcmV?d00001 diff --git a/browser-extension/firefox/assets/icons/icon-16.png b/browser-extension/firefox/assets/icons/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..bf6900f3683eb84ff271e06d36a1674dafd5d4dd GIT binary patch literal 462 zcmV;<0WtoGP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0b@x-K~y+TV_+C` zfWIW)fWIuafWI`i0Rxxi7VwtkTA=HJ1HRI{e*Ut&|Aa7KS>Aedy$t;2`3@jSf$sYM zA{*xa7um540}F3j@L#aM8DdaLP6CPnd?k4m0u=>dMV5!R{P#b#2Lpq|g|{vF&tF~m zALJzz13&@-b*2BMcdh)t_2sGmRo-g<r~Kcz_Rzs=P1|Bt+V`G4!n$6$GoI-CZ8 zox3>izmQEHf*sw2;uX9GfNZ#RWA=aFsw4lw;Ng=0z5z@AKm7my|E(_{iF84UBa*F6 z|AoY(NOQsRll}i~yr=(P`}XDkBNwOtw=7uyUwO|O!Uljs7Zl1KCno&Y6j%GNIcv{< zyCk*$LP?WQT~Jek&48Q$Q2Yu`??O?Gj)mqf<^1OY@F{6H{I3e}T3d zOx#coNr|Po_xbbl1yBtDxgtMb0FPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0q{vgK~z{rV_+Bs zqks^okLTbo&v)Q2&21nVgY@O+3!ocG6aZ=DE6bbDUzYcu3V1tLNtOh<9XJ6YfhMEol#pQ?J zKmWtQ!zKTHtBxSp0ZaZrM96{xNImV+K#3!gubci0iAQ0op=JnRV0uRZCI_Mb_~lYbHMzG7>1F9g_ceu!2u;X2{6Ti{mmGLk%K{P1DKh7 zC3zL-cA@}Ks|D^_P$;aLg<&8`c*Fev0u=>F4#@RDw-W>KmF1p?X#i;!oZJqMM^drS zte*e;)rE-QFUxxlYUHBZhXMFY@(uV)^S&d81T`>GzJ~!&(}}+f36Wa8%}Sq=yF p@f;wH;G97=&Ius9Z!ikz0RY6TAhZ_Qd8_~c002ovPDHLkV1fe@{ow!r literal 0 HcmV?d00001 diff --git a/browser-extension/firefox/assets/icons/icon-48.png b/browser-extension/firefox/assets/icons/icon-48.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7b81a69e06914a854132a8ea00b5b594738bbc GIT binary patch literal 826 zcmV-A1I7G_P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0?$cAK~!i%?O8u) z6Hy$_D5Cc+mp~l_p*V@7Lk9|Mg$9<(=}ee4%{D(V!9gK+m~B46Nuo9M49zl!9bwr_88u=4 zU{>}jt)*-17B3k@Ma|~dXidKHciVKHdA($TeybFmB}>xYqs@OGyO}*rYx4!%^OB(8 zker)=)bmG>USAH4sF!?jNAlVY@rKss3(h_yVyUJ3l6ja+JzW63ke5PqeW>wDqarx- z)KCSDg{l+)uUT57C-4TKBI(t-WTuL2;zpadX7K{8(G$+grA0t5k4q*hiHEy=1mzChAaa+^*pUaM}M~e*J_nfI3t=k^n1TKf~ttZ-I$AR6CLY zDj5g(&jZXudT0=g>N2E92f?uBUB-Abk^mE1@1gSXgUna6aOUDH6r0au4S7rpQHN?r z5}@NXy4`@0;^zKyrUBb@ObhyUjdogrVr2x3y;*O-g@G(wcNy3B73j!12V;ouKaWn! zV-8?{1FTPjG0<{|4_|=bj05-y(95^b`PXZbjvFHh(D54e0DeAG9XCc2pqJkRr#7BR zI&KU-fId@@OjJ_8I~g#5F!OBz3VBGqXh=q?DD{fE4q)ZZwh0Ih#^OE6NCl0@58I1( zT8;cNt?@u$S4>)kl|{)gRIb+L*%uso>drC2*QgM-J5)8daOT~L$MzeGbqal!_54y``MqF!PM8@?>qj-|2XF5rD7SL`@XjG zI7J-P2z{-n7j(X8HnhG)0@?5i{G488MP zzpFj^eSN0plkf+#b9Xt36@Se>nR|W7zip=N9oXUMU9PU!+&+Ex2ETH(M@EY%ts!6C z;?ovA%RTB=)PdnAZYNLQC^uX%+?i{rcJ100&^bJ|BTRQ`Lf+T;T@wy0nBZT3U0sm) zN$c|b43D4*)ABOTf0M6Dop3nA@KcM*FXq2Kn)=uHNXO2TQOEj>w7LPw z>hOgbhVl8XlJC^wfJ++p4EZtF{H^MF=&x>gEPoW0pB=JYAYJUv(%uxiTqHdts;iQHPw{R+Rn7y(@2%I?7QYE=W+jD~dI8XQfC{rFo$9 z%&B}JP3<%H-}q~&Z^h&s(Qs+-!X&%PvXa;0T{+d6y#mJsDd!z~b?(1M`c|Y%8{)+K zYMMUd*6-t~7w62i$ar_`x8!RHPyMbNS3Nn$w}-?k_a~le(eCWYmdC54j_BLrMg1o1 zla)EPoQyk7A9I!CS55RSn=jS&QoX{>h)=JL6MtU=|Gs{aGO4oh4w z**|Kg%t}5L{tLXeEKQkpH`GFCw|Y!vPr;nMIc}3~6xM|H7V>V4yCQq}Ywr6j7 z2Vbqp6wC*uO~nDUl#faZ^Dl$YnPN~ z$=!pMc5xBG^pDvke$apUj{d90r2Z!RHa>KS;AN%D@j|N_)dz3wqh592NF6z<&$gZ$ z;L<$AQ7FoD+fN<>oW@@4ana{DeX;Q$z6Jf&%vTC$y}JHw<&y2g7vZn((@qh8%^ z+JGO%2K-mIM+v554{$VjDbNE98X_F9{6zm1JJ4%YYCSvy6;H@JDEsLSSd21#)l}b- zEu_VytX;*tY3_5Xokm^mOTC=>3VBk$>tR_bR`OJ9fA(qNCkMY9{^OPi3%NclbETc+ zCi-UV6!4F5FH6tF`MkF819-t zx@=|l2Yq)T$8Gu>%~s&~?yQ|{Co!^5xDs*Ww}{`szm51o^zp%iD;Hz7K$-wyVcUmK zst!@+$>vL|;CHw*&o^?C{lUQPBxUd(ymyF)@nkbpwQ;T-KO4b^N*BtA$|wDtc0As7 zKUh4vP|{#9CM97^c9L~AXWqkKTg9Aa2YC_v%tcn`mNdnQ4`a6>Xm`%sY4EQPhK^G0 zHhR?5RfJER`U?6siQql@9ed_%aKpN0`Z!*{26*sFp$xc%ZE-&XDJ#V@zv2*z!$ z*ctJedUu4SzjbxyVEA{)^HWX`cYnAmpq*flGB1kZ-{`|Q0zWY=objK&No%Yun*3_% zYPjtiKTz7iFT7Z>(?N*Y*ER2~G0oGJ>G!}l#O2^~3m{Vm>p?1csvsUs4 z$OC{EXS{j|xJnnex*T+MQ}M5yWb_x}e@f-;X-jK3fSi2-}J6Nh;;md+iSKtAZj=R)t`jEm24GdPMeMARQjmIsfkq+=1 zsoKqoB~(0}{)Xz!xN?Yi`@;mEFnoh-1DGcD7TKS?yh}XnVpS%D%Iolrll|1Ydu?pV zNivGxg!clAw+wTulA-*CNM1(zE`etd;S704(=Eab!79f0hmeQeb2?!$=NRb2b7}T> zr#vh(UZLOZ(mei`e$DOMQilgC_oEzxaSKMytXiBKK-wvtpJ2(>{q5qz5DO_Iy(LXr zV@-Z7X6x+4BWQ#&FRP^&eiN9Uj`$pl0OridTsB5~J$Q>?3MklG$=`G1s9#&>%9U6_ zmWI6C5eRiBO@rurHL9y9AzFtLqBSF`os2SCQJ!cK?iiRKxAl;7!U*qgFG1-zKSOW~ zxl;5xf@d{0H`>2nPCW(2?`PT@mbsY;GFUE1{2)5~L4Kc^CU6w;kFk?^Jhxw&QzaFN z@mzs8LB=7D&jS)+-v9Nv7k0Z2$2w~)Gy?Yv066CKnsvde1fhoNfvT>|< z*mqa;(&cXLp@ck|rvD*gAtN&)%nncF$d4AM-7~G^X(%4E-jwKN!Y0t09|fVwL4ZBd zt9aagqBp<_h+uFY`%vPPCYU3($l$3y+npV3$?`+E2gL8$)0mRwGEq=(3HV*&MU+WC z8^9+&gu50#cb%X|jf(lBj-p)s`?R$_%5d-z4>fv^Z5*Disf(U2%;a!HsISvLa@74z}a@uW>|94}Vs7Ilb?0lf;2(H&_x8 zXwwHfsfb@?Uc(`)AUxs5QPsoa@qC&2z~QlvlvaLhC-FrF3~!<$n#1S(;yam2MC;o^ zQ8@sA5VN{4^G+C6tGP|*4tSzKR1Up+N{CwFM+;^#Jf-KlaX|d_i;IuKF^e`S2ne&P)1^N z<`e2(a7$NfXTVb=!ylgZ%dCl128)_diP>5bb(qmX8<&x^x3rVkNw}B2&HBnRsrUvw zZRhlT#9s?HhF(Ps{w-U?pkv`(6o3>DFeo#%0vehc{nUA z<)pv*O%yV*jK`?>b|Uh;C&rRXM5PN>(=DE5j51J9+H$5Cg4^P!uGh%)>wl$Q1H4Sj zA#(dKi4v)7@Hzt5TU702Qm|uoQZ+#66jr`o;x~rv2J9rZtaHRqkoss;I%6je7t0K$ z0YD-Lp{4H69@-!+q%z*RZ*r12{;0+^3QyOupw0BG%+I%jp&>N&E<#g{3w0BKf!HOJaiYr4tO=u@5O`=_;o@IDwcDmldV1j>x%nt);rv>~!XMqv&J z`b^DWHp0g&6dZ-TuhW=yIaQsVj29eYCH;)D4IJ*I!QB^$$KhM4`rD=X%}Or$wb)4+ z9TT|ZrWu>x37KLRIKjOy8HJ3&UNh+!d;{@1yB7esqa%HB98^PEAePEAU_j<|zyM+Z ztuY|R=$GNiyZb1HPd0@iyD^iqOQPef2pALk7M(L@A()6V9fbCo8l*AwNt+|o)BaUa z2*#j18uOE_VmnE86$`gw8VbrT_5-xT0*|qnNdq4wDvF$JDx|`+SsR_+GZ`5?>SxC} zz)jgn_B?foMkH2G46FZCi3V@7t-oqL*?t@9`zcn5xXdAt((L|N;zd;hUSucBsA!^K zPrUoaK&s%DFkke6A*2e&w2azHL^#2-BrEyvkiM{kW?n)Y3-5Acwxw99`+vKs2HnZB zbAZ+f#vz-zSoR&2y_317zZyfD$;^f5(%m!ZI5Az`-(!)GIpoRbA#9NOtZ@UKN+#uW z0{@R!WzU9#Q1mOvO>4M(CZ%3(rxoUKq+z8e}D`jxq&d5wH_-x8J9I zgpPF-?h4OpIdaaL?A1hPuE=}iA<}}tc{6MI;+NUo1EvGr22O9p5wfnO3S9VvD9Y%D z4D*Xd`VJyN6*FNIAdQ8Tjp79n+tIQ*Fg+yY5eF_{ja4(5B*cy9G$5=P8-eop7t>Tj zO$UGVf$x`-$T#^3v$NtprJ3r8;zbf_z`==GRHqR&^XUHrq0AO8k}H&@FCdsfZuu-3 zPLSuA;G0H0mnBWix{mNTR5$N=AQC`m)B*>cRh&&b4h^mcQvf`Rhp86a(!N$9BuBg~I%3Ed+ zgzhq)o3js@IxVbEKEU|2rl{m}3y^e#aAfS}+WuSO!+!DQT*0_2&~U>YC;_(8OrVjz zdk?{zl%cvCq79X;{3lrBG~g4skJ>`Rh!kK2T@iVFlSvVJc_5U%72xh8&R{%yerLGL*N&rDEqBhIX)>_1Y5>Tcm>$T z65|fu|8|7K8`BGn`e|_Xqi4a%ixEEcU+k#Omx@9f5O8nWNdrf``na#1d031HtBg=e z&`MF~qm3j3zRqr9vm7oSZ78=(eoh8}zX?lS(gy$$4UpibU*t|rf0r;qIPDegC{)kK z!2k+Q#(oG!S2b6JGy8bV@_PfK6D(p@QRL^JJPEXi;*4RfM$k2Cfj~2x=CA@&W1t0X z_AEEJq-mFUHb$y@3Wh3_kIx_2CPAhT^cRGG+7qof-07iKmU-)Ev5)iQg*-k@NF#d5 z)TuIVZZ}EbHSbl_^+*1$4R7ExzL9U*<7VNUbg4jNjyq{5N^%j-yhlG`#9(IiUf}Dg zZ^4ccb-ii$2VNA2_msDN+Q%rvBn4oGIf}B_<3nuv-_W0Jm z=K>uev5$wSXr9H7uy{P{V)A{eazp~kc`!}rx#7ki4~4pzV#wW*KsLTc9($j;G^+=j zt&tNWIZt3$Q}6tF4G0C@1E`$@Gb#Un82kT37`wR+koURJ-=KKEMjXdyYoI+l;s~Q- z%hra&jWm9l&G3xNLS|)0aHZJoESd^tnoiD)ZPm&*w#-&{##`$uG@hGU?mI^cq7(AB zsW+?dX>VvBdkk*Vf2aRV>zv<_qRFeN{YswvVE?f;?#XR@&D9}!!J>rpHr1ZayY{Q2 zie=HqPij0Wwq5XeQj#JAel4dp3&X z^YBPUaw>M}>#F3!mSYO-X4e4y9gRZrSB-P^A^V5!?Vsmg5!Cf;8rG&;cr@X_E&G1a zYYSrjdf?%IGvQYI5<|xc_pIuGlXVY^H7h<@(5$=XTzRbE(Zvy(0iNxT3zK6SOOgyN zht=!<*v0If>b7B!5v$ph8nrd{K3TOYodniR=>Y z<-WiYA33vf95uZIwVLHnUw|jQI9U~!PihjPn`MZyinY-GSO^o6K*4;`^`gb`!qzSP zNL^uKOmp6D_zlM(Lt-SZKctO}TY8c)C20A9Z^=|y^B+F}&6dUlFf?G7RQmx>{Q%V+ z8WR4&D4h6&6Qnmrm0U=5o*Q0PUjoJ(V>l5}^Y-9VRyGHx+;om?5GXcXn&Y874I%n7 zfOEjw;p9v4F5f`q+9k1f=6FQ4d>Nm@^fS*^M)G(W810-%(;Y-n{m`&ZrYkYt+6_b9 zD=za``CeZBn)J7{|x;dakDop4pp~U z?H+yAnpN+ae(}?r*>p$F4f}>OM_CS94*q?vTCPRqvx%%LwJqC}&o^uZ(_=q*_xv zQD#eV9^%Zh(^pmwP8T}>v%uUDjGf~1B524!+fS|MT7$*@3(k{WZPMos52`g_Munkm zm^%E2G;|qp))H30!Ei8OYRv3z?w#>HCG4N&(oB%%>nm@;-OnbcFJQ2bIpj*gE!}o7 z(0g_`HYoqm;e@HgBPG~H9E@Gmf9BXF(Ax&S?RRMQx{m5Ylq{BN?-q2;a-FbAUF8%w zhIWm}O$m5VNWo!*GMY#D55yU|6xRPFj29aU^BaRtg6Do>W;y^38>Avs?WXZnaC%kf zgr@$W?TYip>PA&Z=X!SBKD_&!FZHxw_z&Leux5`f;$&m)A6+0H&d}8--QT2j^{hKo zUht^)kUFxdU7iz|k*c0|{(#m!BQLT@5Yw>7?)IY65M?2{Y1n0B&#coBaFEiE)r3M9 zJ1Wl?jglGp+TZ#Tb^_Ih#W!gLu^~<~JoetU1|JD>@c0WQC81Jy5G$!_S@yo{{-!J0 z)iYZ26dPK)?DI6W9SQE0UeT@5uJ$^qZ|DJSeWK@%Lon+V@ghoEZsmbL4fmS(;Wx^9 zfnOlsEsGoK#X0i{j2!6-Au5KPdlBL+Fss zd{@N`!!Y%R?TwE;+OHPQQVXj#hi6<|I~%e^Q`1H6st1!R^wvH)2s1|5A$A>WPtG@d zZY`Tj&a%;70eoN`)6#6h1g*n8A9>BGTub?F!fC4mx)z~nY?MingY;l4nE|>t8b?o! z(A;W~x9MDqJF@ubF)*q0Pemq$S)e2L3m#-fA2>7#3PBc{yVGL(5txzniX&4BAS8nk z+04wsM;cN%f;lxGU$nIf8hvZEIfE7VS4KaWJEVGx({(S)%c@s*wbM)*0Fqmt);2Kt*Z(Bw)CfY7r4!MjD1XWU;Eu%Shw$-6l7jN3Bj7&T8B_KW)wpmoBrz=1FZ+Sph# z6I|>Kc=m#iFc*xu@WXu3;mx5nq2sqKMcqq_?ZeSLJw5{obHo+8Gxm8^XWC1t4jGm+ zyU)R}EfUy@tln=af9R=GyNLsDT^SPDZ2x8N>~oagZj?$JFx`PCj7t9v0Ng*W=|ozL z^rz1u?>bwCkoVuHX=x)vJBS#l0NPT|zW+hhxiK9FUC1N`Z{xTsLwWqOlda|V^J@p} z-X^PPz2U3qqip(&nv2ghJGsc3-UX*WM98Ci&ja9X>K+R63%$S>CoUh$GAh7dh(5i| zOdsvt1kbz6L?2-mh4Hpg?<*9>4F!?#Y|#*5{U61X-&Xm*e{2}v91!x9pfLB=>dusH z1qv@{KeWOr(qvJ@-3D7fP8BmFIesuraRMDRDvUyuyAZ*N(5LX@$*ltibzUqTfApdK z*52m@^iVXB7m#dZHX2Dy&vr}yOyLAic4>YEY!0^)LbL*iE-c+5?(8 zaq|DnKux>v@B;N|OKBLc6896@0k@xIkF(F=Bxm`Kbez@AG7hAYq8<)S4VbPzT_qLY z!l{B6REynPbA23oMI_$bP@oZ6l;-ik(K8wzIA%voOKD)5T#$kzltYsYVwhxz&N>oytd&9*g<<$1BvQ)DO4WmnBEtb$5+bJ=Az!?ISor6+&X%NI>NX$@0J`zR(KTfC*+WQr+RoXqB&AIrO&QzwGl`LJ$Eh6y?VFNHaB<&p1Lv zDqxcTQB?|bmYCmHsKp&C5)8`14bHLG3u7NYPC9>JYD975-EpplhyC~k9g`CZ%HI*Z z%mRK{bq+qLO4m84)VZ3MY9;5aMA8yuhU+#*>C_-ga9{pv&YTI4OA=%f<%rnU&d#~c z*#%$aJsQBTQ60tZEGEf9jnT7GY$F2yK^n}3lIx2FO5NFnSY@rD^|Afb-xgUOk1EwC zB*YpD6Fv0XYeHWl*a}3sYE<*0FuGm*36GBg1ZuOP`*NeqL6|w&z4&x_l*Tf)<6+W3 zeddB{NnLsDz1rCY8cnGFs;9wP2LH3yd*nC!#OiA;Js)0d7rftkqe@XJ_1*iN1u+ay zSxLBmc)#r}E*9NQ+kN^IZpx6nGj+O~B|ib$cL=NzMh*xK3(#;FZAm)}EV()`41=WU zrrdb0x@Aao;%m!RP3XFpoZB(1Ko@M4v|p2==x}qL(3Ru~iLZ0VX`TDNwli}=^OX%& zwQ#9W8V#4~1(eNz-Bj^}hUzPd`<%H0IrZl^+D4K+RAXO_2A6h;52O17Ui$0dFbI6Y z${*Ewy~2sW+e3bT)6MIHIbTIxDAq5%7<$(FhW5H=c*~a~JXXeL3~<-%Rg~n2T_EkV zthh!vE~9Z2mIH~(OJeHHEP_!x7YAWM;~D!#F;qjG`Nc=h{1sjMuZxu47P0|4B!fE1 z9*~z(SBT`>BwAa@@5d@XzgRGCm;F4)ktY^bgw$onHo@iA|Bud(Uw>GQ6aw(p57Fd; ze}KCVFIHVfH*+JaO>~CP9Nz2k8vpr|zqXj@ennqupSKOvp(wF2;F9WVa2x7P@>CFr+1QtC4Z+*E3gi{!R=_(>Hyg_{16I`~ zhWxxrSdwAbd2yvr`O-)Fx+{%pkE#v%HNFnQbNKyuT5%gRr)MD_7~551oxRd7;DNiOef|@8m>b^6hH4m9!n@}7*jR()v(kb&|~(JYKJEPytq@}+E2YI z4CK8?F0B#1LWyY{u>l5}mH$YL)#7TwkIR|s(!9Iq@r;X0!$xhlbYJ5F9#vr^wjY6!L_UGu`x{Dk5}Y1k8|g6zdNuYpzE>tqj*hWa@UVZ z&U$M@Ta0d2N`ZJmfxb~Mztj1xg46l&?AX|CdalB=@^Ea)^wp=i5A z0&P+yK@NRCzuwJGHz}{qHMXqJ*_x;lb=Usy7Tek9J!rF&V9g0^(){Vlkl(0E(-r)P1iSlg!fR(JDyT|k%o z=n#FYV*L&D#?#^lLX3bk#SVx-NsV8}YXJ4xbx3idElLy9`D=hKQv2!8m6PeV=YLQh zFU*=`BQ&%|j}`LZ4d>VGIHL?dUf4d*v;CrLM&}8`-P$F|Q!|}C^OE1}+@b6I@t8KY zwDnwOUg!P!O(PPu9e4Gk%N8`<81dMn<7Se!c0tzwYuW2iA#Z`S`Wk|_KtIfzryi6X zc-%t1uAleAGgXHaI&l*JAz*ZPV}Yz_Fe>cRaH61+)IfuZ3qm~l>MMf$3y#XV;jPDF z>fE>fGQ1*0mieVNH@KpydgqsJ=ie)DzY`Q4tBHsjlL&)3NKNM_3tCqWi-5&18$l)- zj(pvlQstSdw1N88fV0WJj{V5a1egQ$OXmgmC<)b#8%%pQ#WWifem*&eGr_ke_u`&)nsFtT!%E)}HXGJ@1e`cW>xz; z!Q9>c?;5g4$RA9_1-WoNL3V-%qBf~qbPcczfGR~AFca|P`2`~N19*fE!UZ2=$p_N- zqOf*A%o&BiHMSxZIqJqDV)v39p0KGar1#k}IB%7^dWSkM@?k&c2uvf9+qb>)Ep$n-AoXe45+<2_ZQpdn7VfYx^9aH zuS!K1Q@dcu&#UX&R80Vy5m*t`9fZ?>KGTn2Gz^RaFXb0O@-R-S{j#8S-NnnH2LI+g zof%1%^<8Q6@&K9*xE%cV<%s z699@0J><62if>3ogPhnAjYN1EJy?{^kS}IGmZ=^RWh3}hshgqlkWDS07<%2|&(Kjb zA^SR?P;jqyfyY}#lX_LV+t8gYXait#)R4p2KpKO=8ie>+cX1WCi1`je9uC7leF+U$ zpzc7Np!IG-Z1aVmG?oKyIL>@<-bE_l$odR3gO^maXtRz49Bu1xbA zOW+V@CSNk(_QW{|FW{(8E-_bw)wA%k=^t#QB1>sQQuhl!acM4sR`Js!z-zK^NyV>W z!4$(2Qf&VP@zVeOZN&3KBUxl%r<3tG)#BnpLPT;hJrrj+7!zRixEG-e_vL zplyJiWZ)v+1QP}*!(fc@Iy34X2)mSnsgVsbT#pojHnjEo4{h4V7LHvKhs3nsgj5pG z*1_N!IC5L};;{FWx^1zK)uH1%boK_VVRdY6nv)HdD1+O_JU`1lnQE-kSKdm_j6XKZ zvY|2HTB|%14&0h(;Scl5V(RRI{-8LBKt2=q#K}9MnRA1&@u`&nEN~xuW1#O5J}kc zS7ivHTLwg2B!tRJ(cnFW6EfiV*m4R7D^E#w323U%Ef%%z_u)teZaQ!Xdo1F&!1fsC zM~Hya*w0P|3$1ZWAoy6xf8hiO#H^7ZyxVzj8t~39d6U09c8U z3uF4M3;+VBoutJilB|cOc-|?MCBrGL93y^q@(Q>|B%fg?38T7H=cN4=!z2;%ZTPZ8N%4!jw$d+N^l_LhO7w`8mY zb_~mg$}${Xa?DRmP`}RD3qt2I1G)aDin6R6&867{M#FnQ5!9d}kSnH}%YKwli9srZ zUL;2aIElv{u?c+gA=2X>foM`fpAj#Z1fCpo=GVr<`W~A81WABdY4VZMDkx#)oE51! z8q+cl*5X7>XxzZUH$vD+GRpHNRHd7g% z@AB48c(;nBCgE+~;J@rlCnUO_t}m1C6)7>T?`_pD4Koqn_t01^bO$OAKDF~~?- zCRxZsb;{6uoLp+saKc&~s6bO0;AtUq#4VC)dxQ6*55t^djEyoPD-|oM*%=p;uY=Y+ z8L=;sIxYwB6E(YD8Niju9yD3umyUqz>Es?xoM6{s+dF9SCj#@N7+}~>M~fXSF>(pM zKB&kWQt`4&T*i1d)>sFMzaP8{yq%9C%Z9^6&cckxL}(E$hwD$)=lFuFr(#b6D33LF z=xYrjjE#L^Z!_XLnQ55Kb74D@HJp$C`yiEuLpl{Ed@^G!CAHE~@Ks#-6IH>{dka#I zQ;`yz%<}@8IckzJ*|PXsWuF(L^)yg6o^idOzfuWVa3VfChsm9S&0(}iIuw7?Ov{w- z0Kb1IO~rp}AL#WV#FE7C>5`95C;q-l0Wv8t-p-Wav4)->K~m9hi@cb`U$3}aykdt- zG6=>7j0WY=hO@6S;x+&CB0w<2@wby~VOar-ss$q{OwqrQ=(oF(ErwTk8Lz7r-M1xL zRky>)q=rE{G{fS6v&Z${N!3~-?gU^OcrU}&jnZ&2SDqk?;P{11CLt7(ECJ&b@U{R( zG$C>LAr?Ord00S!^zLb+N#)1a&87xu=@LZWjUo33^$I#?a=&rfC{1W%QY&Ho7xg}v zCCZ9!CEJZPd{IlvN}fWb0+2`@U zsufRVQh;}tk@`6pMDNAPtWZJo3x!^`T^Pe(@Qb*$?}w1hY7ARtH!4xzN7aMyR{ij@ z5@wzV^crl5ZAfUv3|CSy>|>XfFgRkhKUZ|gP24nlg@wtnIT!w9%1EGaFN*97a$L);5!*V zu!ld!4MV|%A2{6;9oaT3dFZ2@N>x zjHlpwwEqe`0!`Y6RCHuqwfH0Q)UoUmi1tPyP0$yj@rDc>Pr-9Hlcp+`zA@K2mdWWo zmCXJ!dQU-0+3ja2T)2P9!PNsjh@9QAw(`f8H-#u?E0!>r17AKBZ6GjLPHowv%1Cs- z@i`MmmZxG(g@SPVUUbI^=}ZzGSOhc}D9`c234@D{6@WEU=ph4prbQeP`bGsaGioeI zT#G(BMnlAe%!f`9w(a${MX6D@fyTcJ=gGgA%B3>Rr8$&D7qR7_MqOeCC158whr8o} zvbXBENS`C}#|57J8~xBe4|2T}%~dr^N}yL`b%TPTPK7HyaoA1O;sv`R_xEDfEsU5< z4;i>~1qm-fw&{X3ClH!q3^|xz4A@_}b~X%em}!q81^aHucIfe7jK-Bj+mLFqfaE7n zz2p{P#_%6s9j>u+EigL$V}m^PVIc^N(C5xd&mN}n?yK?$Oc?db^T0T{E>0c8SRbm4|dOy z^^DB0+))&k?1z+eD#3k&eoB#pu()6no;e|hVq9FZ42B60V5|sc)7)~RFStB*Y6W?d z$@aUEaaF+nu$_!G=5K_4cxKAYhw-ombS&H&y-PD15i)Y-EG022_Lp?O$OyGf_RuL4 zdomk`Q2I-o*4`wOeDgrcjd^!ftChNvgh5jxwB^zR?iBVO~2X3T7!&}i=j;S ziaWa(rZIY#>aHugcDcqHiuFGxDZ2K=-VM_3^3)v*jk)U>5Yci=ExP_bDIW#?4Hm=F zOiv5o-i(5aN8CERKRQ!9d`sops(7Dwvd#iX(g#H1lHxVlv4zqzRoQ3$eJlAouqK$} zmv9ZAAwXfw#u)L6wc!gcs9fDUnBfxy(9gg-T!QOhOD9rhK)HQz^I)J$+*MlA+2YzGP&KOV2CCy^a; z^097SMs%N^lIWj4_eGw|`XF$Kik-;)R*-dL{t?YPjw2~i-K6W;96@TF#?n)}Vt0a* ze4xH5`CRg)6E4jMzJYIedbR;1?XdD$+fUIvY1Z}7{D97r8NEQS04?ce^{rtEJnV6V z&_+|CP{Fn|=|sF>1#!%1Ctz`OnZN-U`6Yb)NiHz*(d z2U}jA-(uZsjQFNjpPe^KDjU;-q5h08(4ccNlJ0?}_5M?vV6w=K=<+|NFy-VyvuHQv5n(>15as242Bs+M= zB88)WKV_(eFxjHQN7tI5khJi1>%C$_3Sy4r6!=wLG~7F(Yun%HxS&0CW$YgHVz<@@ z1>q5SodaWXL9Pn>Yj7C`vXmRwLmnTtGsd^`*8+oUuQ$ZM#%Rk!4}d$!D$uOueb{SN zD$YLxB?@}=Gd=H4v%jz%t>zaBVxTc{3TknIHhk+|*@Ni6$`qMSf@DhxZ*}ZLP0X?5 z)Wm~lrb3o&*j=CO|Gwd_rs!ZyLlU)o zS|B@<>?|#`)&F@#r;eKI9FuW) z?JDvwAtkEepKY)g-D^V_7GvbcY%>ayXwZg1=^HwYyqZEqo|CXCG<5cb{r@_7tx9}Y zxmC5VD@*m+g*;h)o=AWOBl!3FJ{V<*xS=2r3k;qwVFmb9Oqlz%W)HB_bzNiXY(3j- zt>7o_IyZ1{;GhGlL+aQ)hu1E_-y-Arn_G1KceK7m+mFEE1hjuU2idOZo>qR|4)BpY z&KKu!r6&eQ$P2gwlSw2MQ7$yU#%o4Zy8{V?=I~>^!S=gJ6CQ6(9Hd{;_GNNciATjZ zjk60{1fl+qe}@s-n^*OeDCit+ zwNJJwSzoOG^__B{i!I-A;DYRRr5z?SG8y*Sg62MRz#HtVKkSkQNh%U~A?jfDSIG}L z5@xLBEUmDORb{;0TGU=u5YYldRwt4M&UpBmRy4NZu)3h*%Z%6)7wLPCDb_x71q&tJ znm}cf{byCTRw&w>tS#m2ES_aS=!paU<}DIr1D%5DgE1^I*;>9$-W4@x=D~Gy+P4(I zxKmN@w;y{{Ho94A+q!gH|K6vVY)VIT1=_%}jY9wxAd zhwXbEb`5&Na?Wl!g<$gBB5znZvYZO?{FLGh6pVcG9@n1d>q0k6Rga?T_ABm#pcK{k zXKmwTjo~twSZM3Hxm~{_r7}o|Tl35FDmmxGV&|xi>=57x`A@)f){K^fzIyk1y<=RohyHBJ_&sSEc1;+u*{&(0=AU!`h* z1!Maclz#YVDdm?2)kBQ8Q5EqrAXQ_~5N^nLg5-J-Rl4SNTKvNSZI2khY`7- zuIraUZfG<<@MQwN(rMQQyPB+1DXTRjLiPIC&cIN)?sB>1>7*WL%OyKw=E%;0b`Bw> zg5?JoTA}VqItenS%U%{<*{O+Ccf7Otf~rd-w^r!hm4qxEWuPSaOw9j&|b&(St&mpwH%hF1Q@ss&fr!PE*tY(m}C! z8HYuun$Y*BAxR?N)U*3OVwWJ&6!g)0A)s?y6TSuoPo>{ z^=rWvtxmgHGZStsVMw|t^S!Dq(F}5k2)uD+$oWW>qyIhJ7;$?vArhEh4FaMQ2UA0c zMUrfVs*~pD!l1%Hh6g(XNU)eh1X~(pzR@+;JKt2FZ!6Jwa;!FET?$AZ*|f>0?@6NI zAD4bhs{MrJq}jf}sCvHYT`m=WhqMC`yBm?MPKye#Kri8dPOSnJXR%b%U92{pV{Yjgkyz#a#8WL|k988~%aG8y z3J8-Xf;9sG_3WVE`szlKlQp=JA56U@O*QJZ7IOue{HTh;S$ttxVT;_*d-K)w({to) z%3c>|I`RDGkt{ycZTLv(a-(c;7_r^@*|BWYOF*JI{^O(-X=oD}KGSDR1`I?a9;7S^ zJd#OhCd{vp5RoKj6jakJ)IPxh9e;S{cxqfSaw6+?WmL(NiZaU;s=^Hj$%wMD8#46Y z7AnTtj;ESQ+y5X+u<{^Ip=Gh9Q7nKya*(pj0-F+MaCHH1YKMK0Bzq5W#(*^27bDH0 z;QxAtsSZ{|;%Z)~_(S!{mq~y#! zLiCdubOMtp12`2BXdK^zjkq*68>?V8UVGpmyoo>)kbEK5*pS&hO>jU;vy9;= zvw;nc7Z<+iBbc)l{qM45#0+ylDjyxs4BXJe&g5JLrY4 zU3s1&7U%oE#@sc?ws1DX8SWnNHOS81?`Q^Qy*kJlTgpf6EFt!^b|c2UffVS(BL@vm z!T?beS!m)z@G!1Owpm%?1@I0x8ein!`pPcDrNyN?Vb4*R(hfA5icN|Zq~rt@BuGP2 zMuE#5BPBcXMN>!>s-2j~BYbWtbh~*687;$NpN;@@bt0PPaG|=it|gi2 zf_~EAiN0P>6deOE!M0NwNIV?GG=|Yl26YJhLO>ZTFM^@k=LwE?$6w;1f-oXY>ImIA zNSKiDC5v)r!Z)HTilY8PyNxc^nu-RcXV;^Gt6ViTpht%%#v|>f$few&nK1{*w=CC)K3YsP z-s$0k^i@-RfsXSY3uysG+1_Y;6vN(8Wg`^JFN%QiocUv~jV(C{Z~-2O@h&>*9g_Ol z025)B%Qjm|KO0EU<}g)MOB`$(<>!i2%3NTRf(0&x%Lek;+-dNCgCnr>wuOl*&;@&= z*}p1E1Hcxi5=)YBnxu=$$Y4yA#-4(s3R%IDxU6F^J@qq7DrPU3C7MEJ3S@(MT^+jb zsuw|@Ux_xog(+P?!)c(>?(~#B@u5Qm7*v2LzamUa{aJ@2Ucb2X zb!()yn+^n|Q2=}n0;-@g;wUy-o{L%WXXWCaN|ztfj;|9eHj}il$Y93mFh`&@NefAU z!$hsf;K_a?2-_vs--7L$W@dfn-aDA;=hEze$q}!~UWth>f$1VPZ@G;Gm~O~9nbRa@ zGX|-{s{1$|O)G%EU<>8q06lECh!{bzEe0Vmf$>ZM5oGzBm%e_b`uIG|Nn-OrTX-24 zn%0UrOwYG*f(3*Yez`P>5D(hKY2TqroVzc`q4-O-yonM}KD3#I#b@QFlv0!f>Tb#3Y*}feDXlf@2C2 zmnB1J>KAJ9SwR>%FW8H+Y@{h-V#pb|OfaZzQYT1nsC#aZv~t{*r;l>@G%L|RDF?%- z%CW_iQ2sk{4!W%AwnE<1$z_3YqQHz4u~RLDFpLCePWnU`?i1ZY0SLQ5xYV(O@zR~= zVaq}U8x3v)7`%V5WPd)wP&*S;Wo4haf5EURuBY)2hC6s--K^3vt4;#33sU>5FM~R) zd{>U>jI;sx9^$2_i28@hHxRV3rxKVaOO>D@*U!g(3o6|{))END*r+QE2!WvGo|;f6 z%pI~<=zy~>7e7E=jqVITN6(RHAtD|ijhLAk*Fbhma-kUkuQtb)?HJM6Bkba#^1%O~ zub7o0d#(u%bjn;onw8uRJ7pv^4yOz{P^2;wzA6QBZuMU|GW6B^DX+>9v40{mq`F@U1y+lK`z-M?ju1!D*(Gye#YFb!f;0X0L{5 z#xc7l=K$K7L#{v}EE?jxmHZ8r|5)h0h{h4?A6|TwhlB%Al?U$<#?-fFlM`%!z{Ai- zC6AUOAu|3u5m{frGc`snQFLDhqz+kc38h(in40XMml!|Iv>`t>=QC2^4NGAW%b8@8 zvH`>a_^9Fg)P^a#N)8Ql>yL_fzyj|`gTvt2i+eHiSTpqiRJCaJ2}E=w=?QjQYA2&b zZx%R&Ys9_g9Z_Kvw%AQ04%~e&LRJBd(!dK++HHu*&O_-3WVD#4g!jD)BT2yM0cMY+ z7_iZ9q}p{9e26~;{3B~3%gm%ZR0Z%}fhfP6b@<)Gn6J+v1z9bT82N<3Lc7pF+hst} z@a-XiT^W;Z6xLAsWK2aV!n(*_9VLl?<1$7nPY9ug9$$2cDCP#<24xip-FF62z&VT; z*{tl5+c>3pJj{|zYnHPYk)O1s@Im7(uB2;az|A}ANQX^nq{NN^dQ9@7!2?MK!Fgz=SCcL$w5K*+-dZ_Vx@GWp#!7}ou?3eJVg z>j=k&%epTKD?k3qxFqB@TIC>t_WxFV1l!47YE;cJ+rQA@F$;p?wYbrd4|#8hNS;0b$E%?~03wuY>}i!8)E|PPdt2pN0V1mJWoW%nZe5^M zJpj*+jaozEK&L*`ny;stnQY&dI-F4Mz=>P0?Su7ovrV&1w7>?mQzsdb8xbA_gTk0PXqpBx{j@l_ZmyDHk{$pw*RZu;v<>c|HE&$l!|$rLIbQ}a3 zpC}k%g-w_+J4bCd0xyePEGg>>7(K?ou*yDXd0HGN{*ZF9F9bk^-*#Y&_|;~sZ&HtI zqZPX1P>-%cgCZ#*_M%~ZW^|*YK~`ulxl>RO*&))u52d%Q`E>~3p`l3M{flqzc%>a; zIen465@2lXu7E(uXhed^OK2O@a(xI*`ZM&w-MDg0+#bfkpvjJ4h$v#We z?LdMMehxzI+ZVI^+nO_AaKc6P=OBIJ@sNx7ys}^D{Q_+og;Vx^av(|QoKF_J)|#`y7+Q~EgHqrNFD`1{}R1% zv-FzvKcv+U>aJ1+F^6)PTP&LVYUygo1exs37 zn8qmD#&G|7pUuVK5Zvm2imb4VMHIACUR4y zArqfxmWjsNo`5?57Xy2<0s7{E$)_6UtHb#QF>oC%`#83qOxEv666n(kveE)ZHS){b zn`3``kfFYzc)Y3Lqc+zLkIY%gdf&v744sWUHTGek-KsGn4wHog4X#(Ds-8J+Jzr?` ziczcpg&mXQ7S&W0TX_1cTb??yDi9_xVaL3~Ozl?%ngx$^=T>Ou8fM&7tIA{Nv@e)& zIQF3^u>^*nn}_H#3qoM%d=@=E`7QiG-Vw(%GKI$8;*YYy zK)Y%A(q~|fudR2E@1t~OU7A$_$feP`t;KPUnIx` z+{S&trb-hO16)jWSurNNS4}9=>7|LmW{I^-tbw)W4}Z8|j$WMeg3N)S|N#*%9YCNZT64w>(f(R1@Cgwe%0}W}et5W4eP3VwKTP7is;FFLHRD8|} z!IIt0jv)FM)|Q2|v?4o9Qz^)0OgbHbPtB8fhcN=t{bQNHs z?2x`BX%<--;(j1N%?QqBO$sr3Mcs{aqH+wLX%W;`m?i%WoQzrx8_dAT7g=pfn8t_f zkrHA+R4r2}y;0S}334nF|6?vd=w42baKB(I`>_?>7;(=`zxfzT(G#np&S+yIeId(zk%wx_>P0#g8ilB)UuV9eGT-^(<9kqlR zI>?B`jyx_f5xzE(M8VyyU!3?Jx}dOH6=R}(%x#=R1%}!QR?#IW; z&T&oAM7Fc_@4=*nf+DNG+K7*BuH2@TFF`+`jiC171AN37UtAL?7LBKyOr_50`(U{Q zA}K(Q2O~w0X4xVl10$s!7bja@?F2G4z-*cZ9jZ9h3k|NIggE*?2(Er{xryK>p-}@2 z!CufU$A}qrlDU>>Q}->_~SKCqQ=P8QYrAZHjM!2t0U1Oq_K*Rw~Ze^rN=B@giReevepu9CMvWk~D zKtF*6X)7TD-z6gO6Svd-khbPnn`(^@;RP98A{db;P6yNLVyF$6r~abQx-7I5-lQ?! zHSkwi$toVPK8cY>6BXntu|)XSgBz!~yJecX|8ME}@mp1NB+85IP8 zFjn?pUXT7#RR`-AcU$2yqx-lfoojMubz!TvaYBzZZb{TmdK1Y`(?xOw<^f&hrO(cR zLglV444Hld7gclzD0UbtrW=R5SKiU!8hdbh*cEN#h#-*oQIspDb?BR2L;cg2xmDC_ zCdTl$RDNu8Wsd!pYr&6tb?p(2wc#-jmYLD5ewXGU zjzV0u63>L;;}VbvcMxWB!jPq5qaWRJi2E;tECQ6AVJ|G9T7ffbAb;)CJYAWNr;_+Z z-Z)bk-4Uo?=&n?0w4UK(m3eLYdxb0D+so=TVN;|cZFGAe@8>iGs~KT)MWH8Nib#&J zlU!mghd}27DFUp!>VxLZMd7I0{{4c6<1X#rq?+ ze%=oC1=UJ^TIl+V?2Utos+XK@115n9=j<9@J0ncyqG^h3-v4k_AE~=`?MYmotoy>c zYVnG78zgNm>UzyWh-Zx|o}^~LfzXBI0x?WV3`3KN1~`Q5i=>lT4wF6+h7H9C_A7QI$CdT_!Nvq5y05EpSVmd>l-^?uw7^hOs2XiBr!Ckxs{Q$RNpPExU z$r$4CEv+$l8~T+=-EicVlK5heXtBnio}3Dn{&65Ds?X80S1WI-s&)$-I6<;fAJ-HBVpD$i}Qj=?4wVWPdn zxEIo2^_|pF+PKgEq1%}3MGnGpTrd!*CBavok_nA$0|v}{TN;twfx-zZjCp>AT)`-8 zegy{a!Dfe9s7L6J=!acz)o$h<5^`EO9pi5m+gK(c{^<#t!i?E7M%V=V3(3>}6fL*z>*Y9gE){8`Jb~U(uMZKfai# zt4Qt{ld!>BUZJQtp{Yo=Q$|cd_#`XHQ|y>tA@>(=_uG`L<%jy~A92MC2694fJa$-2 z-~(tJIg_W_Z8r3yq!JX+aZM=n2Wnuq9CIv|bs;k?Zn)2dLS?8g0(kKk48o)Q4|ZpP z-nS7TI36}2-T}&%Y0*E9Q+;n=@#L-xfid;9i(`))$^#2R0v)_RU*A)hTz@b5(=IDd zLyV!{Rxym6zM7gAs~ez<=A8D-d%R&&r|yDh)a^SFZ~kpQ0|L{ZBzO6AI^T3t1jgQ} zIPI1o98^f?vkqK?GlwA&O~`mE;jLdBRZf?XjQ=`bavNyXg|D!2CD&EpeJ>yl$1+ulx1Ui-P69238GzD z7XEOCaU{5Y_h+DCg~Z@8*J64`iU!l$#9Lj=2$rBBSFFDt4&h9CU4efB$H5Q{0rN?)I)IZJ4@RW3viWXdweX5Ms{90}R&y=^| z9Ut3;f&oIsxn`H-m}GHBsa9hp*Nop3V5qNs%d%>*DDL#!fSL!I^Wet%LU*rt>+QXn zje(wn;B%|&J!zXf7Zi9tzM?J&tky}Zi|b}_YlE!LRYf%_>NF2qwdJk}ql&ghufG$k z>(ey^prxp|oP_F4^@@h_n9gWb?PBM3SM$bP@eO%UtS!~L7AyquftLiH8(Y56ZirRY z-gGVx5cm}2=mR^l3)UbnYN4JJ>Y*#BA9zEf=6mRboUCInw^HRZvmWpJb+xt2G z@v_$B$W6=SJ94y-46E;1cbt#i*zzbaMprzq>;8iWiJRqD^qG2(J?aewkuB?IS0Bl* ziQW-wZ>TN2K44uUEWKD;->%9z?-rwT=cr3H1M_2}TYmUeWdpy`Iiu?v4~?(ugji5Z zTK{YD+cPUmChUL2mj>#FjFD;|Df~Mw>vepYr0YR|;akP@rh*MI74P_LxDoyK%+d;U zKVm;V)UNV>s7TjU7#sW?I$@pGWCuW-cBh-G2mkka(|c9J7f(Y0--3cF(F z@`Fm;!UU@ZNjh!f1a0NAHho#~A2q6T@tTa#uF0M{eOvJ$$ZOwjKAN9>=5+XPc1izA zlXuMLfc4$FmK=F+-nb}U&i;ms`CWore#ZtaQ|c})Zr*T5mymqQT3)J|;(Z#%L&ZJ? zbJYQg8B^9B`1}>2Ppr&Ot=RPELf6Z(ai_x~XtDPoT$kD%9S0bL=tlw2y z@Ul)<6)**o!B3TWj)E&8C}ORdgvKXK^9K{( z8bb??pNV)&hO1&PX{_m&7EZC#A z*O!O~hmTn&kQ|FIFM8__u6jjq!RmXu3;cZT8_L3r2z69JY|Bz8uKPD14bz-(RW5nU zr)sCTW}XE<>b0?I`L|?2$G|C-Zyi!rJ}fV zf*RG>W{<4)U~jo|SNq|uK*HVa8ZTKa)jo`soc(NTyg=git-uril^cTPqmzFNF)M55wxh(I#4O1rGk~^f&d8+1*J+6lqF;kL{U}} zWJHLN_uNScL+sPv`+J`E^Zr>&;LdlPbDis4=eoZU-r+AGQ($$D?n|0U2Xi-f`HD0= zkE=xMgU=YOr0Nh=VUdJgo-Ox_XSj35AKlORHW{Lm$dzjINpG48ze0VegmurM-p5ckutLJ z+RJ~1`z=aI{YMl&Y$<8yeWOfEFRmmOi%ufEmzxnQzXa5PW zf3MXo6d0bpTRWm#8~65{f4*Jt-2*>s$Uv4yUYUr`!SanX3B{b7_W2()mL0yfXN5z5 zTK$fDY1h0jlN*#d?$r68fYzv7$(;jNoceOGUV|(^|MmR0{lpIyEcQ^_#YoRp1D(0t z(kt@9`Yo9R5x;diFT6cBD_AwwnE4_E@h&c_7m6r^Y^VBE!mfAWzSd{AFHgDo_QF}~ z6!Yglwk=w2__d|>vCs?KUdJqq_M_SqZc4LBjL`qZ5u+^kD_?WYoJ93S8?k#*H2Y`w z+uZj)TGAS#`*LtEAHQ?^y8<4GRd0QEpZhy}(mP%rx5J}@cDu;=r_7Mdik{%Fg(dM# zM*=yGea}w(C7|V96D>{QW|i3){dP9oyQi~-ID;{_yZ9Y%&ntfn``Ba0YD#Qq_j<0G zK;_QkQ_NkQGe^(9$~17;Q;?=gG}ic(RP^9Tf0q(ffoW>n7t|eTmt5fbE+EInDuUC{ zV|+yCAx@QF^ikDmH(Q{io0Ead+YP`o*z_o8SHt7-I}8Qdek*=c6H{>2Td-O*CBfJF zv4K2WS5(3k zh-&DRYc#4pgE6~-TgX?r-gPR#a_%F>Mog%SDow6n29~?~H07LJdjVPZd&~P47`%V- zlFWm7n1)UZwIsU1uJV8o!=04@CS*!aSa*wt^51XUV{cbvxDnqRY!yA$Nh2C((uz7S z>fG6UQScPSE-$H5;c~IObvL|QDv$oMM{tinM7pE8uD|7ZhR;b1uh~L1K4z8^TU1)P zW4Orve*Wg2CX0FISX$qj+5>f_HAN{`U(e4wGyNN{F7rg{+Z-4&{^=^QC!d#Z7p5cN&4PE}&0)zdYASo+f`;;6-S(KiQ>Hv?}0C zpe~uRCH-ZO5>3~3`v4Ob{k$C2A6h?@ne_f|x@)u#d6K$5UaUSWX>>(d}zBX5#!*X)S zNV$9M#$7b6S#zJ^>?hW9PKL}|YH5ScE!!dQv9{rFr4Xl?L}grx@~e>7xJ}@Q&tJ}| z+e^!w?@)h&x|K7ZX@N3(?SEZ=(e1t|y0e6ro;~y{%kox2;a}z?v2E9I&Ny-}wO3PD zoKUU6F5?7D=UmFmu5J+tgX`E%eEP+9=)+>Lf-p7tIOp zOUG>c^s=>qK>InsY6|T^>mCfP8CzpV&EI^70A3hq+Cg=IOrQ!pACC^QJBV%fdzbU$aqD|P0 z`RV=|@eeC4tJB((F&8d`@*UgU5KJ~54!AdI&h@S{9LrzH;3lN<>I~W}YRMC_jc$wo zyr_bOXd31aX)4*q)8Dql7{GdZ zTh0Uhpiq7RK3TNUkU+6@PX4{nBm0i0AyF%KVIE1DrnNh~yUG6BTT~Y>=QU=0Tru_r zoPV?1#V%JCtj{|$&x=rh{;=UAZo2{-yN&THs$q!zy~s3J1BLfLh?_PEIDMN2D_Ej|D~2fl`{HPR2`E)roN>33llYNuR!X8{?`TVY9CsyD=>0*p14^-W3P1{Z2Y00tUOqM=1@v;I{9EspdCpE>I zL~eZRS@qb6Jy_EP=UqAIu37%qcj5)~t1;I6hyy{odoHPDcyHTI*I8Lu)VT17Z){%S z$Da6Q?|(49COY`B-B!sj-rtt)mRvB@*^2WD6Z}rMV`F{w+mTbuT2oC;fWIPe9-h5O zWH@9ORY0m;c#z^?5@4l3^WkN|yCLmdhsqnc&HL$@CvF*(vby@h}IbYd0VIifII;1v~4Td8(b4l=|k!gA*N)#BI;EBV5=xKV=^O;zB` zr=6LHA}l%9kRexUt>2-iAJl@|MD`1n>;@7|PKV5Mu(XNFF|ELu{qA=lx?rI?O%Cox zXF-$;xL1z^lWkUpMEu^cdKB#>rIx+h{qCK|4QukKrgu_rkQcFHO;NPGV%=r^Z^(iV z)}dim0XyCNZP&;Vt&)eis!UdYK%aTr;Ff&*v((v~%uY5d`-AXVWMo9Y7NE+%>Oy&3 zG+xffzAzuK;QmKCdv^SI{6{#DGoGZ=;>o++hlYGR^ybj11D&yWO`_gGDyffgI}#_P z!tOCJIl9g~#_>H-)EjM#W9do-ucjs*G*PINr(I-Gh4Ocf5DvNCX;g`6uf@{Bc(|Y( zohh}xUqQ+12RHA>ArGY|dpNZu!kTdb0_86b5U(c-5KEXj5C>j$YVLKHd}i&8j*YOU z7+<#nEzbNZ+d!tN7JI$+9jYt**W(!h@AkqjY!l2QyTGrN%e!dw>Cb1yQ!26#=G`tz zZPu`=v?~?N=2}M)RBO>pM|qDZ%DLOgO^0>z=KW>+W4H+SEJu-sK59$6_$Nb&uTZym z+KNyN&!j_0pqS_=1>fDwIpff^I7+bDMCku6>z*~{Tix{Rvm5iL%d-Mx#dvL2K^Csy9$^**}b?UgCjwQx}n)YS&*`~v!C?pp%+HAf#)HQ=+ z7@IyoEp;~$r>+FP<*z7azS4pF+L|4Urb2G;CW-eGd3GGrRQZ<*bx0C>Gv-2&i@tkS z?ymz2ujl53peIQcRgZT}5hE$Vf>eSU-2_D_8Vrl6>EK+A@nt$<*=ueY&{=NEv<=rg zA>(R6zdLs62Wz!mF#gV3}iwd;tDV;@y zyW_n|SPT`KVt}9yYxWvonL@uH*WC(5YvK)>Vu@|~^bQ`RKk@0#k%N7_EZ)cSSdXZJ zHo8qJp#-)M!pJ)5iS}`G18fmu69pe}ioUP+&&N8$`0OQ;p=))(JpOAV)+IO$bQ6xH z>rjtblx^dK=34r5O=?ju9`>ch!XtXPWs!! zXMaf-mc958E<4>q4brKNK2g5)wgUfkxgdK!nR4W?;ATY`+ui1n{~nJ2H6|eMyVRWH zbqB}-?Spt*KBm-_tSd<gz(RGi)>D2+(0G|VlhrqZ|Y!pzjo+lW$C`X8iS_o9O}_P@pL1bTchF? zhdt8M^>Ic->J5Tw&H+w%hI)HtB+UCCV0o`rL!^MWE$bSN0e8od|1AZ2~WPqIDWjPmpH*0wyW!^8j3!eZ^3E3V)xYMNRGG=^9eXpmtUS7nz68aS^GRPc__EAOgQ?B&S9JaDbtX>` zKFm&VpZQDO)H(hxcWr69us+_TMl_Gn-gE=iqeXXfx4lc*EGU@4f6n3hquHXto~&9?$ycdyRAetJG*BM_BrX63r*33a|4!e0i=m9{ z7(~C55EaO*TFhAFw*)yxerM>yC{eV?^W)>Jcg4OaeCFW0N;FRw=h6SL(cpqF&UuX? z(eu;ClGC|m!PB^_jeq`B)V74(v8MVqooai_(JSlLu!oudwQ#?msk+W-zpDPF-Pzv8 z5*DpOJ(1s8FGq{czsRi}rZ34Fa;JrG!n@xY@4I7bxw^6F_N{y>VCXn_RCQwUD%3r| z%MK1%+*9pMC85Xqev6`fa#x6=Aiv$NKdU8__wvmWG*9q6rTtgBTSFm%e z5+jwK`D)fwMUP{QLzqwmuU$^J)+Xu&_%37DX6bET`RbD{O5Ch z(aqm5!@YVw5bEnzf2~N%9)6rJFtG`hf4-IKCNwQaV}Gv=Yi)9gsE1#s!SCgw z*jM1Xv6T2Kzjd7%$sXpAJr<8-52(!qJD^yb1c(7d&%_et0X{%If(E!Cg<=le8~srU z4!Zm3NpanlzdEqaqYyZ+OiwbqbL|GI)uhO)=U)0DJoiS?{b6>Z=s`XSMd*SHOS)b~ z&=lcYbu?X zVW#bq-QS1kf20qyg0So%3pFL`i#GRgx~tl*w{ko=?+zQh2AY?io}8pg>r-a8*JNPW zDSP@)0M-ru6ZLF;{fg)a-PN5a_Q1a{6;>v`*gNKCB6XQGgugLr4@H}O>+g#o3^3K` z(DV2@_J#$T=Vn=1$MOxjo4N2wIu;25CYo#Ug(vw*+{$qGNehNZJ|cUM(dOnPgv@NrJ$D}5*4j;P$-igo7E zT(~AW^yx=Ud1kW&+j^4C8y-^Eyeiu(nqqv4CVw@#xNK>nOR%ol?%I-iVsVxn`>(4p zU4>4X@3*F7{PWc_4(`<9N4&*=EYT>IY!#4qbvL{?m0h9QMA9Ut3vk(eC|)bYe)TPq zb053wBAS+1(IfhfoOMh6eqTx5oThj1RKc8eBgMcuIxASh0yO*2L+1r){e56QPZW5LU4l?`8Wa zGy!MB$C)jAY7o`X<-8!^aac@BDv?r;RA59bi9kUr-livasQR2FkNd9-z6n668<%Xw z(`Ve}PwE8`Y`gCZMN{0O1Q!#9Y@^G+JLajQ@rQmUkitWQ5(2F55D26~U@8o==KvcA zNYqV<#^@*>e$bB@=h zxzJ4p4WGUw}5G@PfW}nXk(?{rZ*n(Ur3hk%+e;3vOnly zh$-7?Wgej%({TKUPL->pLQ>_W5CSjF;W z-EaFBT{y8BjSrZU_pWg(YHq2u6n2>a7RC@NA&~vsTH*e#u1T`TNgEfa_mJ$dUi((! z&(!(m+)F!@Xw7YnMjW+l?-_K`t@d}uSeoajZBz16dEc0aCk75gxj6Bb$kV7Sst%`+ zck#t0W{mFvi;^>FUhrZo9b#WE7YfDG~7}o@mpc!x16Cerz?@0QN-ivI`6Gfv~KvF9X_#Udm&aKkXidqqWb6c zwru0)D%UtZX8rnw>vp-K{Xmop2dbzCwpvyF>jMln(X$MYrE}Giz>&nuYzsI5%z-%_ zdPwxHI!@JnJZk_OO|^u3o;ht${k2_mW8LlK$Z7m18oNnAr!M2`|5C3;YY)hIOePdu zy`e%|@J5Zp{R(Ynn3ek7diG;7rT3>`_eb6JtN2%cu_9A9pv`{o%t!NX)K1y7omMF- zZ!A!dV?*r@#4WGu1)X8_Sold$UuRKDrg;A>n8i1`k83{Z8|GjjS%fFB2px(@PSS!@ z56D>pN4KgI<&l7KnXM*ad32<7+U1I8uw(^EbQ5y!!bc6KmGFQ--A(!0@App03leWQ zNgMf}Rv6}Y8VW88gB^Ju(_O3iND+ZKSy(|gfieqrUln%$M4y1^5kw81OTzD~pYCN! zCxzU(`h=y)zhuwQu!=}X2^178&Q-{MR~$QAu&uUow=I9G`i^uoFIVH;kU4E09~WnM zG_=!MksWvYl|Jp7=&y98!y3**e{Yw9OgmSh*^4NXW7GuaH1EfKpNhZsqAus0nVGu) zP@et0cmjr|bhqk7y3RCy?##>6p)C;gR5(X=AE0>NfC*9LKVK^*)Hk#QV| zm`pzhbb{Qo1G$qBx+q*GYJ`Mw5Lmv(d7q#gV2ZeXQ(PX`t)P80$Im{U8BvL*InoX6 z0y1e<&D@agAGJfLk_n{ijmxgvHsmvat`6DKqmUMgpF&JiN<=|# z;8V({YjOnzA0PS-x*8G8$b#D|-VZSans1)#+OBfk{qRqgGnzM@po?MGe;TR?&(0^* zh!TSW-f?%I!`A0Qkd7}Ds`!DyDCX`NI#vD^FMej|j;sVrW2%8|fT=o-v05?9-2=_( zy4ISswM(62YlnmfXedyy1kawD4lB>08ec1X7{k}n$?n5`D@Mv$kNoa9 zFq96F%E!b|$FeV8r3)3Et-$Vnc9q!c_34QXDuIIEm6_}3Jg7KykKmGV@D42g###Ph za=EE;?MAm%UNAbUp*7IwY3+#OJ=k#EWOlCNpN`*KO(kYuJ*lny=oy>CgIkkNl&7PgvFhDQAL$b&bcKV7|J#2knu>6H^kP>Op;{V4Mpp^dTIwj^E z+)h#FL+e5ITTU*8C4jcuUk3>0bQ35o09L@|n2V6}g56~C#z+eTgsFj+#6!RJSVAJw zv|E(8YXSF?Qt+}E*1D*K>$w(?N@b@7+9H3Qq0WEAaK!}p0ziCF)r<4~o-=epo(v?g zHUI3$`H(W6@bkb<<;w9d8B$MPNhz_I%|o$cE`gxuZi8&Yph+l>Yfr52jp6chtz@-f zfPp`2gv?Kela`mGbkJO%&X@@+1&yug@*eA1M>#sTAh+%dvzjU4AhE=Qu1dtI_2w7u zNlqe=n${3c#_kGouf4KvtHM#yBNl&h*NA`0nrm{NwjtAZ#y@c2ciRd@ZVLPZ>qas# zv^S@W#NJT?T-G_NeU#@W=_w)G`@7!`6W7Y6WZlt!TAh*N{2GVlYr~3aaxZBIQi6Nv zCJt7HV%Af(t>X_z>+Qo)32B6~=d4`2!9h_HB&@ORsV}k5@cnm>1(1`Rhm+#-urG}A z4Wy%!_pa=JjXULFb(Z?gh^$u-UqL zBiqWh+xc|9jH^04jmI_^)<3@F5?m}mTQXQ_1&rTc2S$H`1e8O14xT&lo&l)B_{DcA zAl(sbKD)Fx3r$o8>;iSUmu1S-$1H8>J-@dr)6cd9#omOROmXKHRt)GkZCM$HoC%=o zf?Hty!H)3M*_cukD*mrcYrp+b+Up%XO7Kh3`LWNi>~LoIV{<25#B1N-6*u0#&nx=W zwqZty6A+}6!7MmqhsRt#X@ed_lzQ;UHMYtKfp5?ZZBOytv;KahY=qT^K&18FD3&?| zPlw8^Yar_a| z9r{&B4-p0R&*)!2DU0Dq^QLw+-FIi@FUmBr79sUD?&)djd}+8C*%agnmerkuBKInp za*TSj-mcq8*aeCSfj~ee^A%*i-P3>CtmzpYZH}-ET|*h$rL+ z$;G6mw>*;W`?*bp4#vHLaO1{~a=VXq3XN=>+$3aom`Yl$+GMd%ZY5^GiJ z&6$f48ga_l#b!!sLPZ^($T8j0@FZn$8=cCNT zjUEZhd2xg^#S+J5m-sT4H^LFTF9@ht21pE9!tb*CS>Lo6RjtUFXWxUYcG1F6egsnq2kj~9yRIz%tea~o_=^Vp1hA92j2 zo~fqZKV?{8+l^zn?rq{`G7H_bg@^B#xaXe@aLJm>yx4Iv^sP1WPm_kDNy7Z(X@9+R zxsgH?n&+PfC2;Pni_ZntOTQeyq0w@tI-+On## zsP8b6ICo7B5o96cGXyoI1LpeGR0N){zEJVC_{4VQfpiQLTpdV()H{-}#Azy1TgurS zLh%a5D83{yUCis?=YA7K>3xwcY*JdXq3>FFS8@~WwE=tCaq1>F0qa|LnMC1msC+0Aa3I z#hM|yn6f>-{z;Y1K02KFxBM#r=1#Wh`wW$tebE2tFiC6M#2>{jyywSy0(_ zBIx>h*D_Ny?Iy+c!{TFqYYEge!e^%}X$H9nq5~B7C&r?3aZ#CQ2!9_k0RwCL23U1%ay3u)QUCqpJc54~;Q$D;^SGeJH0UY20qc7_1pI(oHWOit*X7e0fTqntOrlLL*SB+r85a0p* z4v24|IZJf6(%-I6H1sekA}}bHW7&ve!?)827R49M8h(DgY2abS&})y?4SxfSU3=Ya z@KS~Cr_2Of!9M)FnlmU~QWGsK-pP;4oCdYE?(EPXO!!=`O$~2|-x^U0+;~lHod!(< zcWt;Zu8G9Me*7&W$%kb2y3?bnD1RZB(eKu@#G_b)CJ>e4dBxYZB?J-(mHmB~P$x9( zdl=G;l$?sO$nzWk#&ir^d}IDrNK8kor<0P8zA3-d_Wg!zKduGuD0VLQ#*?s^5&msP z2U1mwRopESYglL}z_VA9t+we9&8UJTjJF%~kk89`JZi{qr<2~D|8($}p#od) z)ro7uQ?c{7+WbqE!X?qH^_=-*_Fs2jskGboBh&PXEZiW6XGBm3r(WBO)}?4CPy1p;yWYMj3ipP#7kghAK0x|EL@W)oI8^FF^80Wpo!C7WP3WCC%3@! z)vBRe^u|kaFZD^#L-7UlE04_Z|^YPoD}$Do`%LF5aU z%ahH#@(}Ra8LjuZEjWXTVN>?y5g{ki#}}6`pb7yr@df4r?lB~Mw8v`JR*nv|W1Ib; z9V@M2y)4rc{vUO$2nV+k>PnAGAAhq?XpUrovCWQen2;J2*)iE&*0*M0{wN%WD5S zg+k4}l)|@RrVk(1&pd~8fQZTgz7;6mKKpxE*RZUDNP-Hbn3lh$a*grFw}x!)f+ITo z;W{(VVzW%2mF65nU^@)x21u<0!8dxOdRNZy_nr>m8X^|#J&LKxD(KYFjX&3t6IlE+${w-OUez34%jGO(pgZta3R#hCj4E@9kd9jTi{MZFQQO;O^8m+~3+pF~qR( zAdYu;X;Sqh%p0L$#IZ`6jQ^R6sml!pLC9DjHKB_S3hNylof$}KL!c2P2_*m$VnrCj zRVx4I^bEj<)n^t;7ck2_2;DOtb}nna9c!}cQ&h!}Vw9jGRKOJG#+3!=@`H?p1w*8w zE|r_vgO4i=Pf@D{MRE;RL-b+MCQ+?$E^{>@!u?ZL)5ir*UioJyALR~57Df0qTAeby zSNtG9Xdd^{SuER(N$X@pwteVnO(oWzWq39+qv}}$XVUEx@LF`znFltPP1ChC1AI@l zvED^=s?BB=9tvv;PUA)hM2T_sWh^$!gwHa{U9imxP2e5&z^o-=>*;Dsa08eo$zAKxyC~~Wan>i(?rjOLs zCp2a-BQ=Q&lSL0VbA~wCbkZl}oS1idV0pqm-Y3mRT<7+_;({YxU-OG1gLuWFgo?E5 zB;zObXmJJ`e~o6Bib*h_s~IpLF%nN+OiqHGL!?z~2U!5wW_dpmJ0^g<-;qkNffneF zoD(%L2sfPkr>7{jt7HBHoRHbtX649sLGhYNW?HUvTpwZRc`=)5uSyfyGC2-Vc2r zcR8Iglv(jTlpM)Bewvy+6#uEfy;yX&0yLAJ-RFCndf2fbQ_1@{C5p;;c2HA{Q)MAuf(Pb7 zfABbc^Eih7JFkqC5r!R6(Li3!|8jE7zr9F)DO3IHV z8s-V_3AQfqp;Q-CzZ1OZ_xa8R4YRA;iz<8Xcd$XT zJ(HOvrGWCGSh8+%;ubA?K}xp$6k753vpyWw*A?cP{PD({!&>2&4|=+RZiQR zE~8f;f=Eqx!N)$5f3pjW)r3_x4FMQCNy%9ND#dgCidF(+Wm-LzSiWM(Yi?h&j}qNw zdtvfm1%Cgl3KZKZqT}tpgmk@Ug1ohj?}ob)H8Aj;ZroUJ76tY`UvCz>#9fZrHIFZM zj6d+57KerI5W_ZkTJqOT&Gf+-L-llTmhVnhQ6*tVfWT+9;C36y)7FV-;H^&dRHpBy z=N_YO|6{1|pp_u*-ND4y{IB^D-(>iB(UTx;veFmOg>L)z=4@$s?dy?~&!aA^&UiaS ziTB*n<&mBC@nQv7Aa3Q({$yI6A4?W&*A@8B?r$H+{`7M=ZKy`5L=Y^%DMty?!pu^G zE%2-ew%;1! zXB%Cs3vd5mz7;gQ5VU25x0DGaH`cutx1MDU5dFOiG?dl1b!o6fv;7VDVR8@$JY~sGjXI+gs z?5WQ6K=CyExt+s3!(5i?*UstsSekk^LX6x_I>$>6_E_4@VIc%X+W2_3}&3m%-@l)_~w+_iTPKouPWZa3<>O zWBj+nEZ;Y#C>wcZhlOU4@66Ei`EGyI!nNM~3sv+9r%#B>$%{c#J<9pp?FSa|SVOlr zSP{wvA9)Fto_o7YB0kuAqVNM#jxpCHDe<8rKaQdXL<9;`XgU2#-nn5+2@j3EQO@Fx z5g@wxvaZ#v#3W^+{ChS)U3lqAS7R|Xkv#+%`6!O@md&#AaBO_E_{3M7#WWV&JL#wHZsie&=!oYI$A*K6@-(fv+aA;~+ zMK3uQ=-Lmw0l5x#=EUY|YVp1NxiBY$(-vr-1QA>N&}k|oD=@Smb&n!# z<)7(|j=Zg*U3*=s3(o(^G~_?q#9H&^vIeP_*dzTjxPZ<;dqYi7N_5*y##wVO0WB`A zVkSZ_GIPz_$@KT99eGK3L%I!PaiCx&hqV&9#Vv zv>^CIxC&vj)9#0DKRK3g?<#$O$5ev<6OeYkfckWIPQf0t%a+sW>7kt-y(f=WgsPRi zAv~YW!^vYa4!law*!?PN-{lPNSGLpFfz+AwHe1XZJ^EIG`y2?_KI1&_pt1J|u;0FDLae+= zcfJO&(`vN4lDv)dHUDLMly~e7vra6p*TF)b7Sy4q8KlF9{~NH6PHJeeKYZrm{=uF= zG|kk8NFarz(A}!0r{d0&31Qc-%CWb_3iuxD$To^J64dd_TyA7{TJRgUa^5~=KIN5$ z(;%(*5{Qk>wlqaSH=<#I*a20Mj1`-QD3v@OK>;e1mQt2vE2NVRhZ7kK5l^{ooW)=*c-&zBiRQ88c)ch}x_#P*k2*C9J62>E z5eeJ#%>1rJ@b$gpha;+=dgT1ve50*h0d$?v*$6$ko2`MSyzJZK-E=QLZz@gA!q)Fh zmF3QXzis~>Ds6pU8y53}*SZqWaa3JBaoi9~>v13{1=a4m{g|Af?qXsaT$sD(SbqJ~ zoc%7@4$L(b0NKk3hfH=@Y~<*8f&G9-F2SKOw~4)KsB{@pFQ~w0m+QhmyVWlpNFpS! z!Vm>0U9#XFt02Z*bR3#R6P|k@yEpic~vM{V`n$J|S zOICoxN!#C-@?Ssb3XbQ>5&O`-7mIp%FZcMkBv+I28nX;%BnXbqoy~1t5L@=}0vES< z4!*b33f*;ZXm2i8WkK*etyT;v4Salex%pA56i24b^;**Vk#ZyFbmfIt|*Uiy8ayhn{ACTwo{B`utdfaB7^}z`q4S=FAiLSKxDoq zA!{jLyFC<>ji^cvBB~MzOA80s3PY32$%Igibn$+%fdsUsWg4&fD=!qAwc=}|3%OJH z&$)FhA?_k+p(aTb?=jr3z+th{L-})_7`^zO4k^;qcWVE+P{raP8={6Y_^Na3lJ1d%-eJQkKu6kL?(Cp`c5i?SKCG%h1cJ0n}LPRL zU(>wy%}<#QOW5FJ5nWL8W?OD~h#I4f@!{1CL)yu_T6S^%h7Nt1j!)Y5hPZ$^Xx@k& zxzZ9D&JGxxNMeL30AuupyoJb{kQU+R6bpozC4nGJLL_sN$uXd9PH7QxpH4HI>;Fe& zpsiLuC3TN=A*t|M)VWYS&f9lc=g${7bCNn+{lUbgaKO{EWpRH9xSZ?<$*BQ^yU zCR%9`d89Y7*`i8r@tRrw-ZtMHJ$1?i!xk33F08Mq<=fq{Y9R5} z6y~{w^}aTrhG^4bB-1I92rSER+90%E^-r7*qVp;1<$f<|C#;nW!okO(A+7Q+loazI zVd(&kIsdxHx{m2tVXWy(0+UMmrt#+g%5~(;xi{xINR#{C1)eEUkI3d?nc-YQ<3i%* zYFi4`S&gJAtVkruZ)}=F?sstJgqKfSr@`UwCp9_2Nj*s|rV8|l*$e%6L#^@)jO})J zsT_YC;jxxgn5vlS9`2Nr)f{F`5b9ey_}{yR7JN`)vO?t_?O)y7Y;vd2`s>Wj7wi76 z?b@-zuPHWAkl$31%rWgk{g~mCcaM==X+i{TMe~E zyufE&iTs=hY4WE6-R>>7;JGcx}E1ucgrS1;4$bJbCa%d94}{HKxEKj!nZ7 zp`Z@zdenWrOyf}ylM%x(#(z70hjaBuH(woJ&v-P^`oq|g)bMV-Q^Kb0POta*&ZPl zj-L{n9#v|!V;~MEZEoiF23TC}T=$A)kyI33E&pnIujvfoQ~dnDY?(SLaVqVpU7U5N z3$H~x>-5@&DVkw2utfA;jWkfMKEsQ;730|tZPvB8$8wWU{N4IE3(oVK3kYtY@Gch& zUUSiU*}j)<6V7U$K^(BC@9Jt~CAJq{d*W>PTh+QZ7r$acFetyM>OwD14r2BBW~YXj zrQy1B%oWr8?f3BphEl7k)oWfwwC9)2I7E^vb7VRc$s#KQy{$M=>Hfs}-znXZyiGLt zQ{!_*3=C_&kR#w{kJnQz2=1s#4-gb|gs72*2CbAY6fQ;+37P=WR$e64n&G&bo$Z2G zAvsnQ18A~@8E4Eqx&X46H6QcW`m0$%be>f>OPydAMWB%2omw8biM@}NJu&W67K9iV z#54}{*Dqy?@akP}lYkg4%EK?eOR_ja`sBg(J;~~OD%d?MQ;lfWIGdY=oOnzn3@IPH zksF3$tUFzruxOS0-2f$T6S~PlLYgiAS;dfjRC465sO=aQ_TdU1n{YXbWyuMzZ7t#r zUL4|Wavio=WOvZ@%H^BRQxvc7D4JepdGsdc^_8IllHo_@VU)o`+^Mu6 zJw)LeT)$-axl54&AgrZBZ%F}@sv4VqGe)xmR1D|HjlICTRCG2uZYFb& zVuF!&{)M}df^Ac1d65*8)$Vd^V&2cQFQM4pas{SmN@^dCZSx`hjHr88)Hr95!QOF_ zi!t41$_oYl>WLQ{KbLz+f&Y93neq)l8>mroP`p}wMT=&b?^LAe9x|!>ri#r{;F$Uv zo%N^;SPesTBlZ;I1wc!frjBI6@u%WRo!62{9o%B>C1?rBFxaT-7rv}A^t4rJ>80?? zq0J|rpdX|54gM!C5{<|MK3BGb@C^~GJeIYeuY$}3@DWm&AWi6X9eT(7>+Na4#oyQ$ zARtOgGnZzZH#L$F#&KOSsR~%yhyLrELbo62CU3fktT3D+kuYl?B5lDE7m8(wBnHe;qd~K? zgc$;z#LYb&<|C zO&}trhX=&#`=mlm=>XpZHiS!ON#*XaCsL6(a@@dw$MUoGt_mdTgfD2teM?wBU`ALn znPU9kNyiSFTRU^Wz~nLTGhft<`-MWSD-oMQD-C$HH4Bl+8EF|kM`CS+AZU=-f_2d3 z)d+?#G}1awANg&rbNLIT2NL89aTtlb*cE}yqqbE(DBhOMC|<8u&b&#E3t$HL%d&^j zo{`9|hZic#rU(^fFqxZi$tB5#w08_OVw6zam=8}p-WVQ3WtbjK} zG@Ih#$x&Yk*BN6;=nEA-83zv`DryK$@G!EQy*keg(yVqA&W4){8d?^Fi!X9#a68vZ z32f>jrNXVgZWAC7YYfM$n30fy`9DhjI~m&lqOOrD#F6QY&vzWe>!XskQK2uI<`2qS z!7bS)O2D~9iU7782O$I;8h6-7F*&qgo*T(*%|Ls8&VeQOC6U;;7=rknjfyi@fZ!Z4 zX@J=Wv3&W@e~?|mpmqyk`A?vs!lCg_;9%8iaf zjER_4{khV;AFpCUf~Qy3VqGHWugqI;-m(CUsQTec10MT*WcEUuGNi3feY#CG_^g3o zNXl|YkI9_SVw21Bg^tw7T-SekLCXTmrMq9s!NQ}=dFk#ep z{)poja?`{{Vu&&Xv6TUUGB%JWo)yov%dRu*%4jOY5i`WSs;Mj$njebvvK2R8sV!00)oZMSw5;R zlZ`b}ks4&Y-hQ8rEO3SO4xY_x|ZOY zLHZHC?}Qi%=@JSm^YKk3xNdT?rV`z6$3aCf?UP6okxLDE14QeSD5@VznM2#)E zv`XW2fTm|a#*bJ}{Hv&0YHdxX{yB=0^u}MB>&V&uGFS!?CD4YG?m3MAm~q@cpODJW zJU9zf{NwJu3@FKl9lGcy5*`;BSww8>#_sp%+}YIU({8F`>F6Km4Ofs9;02C9)e{RNdWWadyDeRF_;Bb^Ia z5ZvkDouxXX=1P+dGf9)QWW(WakGrVmGHCgDMxey3P-@Hv!Ejum4_`;Jm=zo_Tk<&e znZL=n8#a1rph8fWdZ)V01@|muw1%}E#)T>8p3gw0g4U1dQ1#T9<8IAAJ<&NxCQ@4J zw~F^aMkSyr)4{@Zl%+t#9?}wL!d@W7=cIRGWM)bKuqoX0Kr5G%~UR=SZ1$ zrUq`CtQ|Hw|1KF?0FB&aMX(wt$$R#f1i8RYj7KksLyz>Re{o<1IR~0w$e4^nI+G5q z`0Qbtj&ADsdZW}@Hj${>EFEq8@}SV@Z&_CNy*!~33`@pY-AHWIMzjTEk3zN^2DUec8ImruA3>jJAVPK+tt3`y{mZU2a^wKb)03Z!E|{$Ch!0`wt=NL+1@d2@J9P--26 z(lnHXbapm6`1?+fR{T$kOKWXHrRu-Wm2#b-V#5T;ClX&c6wl)zX1vGTlU`hq5)yCC z!6xY+31Zou)~5q0EmJZ}MX?fUVU*kfEFV1aLX2+wg^De7?k4QGbh(Yu2!03ue@mBF z$gH@c5ENdGfH>G9mQPNq6Ipm9cp_i{g6BBcJu;Xn_V<}cB#i63An9F#G9mZri;VzB zMne8cI)3urE-j?Z0j3zEdu$e>Fjjw#jF^ryZIN`t$m9P0Xjy|LG7zWM?_7qvFE8C^u(<{^dkjd~K#wYR!3Uz<5&?eS0v3?)Q4`dO(#dTQ z@qh~w44pG1gB}w9qlwM-(XIx#JOVRbC37f{xS5EnPUyi-v<*hn?pgD-#iZ|Kwl`xK zi%~CPIGdvv^FOezTC%JqeSynZX}iP%S~89g5o2zRZJ>l4LiDJcV9CIZYfOU*X|Br9 z?v9CE?-$BQ|1x(~=@%SlE-;FSpk`3yW~m^kWdar&*GpInTn1V4wgTi)S!Jw5WQ0~G z_tb$7tTOh$lNjM!j>SXcV&b?u9>GKZv33+Y8-lm?qXzKSmb{wl9$8X0sExOhsj`X9iX!tKPs~1qT$nFMJ#nlaj5^4jfRJXmPS4fFkZW-P<+J`Fo_E5Why} z#l-&fxW1kl1=OU=ghOzIGvvv&dw89c7$EMA z(IFZ6EL4&}q0IRb5BCXnM3Oq=y*krYs>FxXJoehD!38kVfzuBwiy){mq}*a7BSD)#ncGN!_mv681W?H$?t?P7Iq2$0Dm}yjc3k@kISd$ln}{fcs%F%M zA0qK&wiUo9%&AFIWEXd{@jq1+I*vFcqwtHMb2u`IFXPjtx}49Om|)n86uYvnY03$* zK*|Y?y=k)ZFo)Tt$hH^p4XgtNQ=$l?4Qn_|$hf!I;|^)+L>KhXg)T+iNuy_>uuD9o z1QTPDm*})kv_eZQ3kkM|zmus+BtTet2Ba0oKepG!?q#F*a~z_Q+_+Kd z;T)Q{Ir43HtTnu&MA|Vfa9uWP@h8i9$3_~*(X$fuZg5xehx_nHV!o}91{2G18CRl* z_~Plv{esgKfaK4tg~o;nEp98CC;B)T8L{l~I1hzjT!)^LkJ}esvjnM495al-@KE&W zEMnXTWE#9`N%FRm6oTz*%*5dPKk%1=jPh4B)n(|!2KGFeN7VR$F}{5wb2UI%M9DEP zZevY>kcTkvVj;nq5Lek5k+|4^V-#nx?_ttO(jbQy6K?nnk0P^aVxu8(9Rn)bCL+%YHypdr=%<=OM@iEp3oNiC ze_rcRGmG!x_+i+S zcXao4t{#^61!b`Kc<2$!U1O@=aQ#tZX<@h=Cy_vVGm(zOWm)la;J?obzj%~q(`9Bq z%xUEvwS9z}i#U`_kaqs#psOV52=j#XMQyCUBB8`8z&S|{`u#&2{m5h;g7U{QNV4dN7?RPMu959$2$qq9 zrrC^7k2f^k8`vCgzmw;G)~JzpYJS+tG)iS(U5c>W$%rwx$M)ijl={Mw8XIG`RDvy+ z$HMmrdZ!L^msFYKJ+Chu3Ln~DRMh;teb4g^R-)?d8u;N-2K(q0vG?7$_AIO?nMwht z(f>w+7TmOLCYUlIC|{NcKnpQk-6FK!Ao44&Hz1Wbi&mvsJ@2#F(6^9X^D=3G{o4!Q zY*O5xip6zJYqEO;{Q3b>N5_!u2ZhM^q8Cm3@bDJr#PF`AF7x@hm;RsXu06EMGK`na~}~iKx*9rzCKa<&ZMBMK~OEq7KuqgW~SAaml!2w zQc8u@QrF2K(sUSD20`_Ep7;KK@AsYWoSoURKMl6C?>q1NTzq z#dl*G&h9;PZhl~j6q#79zHKZmca(I2d1NcI$T~TX1XXP=F2Npw*rz<=IIb%Po^rO( zggx9hZETd(h<;;xQ$wzMr3M?uIh+d&0^ZBE@F(|W>$W_x_0?yXZk3hI!v@IBQSMuC zwyIm6%V|C5kbt#3ig6kTitKfDc7l)IRZ57Q&LIt0hg{45O#e;QEsHN2O3XGM?FlTS zsh_Xfl*QFM?KEOY5WqEtdpV9Xa??6z?Oiyuwbu;14*3OdajRarY;T(V zX4^h$&XII9F;Awr%=WgrTAeY$9Ge6FxUP>eJKS6B6|hjn?1xJsTwzP$*z>G^cF&5F zHq)exUB|k%6B${`UC{EhjMtRu(!vi^6Il|GW9BX{m@8V86An9fvU4}$5ZHIs3pm|6X)*BECIexBPL~p?BMq__c5kXPOr3t@WPNF`*@)oDzy6 zKM*F;l5f8F@F*1>^^fCBmxAfi=bt1b(aERA>4 zcM%#~qVQAT-Zi~uDTwXj(zBxBR@`_T^o0Q+Qe)0v?DsbE*YG{*5_^kdM1;qN#pCMy zxnX{S5(eilP6-n+f433(GE~Ifb0*=q54s}GY*V>3?#_=^Qbs}n^AO2a(h%+CdM9Kv z9mslKTuQb5vzOOszjL<-a)or7{TY`!fFC%VOJm8Li16gFXZBken~=eA4rS#kr9WOV zr4YXGCrUh?Jt9PM8a)kVPF-w=2*NeEW196)(3)v|LS1F;}Bsk>g)^^Z&VcUCMFK1S?BSSsoH;d?MIy`l$$@=n9eFmBUg>rbC8PN`U70-4*POtVC2&v4p^lsYU=q++dpwjv zSmi$y(**VTcDPVKz+dS{e_jxmqG&zcd7(HCefV}ncE@p23V-NqEC+43?N7^&#@vI& zFdAa+%r%SlUl`N&P!Nlu|7$FRF%QrMEsRY!j{>PL`M?E-1!ih{3^lM(7(%#f!x<*) z03|}M&jeRq@%B~rQcdefqOeBWUWX~4NC=GC0l>DP5o~g5at-CdNk~hiBrTcS{^G2$ zci>a23?1tgOMXajJhb;PyqyY+hd+EPh8AvNROEW|{v*h>6!3#FqLDNLy$7`Wk8rvr zmiA*-Hc#->EuW5phCZ%mw5DN~K%p13#fe)&hf8QM_&OXt48ZlA>ZS9l7?1=;i99Xu zfKVC!wX+`=G!IvZ@*u>XM-NKUlr;^oRt(sPkwV}A`B1!RNK8xla_*K1D#ec+ zLZ?=CA%x)nvHW;PX;EH^Zh9ml1|7yHoK~rIuy4%;$XRKa#9rM+(tBo(<`6;8en1x$ z=zE>SXR970r#`b1BeESu3i}Ay34ze)%l@8)w6U;p(B7~2Ydx6pZ;23jN}ddnVRMNx zU?XQJ^j&~#tv~wzD1zIYe(}ARhl-aIiE=I!@+bgp_`NY{5`IDC3sgL$XN8zUv=$3bV-=MOdAO_rJaFzR?x}9+QZ|+(!MPiGp)&AU*=BYj8_Nv+ zByHyt<-+-T_QwB4z1On?FReR2-7AdvQn^k9X9BoejYPt?$_D3D$ap_JG!U_VdQgGK zw5evCNQ1_Q^n8mawHU))F>H?IE1cde6x4`+C_=)^Hf=x}F4@Ax653Ny`v<>%!p+4S$>tlG5hKM71U zLwGyCed8NBb!ScXg3c;?>_ZP;-*d0WAFOHh7A0YBtix%m+U!_8IsRyP-)0a<(nQlY z@zv>vN9~zCdfjh!8uAVZ^_kghs1h@LnHowO@b(41*NY8QISB0h;taNES+~1=(}WQg zvm2#$67;oB(Yy3AZS3P)qQyp#cb}?+5H{>5q2MA^Tw&TE-f^b2!)t89nvg9Ws?`wp zgH3K4GVBkVgf942h;(d?84x|RE+^zTa4{efztmKdl`tS_hZUB&zmcVL;5?bMk9paa<}T=GV?@a%u$&gq>P#R{;mZ zFVJPiH#gO-e(+eXfs2qYz zW#JoVqlJzf!vs?X#l_9RocJe^h>-pM&@lJBH0n2AW@*MCN5E6^9Z!G;^_n_2%JSE9 z!HY9gNWZ5khA}F*xHh1U`Y`IvwvUxYS3k^(00B9sJMzLOm~qa-hGI7~M;rFJu!24< z78j~y#l#2-c)De>ydc$!hPQLb=*}QuU(IV-Ep5Q9MNboC>6Ll^>^?UjLw#HTQ~|Oh=A1WQ z3PYP=na70zKAC*ngsvJM(7URRA!DX_A_*5xlIbinayJ^gQ0_AL@sheCTq~cP@!h{8 b&!2we{`Y3RvNePMuDbHtE7o3q+p_-v#{dGC literal 0 HcmV?d00001 diff --git a/browser-extension/firefox/assets/store/screenshot-1-json-compare-1280x800.png b/browser-extension/firefox/assets/store/screenshot-1-json-compare-1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6e7340b0ff6a3394473b5a0af319a72ca1b578 GIT binary patch literal 30699 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 literal 0 HcmV?d00001 diff --git a/browser-extension/firefox/assets/store/screenshot-2-url-curl-1280x800.png b/browser-extension/firefox/assets/store/screenshot-2-url-curl-1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4c8c5963f6c7898cf375c5879c9f1e1e57620c GIT binary patch literal 30571 zcmeFZcT|&E*Ef72BRJ9=oiPdmI<}c{Bq|C@b;eOdR1{QHN>B$8F@z#L1uH57Dr!VZ zR79l42B9V(O^txm00BY|BtU==(v$aG;HdZgJnvf1THhbf`o8a8Yepc~&MCY8&ffbv z*AMKs(VDM2AA%q)+ueUTK+s(9tLpN3YTyUeSbjE z%UBKB37GVI-`&RoAV|9${$HgU^ZaiJ3WjX|`r}ZD+h`{)>zwBamQ-3TPiwe$ao_5d zTQYvj_0QNXUzzdbx02gFscu_#URnJ8YGH$0szYyh=3fOrq4)OYQ@iImEFWCG>brH{ zw=Q@z_u_KD6@k9Jhz-}{Ag%8b-Bs}_vax`ex@}fGc2?#VWH>oA*)#jtYj*sxx-2pF zDY=wAVi`U?f=f1*2A`f*kZO}lME2mHkk_kh?|}cFP6({`De4NM?)~$(2XuG#*IkJ! z2Vjy_wz__5+h?d(c~vZhR?mL%2haZy{#W)y;~|Ssj!U4dKc3TeDlKy@3HQe=)x)We z{IoSi_17IeQ}%i7jrIYA5*NY8fV2z@PFlbr(*&Ox-;{~5nBFU>Fh<_=S+J}II%?g( ztLIr6;<^o_WBlemdxOm6kiowMBQG6ihi-T(IT#`EIV2R=B)hfVrHVzbn_u=Jcj+}5 z$(FcviUH?)nIO%kWL@&x0N(ErYl=ikfPgBwQMrfrQBt90;^h z@x1(~*zY1j&HJ;3f@`6-_1+K zZ#Z6J*KECNRY%qypER{nNji<6DtKFI*HaA>Kqk-d8`@>@>2(&tzqRM=K?4$-)7BRY z6kas=@e6d?etW}5(|{?5JZs&qO=m7-#;c51q`!{SqqrSIqNbZrFx}OI1nP{@cVDo$^z$euJ0;|)J-E%b~{dZ;MA;c36i`H0tO1tj_y z@LI1)2ZAO12&zUsuyW5lyB?wyW0Ouqp-O|DS!J!d_hf?-f6o^dMTjeBa~Coi1fq0nH7a}nC7aAEKF zF`SU%I@7~W^7e$xOdt6`Pngho4Wn;0nc#X}UwWQTpsg¬f$em?~8(LfLDIU$0wP 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
}37jw>==2BiQ}9$>Hl`&-pASk?FM`?qe!Hg(MxS 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 Go&Og&lWLy; literal 0 HcmV?d00001 diff --git a/browser-extension/firefox/assets/store/screenshot-3-tree-view-1280x800.png b/browser-extension/firefox/assets/store/screenshot-3-tree-view-1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..193def163195650e9cade5cd099c43934ed4158e GIT binary patch literal 24732 zcmeHvc~n!^-slMy@fJl}d%*#S)mCd&B3K0(65FcWeoj?e0U3fKqA~PRiK6ar*|qC{m#6(K-K!X!aL2oREx;pDuXfVQ`9-S_=<-~HaZu7xY+oSnUY z`!`Q}pZ{{V_q?~4ybVFnyf6N?bsq#-g8$B1HfJ{YAYJ3@!3QdKpZ8}_af|&+@a3(r zPj`I^L1i>+!y(hqzeNAdFBXDq>P`PpJi<>$ASl@Ri>;r2l@KHsi7pgs<2v*PtBmbd z4GSJMqpU2d$IdE9F-|RM=eJs*&crT0*`NJmaHs8)VC(n1%Wkb`^!0V~UGb3T-qCO^ zWQFiom&<40dS|i4`Ov?txl*?A*(1m1i-V#3JQ&OTwUy0e4kzAAI)N+DF;28etI=D@j$snCEEoAsg^RFG`kU{KgK~toaHFDC{2Eb;cNuoNz^!v7&c00 zW=|Tap*z8&njo$rs@4wAaqigbaOPG36fe;d%M3CKgN|1HV20z_jbRGD=i$3!i?|EN zhHO(r3IlUW-58}^H9eI>jZY9WQ5!y#E+<+ziY&&2RHD(2atf!Gc_8K)E}sgFlU!_< z->Kn#aGP8HWaK9>3(Xi5aZn+m{)X89ZF<921^T1ET%hkHzx=_~idj&YegZY+N;AGa zI7-k@gL1i;=}O3>p6M!=Bpr{Fso8bLk8j=bgE+=PdHE`a@ID8wM8nf#_hr}McM0V8 zOymwu{o(1;wGcA;!nFmddEpZ^NspZd{$*DZ+)z~R)uyEChi8V-_3Fm3JtO`Mh5Gkl zHAs)Vk(=MQh%$HTBij^Lf{1PCJV8~KOz-fZCf5${A@pI#_qPXU{?NR4Erg*U5~T#D zAk`VuV~W|Mg69s63Y6z}mOTX}>^Sw`DVpRG4L$r7EXja(_z35_Ov2oFzfSvy7GrmO z9KCKBEf!3V_;9GgwS{}ANPi(*&n%2cKa5HkcZG=AUr)cj7iT9y9YZa8VDaTNMziii zbC04vGQYjO(+`?m4qY|FvhVI%=!_rqU*=(}_uHn_t%W``54*bBx;EH0W%~C|u382I z9Wgz7=o5?e*DQaW-iu2pYEjew+-1^ZPzib?yDgKRtZoX+(+&^UQ+2%KaT-M*Ctl+} zy*pt!G&g>yb!}9Z8e>!v3iAxLdx|JMVMf*7;ZbB2(&(d`ziWCZ4Inapu66AwQ%ac( z;kxv6l_ti9pukbC_`>HK_O32y^XI}Vys6gr^3fz&Imo4Dspk>b< z<7n7y>+cmdq{wp;dibH}uGHw*7mwOM;Kbc>l^Hi4H7mcbh4xX$|i z{vM3gB{LBKOqnq#UpdBbO_qwCd_Ju5XXy5%n%_P90uX4e(4tiDRAoFIkxukfaoRkL z@csg#aX8gSVR(S4P>v(f@i_5#EY7Qn7E2o2V=P6kPRnBMSAZq%uY-`sCCG5_>dIyh zqsZ!jLMO-LVKiNjJWCWPs3%n|ctdp^Sv=^Cov?=Ux0-SF@-~1g<2b4Vo|0WbPu;8A z7t!P)M#OCkk(VpZ-0|P8&^<3Hr1VIP*>xe;CYlxO4(f?%rrNy{@LrZ}3Z63BS?3b5 zlVL~}DBy9dkz@wu*H_eF5Z6%O0hgLv@@lK?z7*+L3&pMTLi`Ifp4!g=HF|KY$p<)nQJd03JPPB7xplsHKQ@;r%+-*Fg|I8> zIfsDm2=T%?1Y-FB!_S@`MJ+OEP&6|COlX&Lk|3WFI@VE~jG8j!Qx2CVB=*h1zvO29 zyfGZ*7SQB1KCq`S&oSaJB|7E&xps+m4Yo;o4mm=P!#adaPv{&rJt2MSP91>K5Bk|J z);47Yp*8DZQ>6c38e0M&5a-eMcwgt21GJxdZq_6$ifzil5`92`khn5!?Y7z0wPa50 zi2=24ldY4U1Ap4pKfZC~V9ABc4m_!!3Gf87nkk`M_T1CR+gg#rr-u(8LAeG%Hj=1e zVt!hX_Z~{LN;zCi z>1sa!;LlDFcLG)fGO3dfCFpLNGp`)7*MF!B=a$H0GQYsAL z^D>?6)CYH_b<-O4vE!_$#B2`i_<6}CT5Mu+IW|m>lkRU36C?~t6-I~?4+#|!y#8$E zrt&;qR%9ZH?1K&w!a~;FeCh-DzAjo-nyP_7&^cf9ns2wGwG1bt=IPU@hI_mX$v3<-!sGX$94+ORb!L$~f#e}RDvaBZ zC?|vu_IonnT5{8;GF2=N{GUA?2615i>vxcZ& zArEz%Qt^-tJ-_-KIy}LjR(_31;*upC{UREf-E^GSFPzv!i<2u((4}F#li?$>!?CDE zF>>$jhRO!Cup{zfb6Ek;Lld9jnRkiiJY}FsjM09cBxc!*A``=Y3>dbc1~TL$Dt@s@ zg0xB&n<&eIate^X_z1sEq?lx*MS{R08eMPKzhSiT(ZoHZ`=S?BXrF{~Q(qfgLMiNx zrHHI+%Xk|UNm;GwJlF9}v8oa{SFSWf_(8k!wUg1TtBv)X>%3}j}O1MTTeE*W{$RuSnQLZ2_ja`x$WJL=f;6!km$2KqNrd<+t zXvQbG#k1+I(v(w|40B^6kXG3K4-Zkhv!PlZs~|~RbOimM-l6JUgW@w5^f}aFA|GO6eb7gX|YR{OR$_e z>9Heam2!{ahNu+-;};E`Iw=*_CG^qZ2ZNUh@^C^lzLMkwe3;w&A5Cijk3q{|#By?5 z2*XviyoxZfP2;Cj)cdX2aazTzkW)rZjwdukg>YXqU@zo}u(XMlEIVyJ9sflK;|4SPWOI$-8yv0%YnORg4%edUB;yd3`Fv~a72rWX-69djI743xKMEwj5XXmVb>mv_BT!fWWy(m9+CM+|)& zO_)L}j}Qxb1-DHinKUDkcMw%YxQ1%%RLmRYU26@5f;LvpsnIQxVFoo-^B2-&!<4!B zF&f6Eaw99PW%Awd!rsUcD$c1(S-Bm%r#`gaASI0`tK`)k8aZZ3GPgiq`C>eMlXSc} zG21)MGapdvrCJ*>8iTZSNh|Zet4f21sa|-`hB_QNpgxe9ck2;vgTYr6$EJvaS_H<4 z`%DF!s!kBl0F+;?0S?L6b}8$0y%@NzhjOtD3Ls25yZh|85lH2TM;Q+OA2c)RK53$c zDT~8D_x9bO;xxx6jdQV?(lm~|hclnfyT{je$Rm^Ofk`awC10pY>oxHeEomg2E5QmL zI%*VqL-;U9v!QR3`ow_80SR)aSNRDA9gp*lp@ofLBaIyHy{vXoe!gIEydU$viNz0^ z4e-TAi?Q*bztKdQ_v{+`2^-+}GkTAcIKDV)tOFfanQ|?0=`Bn*-))Acvb()M4(qAp8qd^3*xb58m zLwrN#awfK6jIVJvT&q9(t5XOqF=B7|F6yThGB|Zdb>zC_bd%ms4&i?)=;$B9wX1+O zyDSUc9UB#5VtZKy7azjsH;}6g0rD8c=|Yuy1rS|b`3Z7ayc)5JmEGLT-`mr_SR3`Q zQS*|Vrb4$i2zO&0fmMI`3$XVG;!xK*?>RwwDmFAW@xDY~EaMJwA{wn#&i%ARu70EM z$uv*AY^6fKHH6N0R%mOjtZ3w^GQj$V&5Q89^BiRdm14@&IHQx=xrqf&({KskD=HmG zg#S{_p{Ew>hfMaH+%-OaPQc%`fqu(@A#qJw8a59nK3k_MeG#%7_Zpz1D3c?TKQHJb z8cWeh?wGL9jYQ7gQADX1=DKLFX{JVRl-a358cQ2#)k@?1rTUzx?xPy5L!uZUYN~su zmsJSu&`4R(CklBgn)+l6*rYLa>a>yo*rJB;pS~db)n2>EQyHdEt7A~hSdxCjb~q)2BCR}x|00!#oK*-pN=)!u9M!K=3r{B{CxS}&I z`pf6j)KB=9GPQ%ce#(tj|EFL3K`ngXMa_h~W<1RJfM@mIcmrI=OSHF5(I1%(qhE3O z`VD_tW167TG4$OT@L$E$ufE@Rf)E}7;k9vfFG`Ao0uY1?M<|L;oMO@BZEaFYqK2%X zI#n?H*(-I;%THWOy-uUdD0W(0R!ebv8}zZkvLkjJFn0 zRUE`^a_HhVt!F6kzGe9%dfd>?wUb{Kt!(1)GxD17<};r&)5z%g(ko$+}*OR$xj zD0swLPFPbqTi`vwD~v5NAvqPe&(jf&0=phWxwnYMC)}l;l`?$i3H!QyYRf$ zu2#_gfb8g5d298{&sNr)=L_HW5QpEy4{Url(f{s{9CD5R zG<5GN5vzFIjRB<}YSO95^PaMcFKut69vjA>suOMq@F|lBGG*Pi+b(aP(ksP6z#C>=>_|tmY&j8;6)t;X1xv&^j1fDb=TWVp?}e)QN!JvTDbG6$=Tj zve;+bqO!YU&CQoMx+)+&Fms`RH>9VvBQ-f3TIMcN(;+4y+(1ze@{hrKuNeO`(uiTK z3ddbYU{H$YMwzlt?mMTqO{c2#VB1$mF>jeODy2snf6}whDhv-8Uhal>DH%YO#8x@~H9Hz<@BFY^bB%l$SyFq>JYjr#dHc(ikvyUY?*l z37tHgn45H3T!1+15QGIgDyCxFlhgA@H4V~34L3vjl$#=Wk-J3nVli=lq^Gx@Bk54O z`29xCBQeDrT~zV0SOP3uvTkU65@(gEDrtQw3(-pt3k5IIdB1HOcTSaaipKSuC)@-^ z?G&7+&DlkAcDm;rs+NbLc@R9vqwE701r z#{KWMzi*cUD?avQ$j-tER|rD=R2YFVemHJQ zTk%yL!Zb|WIXZ1K{mNp2a6peeA*Az@oV<%$&kOCT$YOlvLI&e$4&&wZ@%VmC?35c( ztf*#eOr(Qd`cb*w)XH!tQ~r(yeCpB&>)OrKh0%BoW0<4N#GO*xMV#WIORM+5Plj{3 zy54g1*P{|appD8d<&?uoRF%xKr>C;=6K&-g1!b7~qXWmyk;=SBb0(oU;<1MbB~NJ^ zS*BeMDBVNe-!So-gpn7?K@FptgXNODNI?28vdT(WTdBY%cWbg+D}|$7YH4|%Z2V5k zn7sWuDf`d+l7&pd-jetTlv@lMvxJ>{>1cQR5Illwc}gSpB)VwhTUFA(1MhdpKqM=41knZv)$sP!p6#XnGJO03D0jGCCzA24NCCP?C@=YBI9 zgTDXJy4D+GYbANJ8O)Y}$exU`OnjbWfE|HGwH;_=q$>5jk zSw#hdqI^GevK$jxtxND>xRQ`&9r_l6@P&%;7CmdHpz6^(ATdWFcZbjT)FP;nfFRQI3Wo z2u-3$WK{5^!~x~~n4*Z>h49&%fJ~E9AQEV-f<|<9h}Lzs_5CNNwDMEx+rRpAAXd^l zn-fk?4Q=cHp;-~Im|1ksNgNM{%)ULD>s0CZ{`U;K5I-z-D3v zV@l_kw5F+?CQeb=Yz-0NZ7>Fm8oN4-abBd65PW9XywQGO0L>~RtXly#J!OdJBM+oR zVTDUVfQ*0ETwUlhnfo|%{+@08?E8>*ua;47dYpL5`d~$iblcDE(Kk#LjnK#DlzFfZ z<30T)6LakSj@h%O%#$3p!pLMCpTHwUcgSRqE;nM%))K-&2uOp z#TeWMBvZ*vexJN(l5TSs*Pszmz@#=N5X}7owN25C;(XcT z?V`2<*Qojfgl<-B<+0+TCjet7$U#l2)_g9Z*n?mJXZ_GzoQC(s;vCc!$Z} zxP#T}Trd#R?qP|9wIQKyZY*0pn0p4Px+A-Kr?}r;p5cm2)uZj##s?Qu$CNl3?;8-A zoQgCl3l_wB>GAWN=>8%mykpHLg4OTXkaLZVd{R>BZ>Pzy1dSX+o|*X71|)Dx3$1IJ z8ppXo%j)}wi&dWwxPSQUMsce|uRtP8AD!l@fKSe$o;UG#uW9lcXmZ65TZbtRCKgoh zK7Z;b*>jrl-Fy1I!C=J8-)3|b#qI!d)_Lt;VUPBJeEZKP}8`GlnUJ0VXsYF`>Z;B1qV{guQcjh~75B zCuW9LV5l*rtkZYQWgYHwllc8MJ#9QDMUVOJ(7mCD-^s3i{w-%WbK5Rz;;bF!YN#2; za%kYIt(XJTu$@3Xdf(SnDE&9QVqxiI$^0U*_6#!CL?icg7Ew8)=ZQGB?!qNuvTEs` z63WQqUj0RpI*aeMv0t7SNH&Ok7+Nu3g%}dHVGjHplrJ;(EyQu)BtPbCdcwrLwlD!w zNMx(hf&}4;4La$nWjc4SHp?C+Vz|>N?eV7?cbvf?r)hBKuzx0DyrPX?jC3kU@`*j$ zlePQ)Kf$fJr*8n&hn%^UPJ`gE`Y_$qgK+JD_S_rX${$P3)(u z#2m&cKV*?GV@)d>#QjlUm$b(1wXRK*6*9&sePnzGj9vAC&b)-wyNPd&WnC_wz}=zUAnD2Tj55gZ>mYGqkkg^Hko17cJ&^dlWseT0!1MMiVn4fC(wbyli$CZE zpG5Wso$3MmdG=IcE=1a7y+)or#jd9&&9b{PwDH_|#e4Q^eHt>zAxPo5p@;tkb{Y8G zBD$$Zo~#H#E!tlJrXcpHY>7C18X$(!W~|+QIJ4I)*0mez6>qTu{vJRgiov8A z!s|gGDSg+nr`t@_3J`ZlC6DyJP{UW@s44#f9G7&2t*Di4?zV{T>py62F}N`^o6s)B zr#;hYY2)QbXjG7Y@g()V1ekIV+U)~2YgYlWSmH`}ih%IfL7#tI0dGiS+&Nl5-D2YUBNMYngSeF>)6v=P?&L(y0IHAIMY_uuid^t2`cT;3c@) zy1`o2jv$e=Bgw7$5bV}>PD8hqB16J7n}c=^PJr~)|!2X7L{ zhpMUfO>|Jl~__se?c`M6BK&&{~cSdgrO&INP$PI!*C_ zd91WhI8iCIJ?U?k!bYPxQ#PNO<#P2W=BywP+gA#`zzI6u_y-&>%U_;U*603W!A+og zw%FAD>t30BZ?KbRMs?ks}KvTrQ6ijz+GT>(mu%v4jc4dcXPt$WqrlXh(I(exbeUPNRw}gK zLanp7B(5P}vnwdxzuaNiU1fKA!Ap}14DZ-!n%~so(hho20@o8*al|o;#cGw#+_&b~ zrw2^)VDms+7n#vcqm0;DU9j&E%qI`sYm+geR2XOA1FZH0#PYLC2^1-Q9j1IxjC{6O z9iuRwG2Z#>b=lQ9slXabI@{r)qtqL-^iu{r`4;uK$+@sHIs2fV=cBP($BJoH_=QkK z#IGEZ?wte<7cVYXa9m^ejp30uU-B^fji&pt;tysv5;FHDryk6VHKU zHL_|ZwwRdfk|(>mI;*(Vz37eIT$6mkHU)8wmN{@`A` z*+@>OhW}k2@c)xtT>ms|C=CgKunGF!VdEKw4{_AXS5y;=?m2QQwj`T6-;pIkr+w%m zIlVuWGwb{B7ycD;VwqEJb^PSe_%l&t> z6bE3eJk9|Q$Imr$_`_MX@^ZTaBI?(k4Nb(9gH1k&^3jxamP)qO(|OG@Z;T(EX6ugl$(ee;?0KC z%4rE2M2eP!2`FHd>*=8!2B>43Ma}w*9=`}0QMb#J;Y-&)2C$A_Q$QO->58K1P`Lw^ zyTO>Zp?Dc(@?#}++b0r~Bh9oOwO0HwfMT&-3c!lj)HhHthp9nNdWU}p)(ADNbH7EC z0X7U$2&`m9UC#wnind0Z=d5%HUTgxiP{|IRcCumPf|Ssx552a4r5nx5=PK3#Imw7Y zbp%eqnAy-^V^Yd`2`a-`f;#cUUE&X95A+rPm{({u=TFmt_Tu5kZwAjG_uq;QuWU@A zSU)fwWJIeTT)}a4Q?5Fy&H6pr1*QDk9;M7Cg zI&0AS2j%q)hpMDcr4s8cD_40)h&d8zv-iBuI#Pe^HM*E&cN4&P!lQu@Xx$>`(PTu#n5=d7PnrrE_RC?`~6Z|iNCk(9Z+ z<2VElE}_X-Rt|sa2U$4J2n=Wn!+j9J+G3xWZ6u~faDMAH*jzPQ#PomfqU&22oK=DUfPpF3b%N52Q7C3mm!8qDpIEa} ztl#_(&@M#2!Bex-UWf-V=M>2b>2@)-KP1A@-bv!P?92994?dOZ(;td|Xx_}(oLX{p z@z7Ni@$N*-I#Q(FXmYK1{|z1}yP{grTp=Gk!Sg zFv@MJp-JmhZ=aU_UC!YLaLo_nTXdSfqFMqy7)1$zj6= zv42xw(~xnGY*Ip;5PW)(GkXZ8bXG9vdS)mp{_!g{5KXh}8M3aAwL>QGh#jIk9X#SO z3;t+v^hbX47g*&gP}a5g&>9E*=({PlyH9e6?Jd9UKZ+TwH0loz;B*n>WSqs^2ajIQ zMgmP)%&mj=o=)@MhH0((n76Fn>iPb@<1!m}i5)U$Y>eoUwwN#`a)xTvakSRuvgclJAsgb}kH9BrPb>5c>$vZv-3Dd!POYrF#(07wj zRn23irF!oN=M)_6GsG)=Bj>4&|KK@te`3G))vs z^q|Sg?e>*iMK5SG6v_>nEsCY6+1!4i#RA`DGs1r*0J3;5Qw2SxaONYk(vgp5*)RNq zahlPekDMi`IQ2%Y$Ps${2m5psHRsDc?X&(4Oz%aLNqnsaAQey^e==ro2LI8t|5I%E zh;=Q5Vn>qP3kp;Ih+C2VMfKI27u9w_eqKtI^mJcMiOMLTZUkm<&?EY9gUQS$V$b(Y znpU%A>iMhH9JhHk3*;c0`P@Y!1OZLz5f1(6bk@~vOYQOKlw+A%8~e*zv6Irl?E@wJ z$#n10LzKntGqbkN%od-esC_?6kw2X$Tw}8!dWrqAuIbqrjU+3Z$0S^{S;{P)Ur|Aa zIJ4GAsq{ zZlnvl&CG^lRZW`MK|Qb@>2xi{Y1&NyXAMk@ZLnX~5^6H+wf!yvrFMpKbT8a$2?) zDalwR`HJPT0T9~bU;ETPtSx`?Vkn1jl9C#qBMEt(s7U~hT~|!Xw?BYz_yorv`pm;NrL0M_t3~l! zx-z-&wPXM*x5dL|K^d?;Al$Ova*SuOJ_DFAtwUD~h4#bmVrDhx7!S4lfEm&#)Eqe| z)H*-JtXi=2Cmf1Jv>i1mvzfwWJ!SjEQ=h`&{veeaQK1c1i%vV#AWi2?n+z7%2sw-Q(+H&7^){lRX%dNL!RzaH|1f^cSAX@3r! zOa6mJwOls+Bq`#tX#=jLCK6%N#KeTPY zQyn`#*Tl6V2XC^?CJWA{CK6OX;F6ZUdhTVmawB}LSN2*Gk**|`q7W$i*^dX5H4Am{`o&<+G|&c1X~f=-}{42IgCSBv=r8BpN(}GH3tM=G#~R%MlF{| zOjwL3m@^_BM>yz`--Xf_`W4)~(m(A}g4}yHNS+6o^DCRO6udw9sJ1Dkk1fU$Kn(bc zDa-!rO3VUUra3XPYfwM_T8K=!_=x+EXAp?+iUyf>->cv?mln#ZG|}-6P+-a9BKANcb~Tmj(iQ)n_T{z zV#U8OJ^!yu{J)v`P4Nx%TKy-MB4;|t@pGZ3=>pXs3$fs3Pj2%3+5h}4INvs(vj}vX zjXFC=iHQ8%)ihc?`+u%Hy0r6{k$cNs}5C@1PRaf(BRyZl9@- z*3;3{aWkT1e+_ES;2sMJWhz=#gM2rqG*b}O9psfT7Eir>_X)|WgATfETAiCT2TX0H zph2i6S%O(OyTjX6Kzkp6gEP0sx=8#@7xyVG!2KrgLQTrSqGb4;>+ayad7Y4Kg}~G( zKVn^5?4fa-y7Mcvum-(!Xi)2XlrwAR2GC*ZKB%SS&a~?KXgs!o6LiF}v$LX~h^rFA z;*dwwuy3_C>yMZ^fDdu-J^<=;aOK2ajZcWAI++?Lv#EV)YV97b6VBJKnD_}y3DEHK z$1NJuA)S$qnd?Bl_!)rl|5xwyo8A1UT!Q*f+vne~z<&x01d+52oeOo(H0x%r_kGUs z!BfE|C!K5+l>+4{zge_mYfj zWKlLVcM~@=M)SOG@X7iY##qxGQs6HzS+wWpc>T{l_~h`?#wUZ|retu$*&pT;*r(LD z#Z2T!gk-vf4*Ut)>r?0Z@UdNA$4RQ%C843Q?^)NjSYtTx>f7-+{LF+E!-M|B7WG$D zIM-*kN8!bE)6Lr+cO3QU`jlYMx0T7r+;dc+p>2Zb7t~4)R^iC=-biKS4670d6&xJu-qAn|ztMikbXu`k2q{&o%9GW~RrzOgwvY zhhJ#?DeKzZ8WGh_*zPK3i4fAvmDh*B!4(y8zkMsX4cqOBWw5kQS_He5PSeBYYt6!+ z>?B%^LBdH=+qJ1RUv)Zw8@*%4Gr!3pTY$^Q%LxysFA%t#5f4sLr4hEsj2dSr#NC?> zjj+H~)GrvpK_nM3D=|z3&YK&hGuIh+9n|!5Fr1V9Ck4;R8oZ`8AI^R5yjf=%oG;`U zMU4b-6HwRkQvJXwWaNd9#8atD^Up++_;pI@U&$>2F&rj69_~W{BPO>3HXUlb&DhXAJK2~nw5mqis|p*Kg8TuSgs%t($7c_ z?GT6mmZJS@yB~otsSy2-_}J&>E&{>#_}ZUWY(3!gp0tMaL?MO!V0)T>{;zTnpvobT)z)_Ccez2~K{dYfl)o8pdGU9WI$Ov~$A%Ij)! z{@Uj`Qh2!gfbs1}ojXm%%GUz-7DNs^+E!ny(q8{AW2c>ArOng#fxXeaIfmW0|Ezd$ z+VMljk=v=V{UaM|YyzX0YEN?SQ@bO+mMI$8*L7<|Fr)qbSSBk|CNLMgdO{04nv;@K zmDF{UYPl}?L`rhqkq5a~O$N=gU)QwVuKuN7)x(kXA#yl(rhVPY?x8}Ovg5Xf+(wnI z=Ex_xbGsdL)=TEHDpk7OE-Vb#zWsumyMxp7jPP!q?uh~0)3uUw9@K}B9JB7^^gB)I zdasq7+h$hf7#|qj6*k=HxvXbdfIqY2X^w_T&ynRuPLzhhCgm2S)_7omkEcUC!KhH-2KGzZNCG)_ZqDLZW}js=(02oJ6hL6#w65rXe~p%e)fq&0lS>!F3tjUvRqR?U2k&Bgxkp*K<-l z3%x0J4Sl_bn;CQ57VIpUpz24oD@u_!J`|_G6z7V0IB`tbQ}h&9xE5_#RXJ^i>(Av} zH-=Vm$|M^6plq7%mMMDG4^uQ~68c;vQdi6lqULhfqLc71bkV=S|6q05R)1g0Y;Lo! zA7M?|R`lztZDga|#wT;!PR8DvVE?7JdNNJy)D%7VOY~bCeX10DihdhO=a+f{O(I*D zd^+~lF%|3zkND;tru)4yT)`$9Nl!=L5C2H4{18PA{)N&h3TgDhR#(PKvnEp&^sTeQ z^ID}Ur)|<>1<|D)eI{{_T|5!1yYu?&J?Q&YvCFvPyPk0RvaT|1O3&{r%8$oO8l&Ie zF~mP_g{uyCC9Axx^hb^ZTdMXot8pbd7wj%8w{@@$46K!W*ORU2CH(6Y{e~+HPuHZW zcP-!d8cs!DeOdR48?A@Xjy?oF(!PeGN+ap77CEgR!kWr$B$^U)%0AFBT9S2EO@+?6%)WZ@O4O24TVgXegk9vQ1C>tThP4t_-Z zuiE;YUCeD0w_;b9^eT}APnA(WTlmyOKA5#PPV>0RdRF5Lx`ObQcV3@JRDP6V$#tut z1o17+RnL00sl(=p2?T)+N!1>ao386Bg`e!0Bhg=tpR7dNT6n*Apt54QKbv)!iah+e`=hI|v?vept;mt^3y7CMNhd2bE66OR_3^4QGQ@2+fyj zXuTRg#Z%?IZA6{@c}wvRId*X!yLut^46gY05R`KoR})!B_!smS8-%AjYC&y8_)cW9 za4koO(~(_XcTM^t^00O$>EB%HOCeZYZYwS)BNu^ZycOIFJ6a{yX3l$o8-o3AF|eKp zh9G>fLLYSG#7tlv;7k{o`Miy4>Z6CgA~L^Gl?496x5S;-Pn2jAjSrSMun*JXF9)3) z$6=)^w}oNmA4Kyc!=GXvC;U4UdXyh|A8aeFPGg!9Rp)p}7|GFo>nJA*y&Rq{ibP`~ z1b(;RFX$HG8w~zyfBnv6gx(CMx{6#=VmjX?{#8dgnR8m!00qZ`CCB0(mXi}&f~AQ@ z@tU5FK6}{^Q-mj1g${d#s}y@XM>Y04r^O=Ib?>CP5N}Y}K~@(t-MFR~{N=y%Sf-S~ zTW;^+$kXTSDHC^?z?6#94D_17f13Xv9Q9y{2N^r)DF%lydv7C9?F5gL0=G3A=P|;l3s?^lhjeL z!F_g)+wB|(=X3TfBpOH7LwrK{W}6&yA0A;3mdMjHSq6(y>|cr}HxzkSwP1dDY66&v zBFYvhT*a41ZNkmm)h}-}Lx6D$GeG74hM)Q+y~4jnBt|OH6>bJW48V^S**AD9oUVB4 zROT{)@2x7U-C7)Dmkp)G3+@njscp^#B*7vc^+XsNwd9wmZCs?L$y za~k6aklVkHSflx2ik_ii4W0s42%ehIzN7)J^!(0FnSe(!JjKpgVy#*k%NAlKfrViK z7sp$;OCY}%iE`MJ=i@OHsgw`JD;pCjYBiJz0_T{Zs=z8n838vXl$dZwMd29$hX?nF zv2{f%^D`f-l(;3GJiz*Ws^}>#U{EsQMq+4r*AS+|umO(FFcY0eaQF3eNt%m5BZ4C7 zd*d~w@T@cz0NsuRB!xTUsXt8DqK}ZOJ%Nr0Svvn?yoQ7QNN~OQy+xLklO6sHR+|Ez zyg-#H28q}Yh1{zsdG0JJX$!_urpQ6X(zPdHFyuK7@U9XZe&Rn_blAs&UR-V~8qI~z z*;%^Q6UTx$%ysZYDT|Vm1A7%f9s^Cl0T|TUd0qalHYxD=;a&z7e2Yx?ZuD!;CL}B` zM|X%K1wvt}bM~CPslr)EyT+A#sl8QZZ(@xSD)VtekW;^zhj zX3AcQE+4+5x;I8*6vzRZazr>%KZcM{oWc;n75t|%+s*5B+gb<(czFQGif+57y(EU= z=jdZe_|9^5`6j1!7XKi%cu4SIYVkh^9`avM48+0z5B>_tY#pAru*v`c;dHj;OVhRJ ztLsd+%W@{Sm;Q%b3OSdP^sWYl!l#^!189{ITVaWM>y84Lz!Mni-*(U=jZ46t*wI>M^P?c8;~$rzNz z;jv|v>3pbjy)OINHJlsn`<9!@{7`$|ai5D_K;3U;~ z_9Q`=?jdQqcn$^o5j1IoXFTn8D}QK6atxqZ8{t=}d+6f2%Sz~^R<#&Pu%$RTGs<;% zmCrlRNw#G))nyhpi`Fkf-^vVHGSNtxM#?rsK|nwp=vObJS(Xb?Bm0AFe2vbdHUQ!9 z`6^|xQ0<|B&5!1rfnBKSJ~$^gvIbAHd@f<$KZgVwrA+UFv}1T!cPn$bE`J%SRwDI8 z+uG*pZn-lv$||1j_{@jhDE_ijg18Pf6f)blVf(f``CMK ziY?mrXIFl?9A=t;z6@wTC1_swGdQHmjOpHO&Z@^P;FyYD>@Bf9x{$8{egC5*=@SbprA5I<2eE(9#Bh6U9IBLL z+~7`-i$jqB8CHoI-1GJa+68m{OL;r%gZUX7Awn_g`bm&kjIEP`3bX3&ujz|hH1hJr z(pW(@Zcdw%0e$E-2ad}8IpBm z5>}K)Ql_w;n(u$*H#X5+!h>C;WH{gbgUP1m`}~3Q;JfWI^;T!3Ar|6J&nE|u0LmBbFxjO>qi#Q01&T8*(GUE+YBFF zACUc(R(cbe@^jWHB2B_z5ml8Hdfjx<(b7ZpwF2TQlHGdAzePFFI_>M1qnSOt_s=ry zh8vtuQ=f$!nDCxn>iD57g151~vuUPO0)FIzU?FxYYm&p3o?S(S^R7W*zfF$ys6X!H z-v*mxaj=>u&(D|4xk8-BurCB|aB~_nH0eQL^gy$d&FNyTf)P!ns7+mUX>Mu81IGq3 ze_7UZT`iQ&uX_KEKakA#JI*M_2~IcRaoQkIyS?_?a7AN^k^uNY9IPT&_~#W9m3zFI z6@#yiF55P3dCBk7+x)sM_KY~}PV|2^V+Ti`k;xJuZ~+}Pz)0?;OQDG3w%CT%cV z=scBN$i5GcAA>PCX9F4O`)Wpwpu_8$Ct)auLF^~=65tOIMz$|#d;rI|fc6qGm2xzt ztcQ&U_FO1Nl@h-$3ge1-8Kg3YDEmG|25+Ck3#a@%FnDyR=ho-$!oACZ5)%nLPql{W zMmPr%`*6d&<&h7)=h78o(|_H$}fPLaXDQ~l+K0}@Y2v)Uf)m#-1dnJx)TK6Z%5Y46QNFuNZQZm z=g>3D?NT#`fYfaIF6`hENyfiUhNOMHY8`8#DNSkz{tMhwNbzuJ?WLPhBtU3r$z@%l zJtAGNzX!i|U*S3jF=JJvio;NMGJ;-6IgDIf(!5wIkyoZ%b}8C`?10xO!i)<+{dKIS zxR*C7j3sF6QOd{Tuty3(bEBF&R|fe0>1?ym2j&6<1ZRQ6qkY`=yibwKLW&jCjf^*} z8_LXB49>YW4`LsVhGyXr3$8O(mtSoo5(s#Iz)s?T=nv!N8^RTU0}bd3cdH&Wa@b}A zv5Xy?C+5l7NhNgro8U4Kw6Bz|M(>=_lbgYO_Tfq6zWpJ6-v+ctPE%8w(!=Y|g*-i; zSXY0h`-A>MP6<|7p!n`VgyQ`*S%+u!!!J8FKe716w(!ZsIm(RQj&f;;0-q4aNL!E6 z#st+Tn+6lF_V0F|k!Lh0x5n;!ZzFC0VcvsoG_B^_+^%gsYwlx6YT^xH?_$ zObWovBxgSiWFezkN7tYwiwnYE799#EJ?>^TjnS@y5S2Wa==$JiqP^K)KKA6kYk#1s zU9HQsZUGL}Xh0NT?9e63Or$Gy;;dHg>FvCe_H|Z3-ee1CH6^XSM zbrmE9CxD0;aC__o_QMGvQjuQ}O}XEA1=$qQ!L|E-uLAw#Pidz4`F(Ic=maX)2`n5h zu23Vvja_W8a6HG=aM8lyoD@g(l17i%%$64vtIpdH)L0EwtT6s}DX4?THv?&5e=BUFr4L*7OCKE4%%AJ8HQrC%ESL zp>i^Akds*R_>_-cG~0WMfWja#b!av5i{5)laDEu;u%s*!&C_-}3VhAMPc4*O=(pnu zuAKL#n=TSCM4)gveH4uA0oV`&dhTOywFIrjb}B8kBV`uQ0i(2<2ru2&UTVk)>EHxN zZ%q_aYN=H_(|z}*4Yx0U&CIgw&^Ko?Qk-{1IJ|!HEYxeiAS$e5w@E@4GZ5oQy0Je! zqsR$ccR|SdfyD(#oc;qkH+o3VkYObL(H+)a%)2&(z^6CN(m!$IfXt>#pU?hls?0V68 z@~JyJOA2iAXS`M9<%RO&ZynxW7`eNsX@?gWz=s9AIZjq$PK0WGegBtTEqFyq(yt~! z4HpVQ%2*RfqVJo4Scgo6l{RHJ+`nQD_VO^?Gd!<&!8~HIaX{lIf2Hh+qed)MI}zvc zP_+ywL>xjoJg0JcN6qvxT~ri@uQ1e_O_yG&p`dyUdP$w-J+cqvG%ru93Ge=D7)e1F z8cl${s~X~jFl4^xaDdNkf)1iHQX?s9Y|FRpTzUG~=CdJAVw~)SP?kU_*JoOUv_AJ& zN{JPl+ETmpagE!Bn6ME`_H|#%x1bC%=d2k-SYe;l5?s0GS(F|Z;f;ykA$=fiIYIlT zvGc;H7gjxur|)!7t0V9|VH$A%0vMoVx!(fzih10V7K9TY!)5x*rp zz~TN3E$X#oUX!hjz5%Rl?Gv@6f4v2lybe`3I6xBw6*n(}ku(A|B!?TBb|=87NAI3b%qrYng}R0kdK$Pk1Q^|z33$(r%$kROg|&2FLe=r2 zy;OyEmTlRLIt4F z6&w#-_(EjP72Ll(OO~MNqV~DBn%H$+g*McaEjNbN7SXu8couaEFPhsX?P7X2{@QTg z*D-sb%OvwBCdVNyde}U+F~ufjv3GudYG;MEnu$%b;VnF{qa%r>d+&uVVmY0%aOPi= zCOjyHJ&~0a2$_BbaDp~dvW}+Z8V-J|Z;T7;u=IJ~*Y>GfP1)gBvv2vynFeY#_MFWO zJ>WMm+UP0)VX4~LV2HL6Nnc3)PZou~W-p$f*w3EQ({8{v2*x!HIQ^Gi&G7U{TG-5I z@Zou{zz;0vZk|u~=}v|2uxGP94oNL8xgTYx^VGI;=2xjkVdz5W>bW4J%yW?@*L;B@ zjCxUyWoP=ymt6RJk%g8PN%<3P?RRn-?AIK(*Y zP4exy;Jjb0x~U#RUQh+{F(~9)pqpOB5CCxYkorrH%E&}j4m5>78QQ*GaU3YTmejSp z-OTXN>#2mAv_lDW%NE1eJ-eo2wh2xo^$HzTb(!fq@vaB1k{NbpgEr(MR{sf2b-f7N zfQr;<-)Uwd1+oc|b`utFR4Pw2utF#Ut%md1VJ#`jyR`be^hUw)9JdW@1a2xPewa^A zeGVlICu1hfDF0dLCcD;YlaKj!4XKA}e;uJT&iM$+vGYt!THb4wEBo7o7bo&k7ODJLl7$N79`~(@nXXsG zzH3{Lwo*}jxQ=ePjTVeb?tGV;;XUP+N#Ep(3IWP9o#`+b~dy@b>D8b z?~dQVWJq;G1>f{Aexck`QyLPcNUugMB`Cw2J2S5>PwC$LV(spp3k4!3@$SYO8 zyl2mysjPW%n#%P0+^WzWi?j+tOH}R;Jv>+G-Xvkt(P$z|jb^L7O2An%pt(?kc^U`d zgHg$s8RqS3ohJ%IGJPCADn-7YO1==-@~~kCKcPc@TAo7SaGZcI6?6p`%J9qaY=VO_ z^Fd}!gLnR2JO9SQHJLq^1`a-Sef8Ah*#+yAp`NYL5u5y5Y_Xmq!a<<N{XP7C##lYy)~v8D;dEi=p_e*fuT~2s>GU?-}t%0A^hsVqpn*$+|s}T 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%0ATf)rV7J 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 D#t6qf literal 0 HcmV?d00001 diff --git a/browser-extension/firefox/assets/store/store-icon-128.png b/browser-extension/firefox/assets/store/store-icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..8658432dfab6bebdaeaef4235d12981e9e4caeff GIT binary patch literal 1659 zcmZ8hc~BE}6a57tM2-~XiX3t%Rv@F*FC672hSM4#C4{IPwtfV#5GuFQhNDElhD%VC zf+3QETEbysEC~{d7HbqRs34{MRZ&nR8Ws$*Z91eut#-gQZAI|H=WsJWke$(Y$SEuFA2P`l$#>%p z>7VvKbd?PZ4CursZ8ra3qsP5sj(K$SP8L|4zCo*0?p$@@9PoLxnru%hsJn@s6{p&5 zWVtRDCA(Lya4mAU>gt@Bx`2a(zHg;Z8ByE(hwih>xa(FV^sJU-VvkF zOLJdA9QM6DX%+(;K|E{jbLg_4|BQZ1D$@ zb;+~UMv+u+M`Vg=@e2DX_01V+X6{Tn!sUcRZ5M8UWZWLwa0T>= z+1&t-a-Z;|tIgcLeui5vwfaMuOhT8vtwBt1erwoD6A0W*j?Z^Hl_K3zi69(_tyGvPC z8~mKZs$Am3clwI;Z5U9BgR9zsUT$P3%r`uSBG0DpQxsm2DHv(k@425(%XT9*!iryh zC8@HUj`L7>XbSW+Z77By@eX-QZ0SB}nYQA=yzs6}N$G4m1;|^NGtlu%v%=N2c0bkE z!~q~2{7Cq^5CjQz1#{zBk`MQERn7}v#U9(f?6Liy?omC!;I@`Ax)O4q;HhP-p;6HT z^R=}DMPXL}|CUMadSUNihsjU%N3_7c!o}uDh|Pk#TWpe9o_R5d+N%-wD=cru4qQ0* zk3fmJ`BTT00c1-<;GjXb)%a|?L7t{T-kSg4b2|*rYjtr2Zb-CH0*#Y5h=?sAW;$)r zj0_#$T=Z-Oyw7jW(?5oXIcWmi_of7$ouH?;L)H2JYYUd13|+dCSp)C;a!S5sm0R6q zegV!=^ zCyqJOC|kC;|I(h6wvkDixqW>8gn8`xi6Ne#|HPzQ_9_R+$!OTzh@a=E6Jo}S0(qZT*gjs z+*cpo^sujlIF51Ddu^H!_@fzXKC{95z)NZ9fu-^RO;?fvQC&6{zIe5XnBQPJYZ^|v zW__tyX)F3hcrsQ$QqnB1)ru>{cPm4Sxzxn`-z?y19XO|rT|W)=^jg5>Lr0|?7IMnl zMBwMdeKXQa<6DgxCZu?N#6MqrgdPip-Xgv>>4C66OShAm$Sl9uzf_*oF+N=6QaYId zX)r)7Wje06xWb?8|8z0yDfVF32=7q0oF7ly)nI71;n*!==R_83dqo{fcxTe4_1;DV u#qmp~TV0}+uB_W__|tXT|NX>(9=!I+N`Fw10YbXCnGE*FVp!<7g1-P0ss>~L literal 0 HcmV?d00001 diff --git a/browser-extension/firefox/manifest.json b/browser-extension/firefox/manifest.json new file mode 100644 index 0000000..32369f8 --- /dev/null +++ b/browser-extension/firefox/manifest.json @@ -0,0 +1,36 @@ +{ + "manifest_version": 3, + "name": "API Response Comparator", + "description": "Compare JSON API responses across Dev, QA, and Prod from a browser popup.", + "version": "0.1.0", + "browser_specific_settings": { + "gecko": { + "id": "api-response-comparator@example.com", + "strict_min_version": "140.0", + "data_collection_permissions": { + "required": ["none"] + } + }, + "gecko_android": { + "strict_min_version": "142.0" + } + }, + "icons": { + "16": "assets/icons/icon-16.png", + "32": "assets/icons/icon-32.png", + "48": "assets/icons/icon-48.png", + "128": "assets/icons/icon-128.png" + }, + "action": { + "default_title": "API Response Comparator", + "default_popup": "popup.html", + "default_icon": { + "16": "assets/icons/icon-16.png", + "32": "assets/icons/icon-32.png", + "48": "assets/icons/icon-48.png", + "128": "assets/icons/icon-128.png" + } + }, + "permissions": ["storage", "clipboardWrite"], + "host_permissions": ["https://*/*"] +} diff --git a/browser-extension/firefox/popup.css b/browser-extension/firefox/popup.css new file mode 100644 index 0000000..b2326ad --- /dev/null +++ b/browser-extension/firefox/popup.css @@ -0,0 +1,496 @@ +:root { + color-scheme: light; + --bg: #f7f8fb; + --panel: #ffffff; + --panel-soft: #eef2f7; + --text: #111827; + --muted: #64748b; + --line: #d8dee8; + --brand: #0f766e; + --brand-strong: #115e59; + --danger: #b91c1c; + --added: #047857; + --removed: #b91c1c; + --changed: #b45309; + --type: #7c3aed; + --shadow: 0 1px 2px rgb(15 23 42 / 8%); +} + +body.theme-dark { + color-scheme: dark; + --bg: #111318; + --panel: #1a1d24; + --panel-soft: #242936; + --text: #f8fafc; + --muted: #9aa4b2; + --line: #303746; + --brand: #2dd4bf; + --brand-strong: #5eead4; + --danger: #f87171; +} + +* { + box-sizing: border-box; +} + +body { + width: min(820px, 100vw); + min-height: 600px; + margin: 0; + background: var(--bg); + color: var(--text); + font: 13px/1.45 system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +button, +input, +textarea { + font: inherit; +} + +button { + border: 1px solid transparent; + border-radius: 7px; + background: var(--brand); + color: #ffffff; + cursor: pointer; + font-weight: 700; + min-height: 34px; + padding: 7px 12px; +} + +button:hover { + background: var(--brand-strong); +} + +button:disabled { + cursor: not-allowed; + opacity: 0.65; +} + +.shell { + padding: 14px; +} + +.header, +.header-actions, +.actions, +.tools, +.summary, +.result-toolbar, +.mini-actions, +.env-head { + display: flex; + gap: 8px; +} + +.header { + align-items: start; + justify-content: space-between; + margin-bottom: 12px; +} + +.header-actions { + flex-shrink: 0; +} + +h1 { + font-size: 18px; + letter-spacing: 0; + line-height: 1.2; + margin: 0; +} + +h2 { + font-size: 13px; + letter-spacing: 0; + margin: 0; +} + +p { + color: var(--muted); + margin: 4px 0 0; +} + +.icon-button, +.mini-button, +.file-button, +.secondary, +.mode-button, +.count, +.view-button { + background: var(--panel); + border-color: var(--line); + color: var(--text); +} + +.icon-button:hover, +.mini-button:hover, +.file-button:hover, +.secondary:hover, +.mode-button:hover, +.count:hover, +.view-button:hover, +.mode-button.active, +.count.active, +.view-button.active { + background: var(--panel-soft); +} + +.icon-button, +.mini-button, +.file-button { + align-items: center; + display: inline-flex; + justify-content: center; + min-width: 34px; + padding: 0; +} + +.mini-button, +.file-button { + min-height: 26px; + min-width: 26px; +} + +.file-button { + border: 1px solid var(--line); + border-radius: 7px; + cursor: pointer; + font-weight: 800; +} + +.mode-bar { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 8px; + margin-bottom: 10px; +} + +.mode-panel, +.table-wrap, +.tree-panel, +.suggestions { + background: var(--panel); + border: 1px solid var(--line); + border-radius: 8px; + box-shadow: var(--shadow); +} + +.mode-panel { + padding: 10px; +} + +.hidden, +.file-input { + display: none !important; +} + +.env-grid { + display: grid; + gap: 10px; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.env-card, +.field { + display: grid; + gap: 5px; +} + +.env-head { + align-items: center; + justify-content: space-between; +} + +.env-head label, +.field span { + color: var(--muted); + font-weight: 700; +} + +textarea, +input { + background: var(--bg); + border: 1px solid var(--line); + border-radius: 7px; + color: var(--text); + min-width: 0; + outline: none; + padding: 8px; +} + +textarea:focus, +input:focus { + border-color: var(--brand); + box-shadow: 0 0 0 2px color-mix(in srgb, var(--brand), transparent 78%); +} + +textarea { + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + height: 132px; + resize: vertical; +} + +.actions { + justify-content: end; + margin-top: 10px; +} + +.tools { + align-items: end; + margin: 12px 0 8px; +} + +.compact { + flex: 1; +} + +.tall { + min-height: 36px; +} + +.status { + color: var(--danger); + min-height: 20px; +} + +.suggestions { + display: grid; + gap: 6px; + margin: 8px 0; + max-height: 92px; + overflow: auto; + padding: 8px; +} + +.suggestion { + align-items: center; + display: grid; + gap: 8px; + grid-template-columns: minmax(0, 1fr) auto auto; +} + +.suggestion strong, +.tree-key, +.mono { + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; +} + +.suggestion small { + color: var(--muted); +} + +.summary { + flex-wrap: wrap; + margin: 6px 0 10px; +} + +.count { + align-items: center; + display: inline-flex; + gap: 6px; +} + +.result-toolbar { + align-items: center; + justify-content: end; + margin-bottom: 8px; +} + +.contract-alert { + color: var(--danger); + font-weight: 800; + margin-right: auto; +} + +.view-tabs { + display: inline-flex; + gap: 4px; + margin-right: auto; +} + +.contract-alert:not(.hidden) + .view-tabs { + margin-left: 8px; + margin-right: 0; +} + +.table-wrap { + max-height: 260px; + overflow: auto; +} + +table { + border-collapse: collapse; + min-width: 100%; +} + +th, +td { + border-bottom: 1px solid var(--line); + max-width: 210px; + padding: 8px; + text-align: left; + vertical-align: top; +} + +th { + background: var(--panel-soft); + position: sticky; + top: 0; + z-index: 1; +} + +td { + overflow-wrap: anywhere; +} + +.empty { + color: var(--muted); + text-align: center; +} + +.badge { + border-radius: 999px; + color: #ffffff; + display: inline-block; + font-size: 11px; + font-weight: 800; + padding: 3px 7px; +} + +.ADDED, +.tree-node.ADDED > .tree-line { + background: color-mix(in srgb, var(--added), transparent 84%); +} + +.REMOVED, +.tree-node.REMOVED > .tree-line { + background: color-mix(in srgb, var(--removed), transparent 84%); +} + +.CHANGED, +.tree-node.CHANGED > .tree-line { + background: color-mix(in srgb, var(--changed), transparent 84%); +} + +.TYPE_CHANGE, +.tree-node.TYPE_CHANGE > .tree-line { + background: color-mix(in srgb, var(--type), transparent 84%); +} + +.badge.ADDED { + background: var(--added); +} + +.badge.REMOVED { + background: var(--removed); +} + +.badge.CHANGED { + background: var(--changed); +} + +.badge.TYPE_CHANGE { + background: var(--type); +} + +.tree-grid { + display: grid; + gap: 10px; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.tree-panel { + min-height: 220px; + overflow: hidden; +} + +.tree-panel h2 { + background: var(--panel-soft); + border-bottom: 1px solid var(--line); + padding: 8px; +} + +.tree-body { + max-height: 240px; + overflow: auto; + padding: 8px; +} + +.tree-node { + margin-left: 12px; +} + +.tree-node.root { + margin-left: 0; +} + +.tree-line { + border-radius: 6px; + display: flex; + gap: 6px; + min-height: 24px; + padding: 3px 5px; +} + +.tree-value { + color: var(--muted); + overflow-wrap: anywhere; +} + +@media (max-width: 700px) { + body { + min-height: 100vh; + } + + .shell { + padding: 10px; + } + + .header { + align-items: center; + } + + .header p { + display: none; + } + + .mode-bar, + .env-grid, + .tree-grid { + grid-template-columns: 1fr; + } + + .tools, + .result-toolbar { + align-items: stretch; + flex-wrap: wrap; + } + + .view-tabs { + order: -1; + width: 100%; + } + + .view-tabs .view-button, + .tools .field, + .tools button { + flex: 1; + } + + textarea { + height: 108px; + } + + .table-wrap, + .tree-body { + max-height: 360px; + } + + th, + td { + max-width: 160px; + padding: 7px; + } +} diff --git a/browser-extension/firefox/popup.html b/browser-extension/firefox/popup.html new file mode 100644 index 0000000..826b757 --- /dev/null +++ b/browser-extension/firefox/popup.html @@ -0,0 +1,180 @@ + + + + + + API Response Comparator + + + +
+
+
+

API Response Comparator

+

Compare Dev, QA, and Prod responses from JSON, URL, or cURL.

+
+
+ + +
+
+ +
+ + + +
+ +
+
+
+
+ +
+ + +
+
+ + +
+
+
+ +
+ + +
+
+ + +
+
+
+ +
+ + +
+
+ + +
+
+
+ + +
+
+ + + + + +
+ + + +
+ + +
+ +
+ + + + + +
+ +
+ +
+ + +
+ + + +
+ +
+ + + + + + + + + + + + + + + +
PathTypeDevQAProd
No comparison yet.
+
+ + +
+ + + diff --git a/browser-extension/firefox/popup.js b/browser-extension/firefox/popup.js new file mode 100644 index 0000000..2ac5efe --- /dev/null +++ b/browser-extension/firefox/popup.js @@ -0,0 +1,1039 @@ +const ENVIRONMENTS = [ + { id: 'dev', label: 'Dev', valueKey: 'devValue' }, + { id: 'qa', label: 'QA', valueKey: 'qaValue' }, + { id: 'prod', label: 'Prod', valueKey: 'prodValue' }, +]; +const DATA_FLAGS = new Set(['-d', '--data', '--data-raw', '--data-binary', '--data-ascii']); +const SUGGESTION_THRESHOLD = 60; +const MAX_REQUEST_BODY_SIZE = 1024 * 1024; +const STRONG_VOLATILE_NAME_PATTERNS = [ + /timestamp/i, + /time/i, + /date/i, + /createdAt/i, + /updatedAt/i, + /requestId/i, + /traceId/i, + /correlationId/i, + /sessionId/i, + /token/i, + /uuid/i, + /guid/i, + /nonce/i, + /etag/i, + /version/i, +]; +const TEMPORAL_NAME_PATTERN = /(?:lastLogin|lastSeen|lastModified|expires|expiry|generated|modified)/i; +const WEAK_IDENTIFIER_NAME_PATTERN = /(?:tracking|transaction|operation|event|message)Id$/i; +const NOISY_PATH_SEGMENTS = new Set(['headers', 'metadata', 'audit', 'debug', 'links']); +const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; +const ISO_DATETIME_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/; +const EPOCH_PATTERN = /^\d{10,13}$/; +const PREFIXED_IDENTIFIER_PATTERN = /^[A-Z][A-Z0-9]{0,9}-[A-Z0-9]{6,}$/i; +const TOKEN_PATTERN = /^[A-Za-z0-9-_]{20,}$/; +const BLOCKED_REQUEST_HEADERS = new Set([ + 'connection', + 'content-length', + 'host', + 'origin', + 'proxy-authorization', + 'proxy-connection', + 'referer', + 'transfer-encoding', + 'upgrade', +]); + +const state = { + mode: 'json', + view: 'table', + theme: 'light', + diffs: [], + filter: 'ALL', + suggestions: [], + compared: { dev: undefined, qa: undefined, prod: undefined }, + active: { dev: false, qa: false, prod: false }, + urlController: undefined, + curlController: undefined, +}; +const extensionApi = globalThis.browser ?? globalThis.chrome; + +const draftIds = [ + 'devJson', + 'qaJson', + 'prodJson', + 'devUrl', + 'qaUrl', + 'prodUrl', + 'devCurl', + 'qaCurl', + 'prodCurl', + 'ignoreFields', + 'pathSearch', +]; + +const elementIds = [ + ...draftIds, + 'jsonMode', + 'urlMode', + 'curlMode', + 'status', + 'suggestions', + 'diffTable', + 'contractAlert', + 'tableView', + 'treeView', + 'devTree', + 'qaTree', + 'prodTree', + 'countAll', + 'countAdded', + 'countRemoved', + 'countChanged', + 'countType', + 'compareJsonButton', + 'formatButton', + 'fetchButton', + 'curlButton', + 'suggestButton', + 'copyButton', + 'downloadButton', + 'excelButton', + 'resetButton', + 'themeButton', +]; + +const elements = Object.fromEntries(elementIds.map((id) => [id, document.getElementById(id)])); + +document.addEventListener('DOMContentLoaded', async () => { + await restoreDraft(); + bindEvents(); + render(); +}); + +function bindEvents() { + document.querySelectorAll('.mode-button').forEach((button) => { + button.addEventListener('click', () => setMode(button.dataset.mode)); + }); + + document.querySelectorAll('.view-button').forEach((button) => { + button.addEventListener('click', () => { + state.view = button.dataset.view; + persistDraft(); + render(); + }); + }); + + document.querySelectorAll('.count').forEach((button) => { + button.addEventListener('click', () => { + state.filter = button.dataset.filter; + render(); + }); + }); + + document.querySelectorAll('[data-clear]').forEach((button) => { + button.addEventListener('click', () => { + elements[button.dataset.clear].value = ''; + persistDraft(); + clearSourceDerivedState(); + }); + }); + + document.querySelectorAll('.file-input').forEach((input) => { + input.addEventListener('change', handleFileUpload); + }); + + draftIds.forEach((id) => { + elements[id].addEventListener('input', () => { + persistDraft(); + if (id === 'pathSearch') { + render(); + } else { + clearSourceDerivedState(); + } + }); + }); + + elements.compareJsonButton.addEventListener('click', compareFromJson); + elements.formatButton.addEventListener('click', formatJsonInputs); + elements.fetchButton.addEventListener('click', compareFromUrls); + elements.curlButton.addEventListener('click', compareFromCurl); + elements.suggestButton.addEventListener('click', generateSuggestions); + elements.copyButton.addEventListener('click', copyDiffs); + elements.downloadButton.addEventListener('click', downloadJson); + elements.excelButton.addEventListener('click', downloadExcel); + elements.resetButton.addEventListener('click', resetAll); + elements.themeButton.addEventListener('click', toggleTheme); +} + +function setMode(mode) { + state.mode = mode; + document.querySelectorAll('.mode-button').forEach((button) => { + button.classList.toggle('active', button.dataset.mode === mode); + }); + elements.jsonMode.classList.toggle('hidden', mode !== 'json'); + elements.urlMode.classList.toggle('hidden', mode !== 'url'); + elements.curlMode.classList.toggle('hidden', mode !== 'curl'); + clearStatus(); + persistDraft(); +} + +function toggleTheme() { + state.theme = state.theme === 'dark' ? 'light' : 'dark'; + applyTheme(); + persistDraft(); +} + +function applyTheme() { + document.body.classList.toggle('theme-dark', state.theme === 'dark'); + elements.themeButton.textContent = state.theme === 'dark' ? '☼' : '◐'; +} + +async function handleFileUpload(event) { + const input = event.currentTarget; + const file = input.files?.[0]; + if (!file) return; + + try { + const text = await file.text(); + JSON.parse(text); + elements[input.dataset.target].value = text; + persistDraft(); + clearSourceDerivedState(); + clearStatus(); + } catch { + showStatus(`${file.name} does not contain valid JSON.`); + } finally { + input.value = ''; + } +} + +function compareFromJson() { + const parsed = parseModeJson(); + if (!parsed) return; + compareParsed(parsed.values, parsed.active, getIgnoreFields()); +} + +async function compareFromUrls() { + const urls = getEnvironmentInputValues('Url'); + if (Object.values(urls).filter(Boolean).length < 2) { + showStatus('Provide at least two HTTPS URLs.'); + return; + } + + state.urlController?.abort(); + state.urlController = new AbortController(); + setLoading('url', true); + + try { + const results = await Promise.all( + ENVIRONMENTS.map(({ id, label }) => + fetchOptionalJson(urls[id], label, state.urlController.signal), + ), + ); + compareParsed( + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].value])), + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].active])), + [], + ); + } catch (error) { + if (!isAbortError(error)) { + showStatus(error instanceof Error ? error.message : 'Unable to fetch URLs.'); + } + } finally { + setLoading('url', false); + } +} + +async function compareFromCurl() { + const commands = getEnvironmentInputValues('Curl'); + if (Object.values(commands).filter(Boolean).length < 2) { + showStatus('Provide at least two cURL commands.'); + return; + } + + state.curlController?.abort(); + state.curlController = new AbortController(); + setLoading('curl', true); + + try { + const results = await Promise.all( + ENVIRONMENTS.map(({ id, label }) => + fetchOptionalCurlJson(commands[id], label, state.curlController.signal), + ), + ); + compareParsed( + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].value])), + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].active])), + [], + ); + } catch (error) { + if (!isAbortError(error)) { + showStatus(error instanceof Error ? error.message : 'Unable to import cURL commands.'); + } + } finally { + setLoading('curl', false); + } +} + +function compareParsed(values, active, ignoreFields) { + if (Object.values(active).filter(Boolean).length < 2) { + showStatus('Provide at least two populated environments.'); + return; + } + + state.compared = values; + state.active = active; + state.diffs = compareJson(values.dev, values.qa, values.prod, ignoreFields, active); + state.filter = 'ALL'; + state.suggestions = []; + showStatus(state.diffs.length ? '' : 'No differences found.'); + render(); +} + +function parseModeJson() { + const values = {}; + const active = {}; + for (const { id, label } of ENVIRONMENTS) { + const result = parseOptionalJson(elements[`${id}Json`].value, label); + if (!result.ok) return undefined; + values[id] = result.value; + active[id] = result.active; + } + return { values, active }; +} + +function formatJsonInputs() { + const updates = []; + for (const { id, label } of ENVIRONMENTS) { + const input = elements[`${id}Json`].value.trim(); + if (!input) continue; + try { + updates.push([`${id}Json`, JSON.stringify(JSON.parse(input), null, 2)]); + } catch { + showStatus(`${label} contains invalid JSON.`); + return; + } + } + updates.forEach(([id, value]) => { + elements[id].value = value; + }); + persistDraft(); + clearSourceDerivedState(); + clearStatus(); +} + +async function fetchOptionalJson(url, label, signal) { + if (!url.trim()) return { active: false, value: undefined }; + validateExtensionUrl(url, label); + + const response = await fetch(url, { + credentials: 'omit', + cache: 'no-store', + headers: { Accept: 'application/json' }, + signal, + }); + return parseJsonResponse(response, label); +} + +async function fetchOptionalCurlJson(command, label, signal) { + if (!command.trim()) return { active: false, value: undefined }; + const request = parseCurlCommand(command); + validateExtensionUrl(request.url, label); + if (request.body && new TextEncoder().encode(request.body).byteLength > MAX_REQUEST_BODY_SIZE) { + throw new Error(`${label} cURL request body is too large.`); + } + + const method = request.method.toUpperCase(); + const response = await fetch(request.url, { + method, + headers: sanitizeRequestHeaders(request.headers), + body: method === 'GET' || method === 'HEAD' ? undefined : request.body, + credentials: 'omit', + cache: 'no-store', + signal, + }); + return parseJsonResponse(response, label); +} + +async function parseJsonResponse(response, label) { + const text = await response.text(); + if (!response.ok) { + throw new Error(`${label} request failed: ${response.status} ${response.statusText}${text ? ` - ${text.slice(0, 240)}` : ''}`); + } + try { + return { active: true, value: JSON.parse(text) }; + } catch { + throw new Error(`${label} did not return valid JSON.`); + } +} + +function validateExtensionUrl(url, label) { + const target = new URL(url); + if (target.protocol !== 'https:') { + throw new Error(`${label} URL must start with https://`); + } +} + +function parseOptionalJson(input, label) { + if (!input.trim()) return { ok: true, active: false, value: undefined }; + try { + return { ok: true, active: true, value: JSON.parse(input) }; + } catch { + showStatus(`${label} contains invalid JSON.`); + return { ok: false, active: false, value: undefined }; + } +} + +function parseCurlCommand(command) { + const tokens = tokenizeCurl(command.trim()); + if (tokens[0]?.toLowerCase() !== 'curl') throw new Error('Command must start with curl'); + + let url = ''; + let method = ''; + let useGet = false; + const headers = {}; + const dataParts = []; + + for (let index = 1; index < tokens.length; index += 1) { + const token = tokens[index]; + if (token === '-X' || token === '--request') { + method = readFlagValue(tokens, ++index, token).toUpperCase(); + continue; + } + if (token === '-H' || token === '--header') { + const header = readFlagValue(tokens, ++index, token); + const separator = header.indexOf(':'); + if (separator <= 0) throw new Error(`Invalid header: ${header}`); + headers[header.slice(0, separator).trim()] = header.slice(separator + 1).trim(); + continue; + } + if (DATA_FLAGS.has(token)) { + const data = readFlagValue(tokens, ++index, token); + if (data.startsWith('@')) throw new Error('File-based cURL data is not supported'); + dataParts.push(data); + continue; + } + if (token === '-G' || token === '--get') { + useGet = true; + continue; + } + if (token === '--url') { + url = readFlagValue(tokens, ++index, token); + continue; + } + if (token === '-u' || token === '--user') { + headers.Authorization = `Basic ${btoa(readFlagValue(tokens, ++index, token))}`; + continue; + } + if (['--compressed', '-s', '--silent', '-L', '--location'].includes(token)) continue; + if (token === '-b' || token === '--cookie') { + headers.Cookie = readFlagValue(tokens, ++index, token); + continue; + } + if (token === '-A' || token === '--user-agent') { + headers['User-Agent'] = readFlagValue(tokens, ++index, token); + continue; + } + if (token === '-e' || token === '--referer') { + headers.Referer = readFlagValue(tokens, ++index, token); + continue; + } + if (token.startsWith('-')) throw new Error(`Unsupported cURL option: ${token}`); + if (url) throw new Error('cURL command contains more than one URL'); + url = token; + } + + if (!url) throw new Error('cURL command does not contain a URL'); + let body = dataParts.length ? dataParts.join('&') : undefined; + if (useGet && body) { + const target = new URL(url); + target.search += `${target.search ? '&' : ''}${body}`; + url = target.toString(); + body = undefined; + } + return { url, method: method || (body ? 'POST' : 'GET'), headers, ...(body === undefined ? {} : { body }) }; +} + +function tokenizeCurl(command) { + if (!command) throw new Error('cURL command is empty'); + const normalized = command.replace(/\\\r?\n/g, ' '); + const tokens = []; + let current = ''; + let quote; + + for (let index = 0; index < normalized.length; index += 1) { + const character = normalized[index]; + if (quote) { + if (character === quote) quote = undefined; + else if (character === '\\' && quote === '"' && index + 1 < normalized.length) current += normalized[++index]; + else current += character; + continue; + } + if (character === "'" || character === '"') { + quote = character; + continue; + } + if ( + character === '|' || + character === ';' || + character === '<' || + character === '>' || + character === '`' || + (character === '$' && normalized[index + 1] === '(') + ) { + throw new Error('Shell operators are not supported'); + } + if (/\s/.test(character)) { + if (current) { + tokens.push(current); + current = ''; + } + continue; + } + if (character === '\\' && index + 1 < normalized.length) { + current += normalized[++index]; + continue; + } + current += character; + } + + if (quote) throw new Error('cURL command contains an unclosed quote'); + if (current) tokens.push(current); + return tokens; +} + +function readFlagValue(tokens, index, flag) { + const value = tokens[index]; + if (value === undefined) throw new Error(`${flag} requires a value`); + return value; +} + +function sanitizeRequestHeaders(headers) { + return Object.entries(headers ?? {}).reduce((safeHeaders, [name, value]) => { + const normalizedName = name.trim().toLowerCase(); + if (!normalizedName || BLOCKED_REQUEST_HEADERS.has(normalizedName)) return safeHeaders; + safeHeaders[normalizedName] = value; + return safeHeaders; + }, {}); +} + +function compareJson(devJson, qaJson, prodJson, ignoreFields, comparedEnvironments) { + const environments = [ + { key: 'devValue', active: comparedEnvironments.dev, root: devJson, values: comparedEnvironments.dev ? flatten(devJson) : {} }, + { key: 'qaValue', active: comparedEnvironments.qa, root: qaJson, values: comparedEnvironments.qa ? flatten(qaJson) : {} }, + { key: 'prodValue', active: comparedEnvironments.prod, root: prodJson, values: comparedEnvironments.prod ? flatten(prodJson) : {} }, + ].filter((environment) => environment.active); + + const paths = Array.from(new Set(environments.flatMap((environment) => Object.keys(environment.values)))).sort((left, right) => + left.localeCompare(right), + ); + + return paths.reduce((diffs, path) => { + if (isIgnoredPath(path, ignoreFields)) return diffs; + const values = environments.map((environment) => ({ + ...environment, + comparable: getComparableValue(environment.root, environment.values, path), + })); + const baseline = values[0].comparable; + const diffsByType = new Map(); + + values.slice(1).forEach(({ key, comparable }) => { + const type = getDiffType(baseline, comparable); + if (!type) return; + let diff = diffsByType.get(type); + if (!diff) { + diff = { path, type }; + if (baseline.found) diff[values[0].key] = baseline.value; + diffsByType.set(type, diff); + } + if (comparable.found) diff[key] = comparable.value; + }); + + diffs.push(...diffsByType.values()); + return diffs; + }, []); +} + +function flatten(value) { + const result = {}; + visit(value, '', result); + return result; +} + +function visit(value, path, result) { + if (Array.isArray(value)) { + if (value.length === 0) { + result[path] = value; + return; + } + value.forEach((item, index) => visit(item, `${path}[${index}]`, result)); + return; + } + if (value && typeof value === 'object') { + const entries = Object.entries(value); + if (entries.length === 0) { + result[path] = value; + return; + } + entries.forEach(([key, childValue]) => visit(childValue, path ? `${path}.${key}` : key, result)); + return; + } + result[path] = value; +} + +function getDiffType(baseline, target) { + if (!baseline.found && !target.found) return undefined; + if (!baseline.found) return 'ADDED'; + if (!target.found) return 'REMOVED'; + if (JSON.stringify(baseline.value) === JSON.stringify(target.value)) return undefined; + if (baseline.value === null || target.value === null) return 'CHANGED'; + return getJsonType(baseline.value) === getJsonType(target.value) ? 'CHANGED' : 'TYPE_CHANGE'; +} + +function getComparableValue(root, flattened, path) { + if (Object.prototype.hasOwnProperty.call(flattened, path)) { + return { found: true, value: flattened[path] }; + } + return getValueAtPath(root, path); +} + +function getValueAtPath(root, path) { + if (path === '') return { found: true, value: root }; + const segments = path.match(/[^.[\]]+/g); + if (!segments) return { found: false, value: undefined }; + let current = root; + + for (const segment of segments) { + if (current === null || typeof current !== 'object') return { found: false, value: undefined }; + if (Array.isArray(current)) { + const index = Number(segment); + if (!Number.isInteger(index) || index < 0 || index >= current.length) return { found: false, value: undefined }; + current = current[index]; + } else { + if (!Object.prototype.hasOwnProperty.call(current, segment)) return { found: false, value: undefined }; + current = current[segment]; + } + } + return { found: true, value: current }; +} + +function isIgnoredPath(path, ignoreFields) { + if (!ignoreFields.length) return false; + const segments = path.split(/[.[\]]+/).filter(Boolean); + return segments.some((segment) => ignoreFields.includes(segment)); +} + +function getJsonType(value) { + if (value === null) return 'null'; + if (Array.isArray(value)) return 'array'; + return typeof value; +} + +function generateSuggestions() { + if (!state.diffs.length) { + showStatus('Compare responses before generating ignore rules.'); + return; + } + state.suggestions = generateIgnoreSuggestions(state.diffs); + if (!state.suggestions.length) showStatus('No volatile ignore rules detected.'); + renderSuggestions(); +} + +function generateIgnoreSuggestions(diffs) { + const changedDiffs = diffs.filter((diff) => diff.type === 'CHANGED'); + const pathFrequencies = countNormalizedPaths(changedDiffs); + const suggestions = new Map(); + + changedDiffs.forEach((diff) => { + const normalizedPath = normalizeArrayPath(diff.path); + const reasons = []; + let score = 0; + const nameResult = scoreFieldName(diff.path); + score += nameResult.score; + if (nameResult.reason) reasons.push(nameResult.reason); + const valueResult = scoreValues([diff.devValue, diff.qaValue, diff.prodValue]); + score += valueResult.score; + if (valueResult.reason) reasons.push(valueResult.reason); + if (looksLikeNoisyPath(diff.path)) { + score += 20; + reasons.push('path belongs to a noisy metadata area'); + } + const frequency = pathFrequencies.get(normalizedPath) ?? 0; + if (frequency >= 10) { + score += 30; + reasons.push('field changes repeatedly across 10 or more array items'); + } else if (frequency >= 3) { + score += 20; + reasons.push('field changes repeatedly across array items'); + } else if (frequency >= 2) { + score += 10; + reasons.push('field changes repeatedly across array items'); + } + if (score < SUGGESTION_THRESHOLD) return; + const suggestion = { path: normalizedPath, score, confidence: getConfidence(score), reason: reasons.join(', ') }; + const existing = suggestions.get(normalizedPath); + if (!existing || suggestion.score > existing.score) suggestions.set(normalizedPath, suggestion); + }); + + return Array.from(suggestions.values()).sort((left, right) => right.score - left.score || left.path.localeCompare(right.path)); +} + +function countNormalizedPaths(diffs) { + return Array.from(new Set(diffs.map((diff) => diff.path))).reduce((frequencies, diffPath) => { + const path = normalizeArrayPath(diffPath); + frequencies.set(path, (frequencies.get(path) ?? 0) + 1); + return frequencies; + }, new Map()); +} + +function scoreFieldName(path) { + const leaf = getIgnoreFieldFromPath(path); + if (!leaf) return { score: 0 }; + if (STRONG_VOLATILE_NAME_PATTERNS.some((pattern) => pattern.test(leaf))) return { score: 50, reason: 'field name looks dynamic' }; + if (TEMPORAL_NAME_PATTERN.test(leaf)) return { score: 25, reason: 'field name looks time-based' }; + if (WEAK_IDENTIFIER_NAME_PATTERN.test(leaf)) return { score: 20, reason: 'field name looks like a generated identifier' }; + return { score: 0 }; +} + +function scoreValues(values) { + return values.map(scoreValue).sort((left, right) => right.score - left.score)[0]; +} + +function scoreValue(value) { + const text = typeof value === 'number' ? String(value) : value; + if (typeof text !== 'string') return { score: 0 }; + if (UUID_PATTERN.test(text)) return { score: 40, reason: 'value looks like a UUID' }; + if (ISO_DATETIME_PATTERN.test(text)) return { score: 40, reason: 'value looks time-based' }; + if (EPOCH_PATTERN.test(text)) return { score: 35, reason: 'value looks like an epoch timestamp' }; + if (PREFIXED_IDENTIFIER_PATTERN.test(text)) return { score: 30, reason: 'value looks like a generated identifier' }; + if (TOKEN_PATTERN.test(text)) return { score: 30, reason: 'value looks like a generated token' }; + return { score: 0 }; +} + +function normalizeArrayPath(path) { + return path.replace(/\[\d+\]/g, '[*]'); +} + +function getIgnoreFieldFromPath(path) { + const segments = path.match(/[^.[\]]+/g); + const leaf = segments?.at(-1); + return leaf && leaf !== '*' && !/^\d+$/.test(leaf) ? leaf : undefined; +} + +function looksLikeNoisyPath(path) { + const segments = path.toLowerCase().split(/[.[\]]+/).filter(Boolean); + return segments.some((segment) => NOISY_PATH_SEGMENTS.has(segment)); +} + +function getConfidence(score) { + if (score >= 80) return 'High'; + if (score >= SUGGESTION_THRESHOLD) return 'Medium'; + return 'Low'; +} + +function render() { + updateCounts(); + renderModeAndView(); + renderTable(); + renderTrees(); + renderSuggestions(); + elements.contractAlert.classList.toggle('hidden', !state.diffs.some((diff) => ['ADDED', 'REMOVED', 'TYPE_CHANGE'].includes(diff.type))); +} + +function renderModeAndView() { + document.querySelectorAll('.count').forEach((button) => { + button.classList.toggle('active', button.dataset.filter === state.filter); + }); + document.querySelectorAll('.view-button').forEach((button) => { + button.classList.toggle('active', button.dataset.view === state.view); + }); + elements.tableView.classList.toggle('hidden', state.view !== 'table'); + elements.treeView.classList.toggle('hidden', state.view !== 'tree'); +} + +function renderTable() { + const visibleDiffs = getVisibleDiffs(); + if (!visibleDiffs.length) { + const row = document.createElement('tr'); + const cell = document.createElement('td'); + cell.colSpan = 5; + cell.className = 'empty'; + cell.textContent = state.diffs.length ? 'No matching differences.' : 'No comparison yet.'; + row.append(cell); + elements.diffTable.replaceChildren(row); + return; + } + elements.diffTable.replaceChildren(...visibleDiffs.map(createDiffRow)); +} + +function createDiffRow(diff) { + const row = document.createElement('tr'); + const pathCell = document.createElement('td'); + pathCell.textContent = diff.path || '(root)'; + + const typeCell = document.createElement('td'); + const badge = document.createElement('span'); + badge.className = `badge ${diff.type}`; + badge.textContent = diff.type; + typeCell.append(badge); + + row.append( + pathCell, + createValueCell(diff.devValue), + createValueCell(diff.qaValue), + createValueCell(diff.prodValue), + ); + row.insertBefore(typeCell, row.children[1]); + return row; +} + +function createValueCell(value) { + const cell = document.createElement('td'); + cell.textContent = formatValue(value); + return cell; +} + +function renderTrees() { + ENVIRONMENTS.forEach(({ id }) => { + const value = state.active[id] ? state.compared[id] : undefined; + if (value === undefined) { + const empty = document.createElement('div'); + empty.className = 'empty'; + empty.textContent = 'No active input.'; + elements[`${id}Tree`].replaceChildren(empty); + return; + } + elements[`${id}Tree`].replaceChildren(renderTreeNode(value, id, '', '(root)', true)); + }); +} + +function renderTreeNode(value, environmentId, path, label, isRoot = false) { + const diff = selectTreeDiff(path, environmentId); + const className = diff ? diff.type : ''; + const node = document.createElement('div'); + node.className = ['tree-node', isRoot ? 'root' : '', className].filter(Boolean).join(' '); + + if (Array.isArray(value)) { + node.append(createTreeLine(label, `Array(${value.length})`)); + if (value.length) { + node.append(...value.map((item, index) => renderTreeNode(item, environmentId, `${path}[${index}]`, `[${index}]`))); + } else { + node.append(createTreeLeaf('[]')); + } + return node; + } + if (value && typeof value === 'object') { + const entries = Object.entries(value); + node.append(createTreeLine(label, 'Object')); + if (entries.length) { + node.append(...entries.map(([key, childValue]) => renderTreeNode(childValue, environmentId, path ? `${path}.${key}` : key, key))); + } else { + node.append(createTreeLeaf('{}')); + } + return node; + } + node.append(createTreeLine(label, formatValue(value))); + return node; +} + +function createTreeLine(label, value) { + const line = document.createElement('div'); + line.className = 'tree-line'; + const key = document.createElement('span'); + key.className = 'tree-key'; + key.textContent = label; + const text = document.createElement('span'); + text.className = 'tree-value'; + text.textContent = value; + line.append(key, text); + return line; +} + +function createTreeLeaf(value) { + const node = document.createElement('div'); + node.className = 'tree-node'; + const line = document.createElement('div'); + line.className = 'tree-line'; + const text = document.createElement('span'); + text.className = 'tree-value'; + text.textContent = value; + line.append(text); + node.append(line); + return node; +} + +function selectTreeDiff(path, environmentId) { + const key = `${environmentId}Value`; + return state.diffs.find((diff) => diff.path === path && Object.prototype.hasOwnProperty.call(diff, key)); +} + +function renderSuggestions() { + elements.suggestions.classList.toggle('hidden', !state.suggestions.length); + elements.suggestions.replaceChildren(...state.suggestions.map(createSuggestionRow)); +} + +function createSuggestionRow(suggestion) { + const leaf = getIgnoreFieldFromPath(suggestion.path) ?? suggestion.path; + const row = document.createElement('div'); + row.className = 'suggestion'; + const copy = document.createElement('div'); + const path = document.createElement('strong'); + path.textContent = suggestion.path; + const detail = document.createElement('small'); + detail.textContent = `${suggestion.confidence} · ${suggestion.score} · ${suggestion.reason}`; + copy.append(path, document.createElement('br'), detail); + + const button = document.createElement('button'); + button.className = 'secondary'; + button.type = 'button'; + button.textContent = 'Ignore'; + button.addEventListener('click', () => addIgnoreField(leaf)); + + row.append(copy, button); + return row; +} + +function addIgnoreField(field) { + const fields = new Set(getIgnoreFields()); + fields.add(field); + elements.ignoreFields.value = Array.from(fields).join(', '); + persistDraft(); + showStatus(`Added ${field} to ignored fields. Compare again to apply it.`); +} + +function updateCounts() { + elements.countAll.textContent = String(state.diffs.length); + elements.countAdded.textContent = String(countType('ADDED')); + elements.countRemoved.textContent = String(countType('REMOVED')); + elements.countChanged.textContent = String(countType('CHANGED')); + elements.countType.textContent = String(countType('TYPE_CHANGE')); +} + +function getVisibleDiffs() { + const query = elements.pathSearch.value.trim().toLowerCase(); + return state.diffs.filter((diff) => { + const matchesFilter = state.filter === 'ALL' || diff.type === state.filter; + const matchesSearch = !query || diff.path.toLowerCase().includes(query); + return matchesFilter && matchesSearch; + }); +} + +function countType(type) { + return state.diffs.filter((diff) => diff.type === type).length; +} + +function copyDiffs() { + navigator.clipboard.writeText(JSON.stringify(state.diffs, null, 2)); + showStatus('Copied diff JSON.'); +} + +function downloadJson() { + downloadBlob(new Blob([JSON.stringify(state.diffs, null, 2)], { type: 'application/json' }), 'api-diff.json'); +} + +function downloadExcel() { + const header = ['Path', 'Type', 'Dev', 'QA', 'Prod']; + const rows = state.diffs.map((diff) => [diff.path, diff.type, formatValue(diff.devValue), formatValue(diff.qaValue), formatValue(diff.prodValue)]); + const html = `${[header, ...rows] + .map((row) => `${row.map((cell) => ``).join('')}`) + .join('')}
${escapeHtml(cell)}
`; + downloadBlob(new Blob([html], { type: 'application/vnd.ms-excel' }), 'api-diff.xls'); +} + +function downloadBlob(blob, fileName) { + const url = URL.createObjectURL(blob); + const anchor = document.createElement('a'); + anchor.href = url; + anchor.download = fileName; + anchor.click(); + URL.revokeObjectURL(url); +} + +function clearSourceDerivedState() { + state.diffs = []; + state.suggestions = []; + state.filter = 'ALL'; + state.compared = { dev: undefined, qa: undefined, prod: undefined }; + state.active = { dev: false, qa: false, prod: false }; + render(); +} + +function resetAll() { + state.urlController?.abort(); + state.curlController?.abort(); + draftIds.forEach((id) => { + elements[id].value = ''; + }); + state.mode = 'json'; + state.view = 'table'; + state.theme = 'light'; + setMode('json'); + applyTheme(); + clearSourceDerivedState(); + clearStatus(); + extensionApi.storage.local.remove('draft'); +} + +function setLoading(kind, isLoading) { + const button = kind === 'url' ? elements.fetchButton : elements.curlButton; + button.disabled = isLoading; + button.textContent = isLoading ? 'Comparing...' : kind === 'url' ? 'Fetch & Compare' : 'Import cURL & Compare'; +} + +function getEnvironmentInputValues(suffix) { + return Object.fromEntries(ENVIRONMENTS.map(({ id }) => [id, elements[`${id}${suffix}`].value.trim()])); +} + +function getIgnoreFields() { + return elements.ignoreFields.value + .split(',') + .map((field) => field.trim()) + .filter(Boolean); +} + +function showStatus(message) { + elements.status.textContent = message; +} + +function clearStatus() { + showStatus(''); +} + +function formatValue(value) { + if (value === undefined) return '-'; + if (typeof value === 'string') return value; + return JSON.stringify(value); +} + +function escapeHtml(value) { + return String(value) + .replaceAll('&', '&') + .replaceAll('<', '<') + .replaceAll('>', '>') + .replaceAll('"', '"') + .replaceAll("'", '''); +} + +function isAbortError(error) { + return error instanceof DOMException && error.name === 'AbortError'; +} + +function persistDraft() { + const draft = Object.fromEntries(draftIds.map((id) => [id, elements[id].value])); + draft.mode = state.mode; + draft.view = state.view; + draft.theme = state.theme; + extensionApi.storage.local.set({ draft }); +} + +async function restoreDraft() { + const stored = await extensionApi.storage.local.get('draft'); + const draft = stored.draft ?? {}; + draftIds.forEach((id) => { + elements[id].value = draft[id] ?? ''; + }); + state.view = draft.view === 'tree' ? 'tree' : 'table'; + state.theme = draft.theme === 'dark' ? 'dark' : 'light'; + applyTheme(); + setMode(['json', 'url', 'curl'].includes(draft.mode) ? draft.mode : 'json'); +} diff --git a/browser-extension/firefox/store-listing.md b/browser-extension/firefox/store-listing.md new file mode 100644 index 0000000..abe87fc --- /dev/null +++ b/browser-extension/firefox/store-listing.md @@ -0,0 +1,90 @@ +# Mozilla Add-ons Listing Draft + +## Product Details + +Name: +API Response Comparator + +Summary: +Compare JSON API responses across Dev, QA, and Prod from a Firefox popup. + +Description: +API Response Comparator helps developers and QA teams spot API response drift before it reaches users. Paste JSON, upload response files, fetch HTTPS API URLs, or import safe cURL commands, then compare Dev, QA, and Prod responses from a compact Firefox extension popup. + +The first populated environment in Dev, QA, Prod order becomes the baseline. The extension flattens nested JSON paths and reports `ADDED`, `REMOVED`, `CHANGED`, and `TYPE_CHANGE` differences. Any two environments are enough, so you can compare Dev vs QA, QA vs Prod, or all three together. + +Features: +- Manual JSON paste, format, upload, and clear controls +- Direct HTTPS URL fetch comparison +- Safe cURL parsing with structured browser fetch execution +- Optional third environment +- Ignore leaf fields and generate volatility-based ignore suggestions +- Separate rows when one path has different outcome types +- Contract-change alert for added, removed, or type-changed fields +- Count filters and path search +- Table and color-coded JSON tree views +- Copy, JSON download, and Excel-compatible export +- Full reset with in-flight request cancellation +- Light and dark themes + +Category: +Developer Tools + +Platforms: +Firefox desktop and Firefox for Android 142.0 or later + +Language: +English + +## Graphic Assets + +Extension package icons: +- `assets/icons/icon-16.png` +- `assets/icons/icon-32.png` +- `assets/icons/icon-48.png` +- `assets/icons/icon-128.png` + +Listing assets: +- `assets/store/store-icon-128.png` +- `assets/store/screenshot-1-json-compare-1280x800.png` +- `assets/store/screenshot-2-url-curl-1280x800.png` +- `assets/store/screenshot-3-tree-view-1280x800.png` +- `assets/store/small-promo-440x280.png` +- `assets/store/marquee-promo-1400x560.png` + +## Privacy And Permissions + +Single purpose: +Compare JSON API responses across Dev, QA, and Prod so developers can identify response value changes and API contract changes. + +Permission justification: + +`storage`: +Stores draft inputs and UI preferences locally in Firefox extension storage so users do not lose in-progress comparisons when the popup closes. + +`clipboardWrite`: +Lets the user copy generated diff JSON to the clipboard after clicking the Copy button. + +`https://*/*` host permission: +Allows the extension to fetch user-entered HTTPS API URLs and HTTPS cURL targets for comparison. The extension only sends requests when the user clicks Fetch & Compare or Import cURL & Compare. + +Data collection disclosure: +The extension declares `data_collection_permissions.required: ["none"]`. It does not collect, sell, share, or transmit user data to the developer or third-party analytics services. JSON payloads, URLs, cURL commands, ignore fields, and UI preferences remain in the browser except when the user explicitly fetches a user-entered HTTPS API endpoint. + +Privacy policy summary: +API Response Comparator stores draft comparison inputs locally in the browser and sends network requests only to HTTPS API endpoints the user provides. It does not collect analytics, sell data, share data with the developer, or transmit comparison data to a separate backend. + +## Test Instructions + +1. Open `about:debugging#/runtime/this-firefox`. +2. Load `browser-extension/firefox/manifest.json` as a temporary add-on. +3. Open the toolbar popup. +4. In JSON mode, paste two JSON objects into Dev and QA, then click Compare. +5. Verify that the table reports changed paths and Tree view highlights the changed values. +6. In URL mode, enter two HTTPS endpoints that return JSON and click Fetch & Compare. +7. In cURL mode, paste two HTTPS cURL commands and click Import cURL & Compare. +8. Verify Copy, JSON export, Excel export, ignore fields, path search, theme toggle, and Reset. + +## Submission Notes + +Current package behavior intentionally differs from the Next.js app proxy: the Firefox extension performs browser extension fetches directly using HTTPS host permissions. Browser-restricted headers are filtered from cURL imports before fetch. From 5f78ad8c7b1ebf369ceab9a139aefd47546f869d Mon Sep 17 00:00:00 2001 From: Arnab Nandy Date: Sun, 28 Jun 2026 22:43:34 +0530 Subject: [PATCH 3/5] Add edge plugin --- browser-extension/edge/README.md | 41 + .../edge/assets/icons/icon-128.png | Bin 0 -> 1659 bytes .../edge/assets/icons/icon-16.png | Bin 0 -> 462 bytes .../edge/assets/icons/icon-32.png | Bin 0 -> 603 bytes .../edge/assets/icons/icon-48.png | Bin 0 -> 826 bytes .../assets/store/marquee-promo-1400x560.png | Bin 0 -> 102372 bytes .../screenshot-1-json-compare-1280x800.png | Bin 0 -> 30699 bytes .../store/screenshot-2-url-curl-1280x800.png | Bin 0 -> 30571 bytes .../store/screenshot-3-tree-view-1280x800.png | Bin 0 -> 24732 bytes .../edge/assets/store/small-promo-440x280.png | Bin 0 -> 29172 bytes .../edge/assets/store/store-icon-128.png | Bin 0 -> 1659 bytes browser-extension/edge/manifest.json | 24 + browser-extension/edge/popup.css | 440 ++++++++ browser-extension/edge/popup.html | 180 ++++ browser-extension/edge/popup.js | 971 ++++++++++++++++++ browser-extension/edge/store-listing.md | 91 ++ 16 files changed, 1747 insertions(+) create mode 100644 browser-extension/edge/README.md create mode 100644 browser-extension/edge/assets/icons/icon-128.png create mode 100644 browser-extension/edge/assets/icons/icon-16.png create mode 100644 browser-extension/edge/assets/icons/icon-32.png create mode 100644 browser-extension/edge/assets/icons/icon-48.png create mode 100644 browser-extension/edge/assets/store/marquee-promo-1400x560.png create mode 100644 browser-extension/edge/assets/store/screenshot-1-json-compare-1280x800.png create mode 100644 browser-extension/edge/assets/store/screenshot-2-url-curl-1280x800.png create mode 100644 browser-extension/edge/assets/store/screenshot-3-tree-view-1280x800.png create mode 100644 browser-extension/edge/assets/store/small-promo-440x280.png create mode 100644 browser-extension/edge/assets/store/store-icon-128.png create mode 100644 browser-extension/edge/manifest.json create mode 100644 browser-extension/edge/popup.css create mode 100644 browser-extension/edge/popup.html create mode 100644 browser-extension/edge/popup.js create mode 100644 browser-extension/edge/store-listing.md diff --git a/browser-extension/edge/README.md b/browser-extension/edge/README.md new file mode 100644 index 0000000..e42f13a --- /dev/null +++ b/browser-extension/edge/README.md @@ -0,0 +1,41 @@ +# API Response Comparator Microsoft Edge Extension + +This is the Microsoft Edge extension version of API Response Comparator. +It is kept separate from the Next.js app and has no build step. + +## Load Locally + +1. Open `edge://extensions`. +2. Enable **Developer mode**. +3. Click **Load unpacked**. +4. Select this folder: `browser-extension/edge`. + +## Current Scope + +- Manifest V3 Edge extension popup +- Manual JSON paste, format, file upload, and per-input clear controls +- Direct HTTPS URL fetch comparison from the extension popup +- Safe cURL parsing and structured browser fetch execution +- Optional Dev, QA, and Prod comparison with any two inputs +- Ignore leaf fields and volatility-based ignore suggestions +- `ADDED`, `REMOVED`, `CHANGED`, and `TYPE_CHANGE` rows +- Separate rows when one path has different outcome types +- Contract-change alert +- Diff counts, type filters, and path search +- Table view and color-coded JSON tree view +- Copy, JSON download, and Excel-compatible `.xls` download +- Full reset with in-flight URL and cURL request invalidation +- Light and dark themes +- Local draft persistence with extension storage + +## Notes + +- This extension fetches HTTPS API URLs directly using Edge extension host + permissions instead of the Next.js app server proxy. +- cURL imports are parsed into structured requests. Shell operators and + file-based request bodies are rejected; browser-restricted headers are + filtered before fetch. +- The popup script uses `browser` when available and falls back to `chrome` so + the code stays portable across browser extension runtimes. +- The Excel export is an Excel-compatible `.xls` table so the extension can stay + dependency-free and load unpacked without a build step. diff --git a/browser-extension/edge/assets/icons/icon-128.png b/browser-extension/edge/assets/icons/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..8658432dfab6bebdaeaef4235d12981e9e4caeff GIT binary patch literal 1659 zcmZ8hc~BE}6a57tM2-~XiX3t%Rv@F*FC672hSM4#C4{IPwtfV#5GuFQhNDElhD%VC zf+3QETEbysEC~{d7HbqRs34{MRZ&nR8Ws$*Z91eut#-gQZAI|H=WsJWke$(Y$SEuFA2P`l$#>%p z>7VvKbd?PZ4CursZ8ra3qsP5sj(K$SP8L|4zCo*0?p$@@9PoLxnru%hsJn@s6{p&5 zWVtRDCA(Lya4mAU>gt@Bx`2a(zHg;Z8ByE(hwih>xa(FV^sJU-VvkF zOLJdA9QM6DX%+(;K|E{jbLg_4|BQZ1D$@ zb;+~UMv+u+M`Vg=@e2DX_01V+X6{Tn!sUcRZ5M8UWZWLwa0T>= z+1&t-a-Z;|tIgcLeui5vwfaMuOhT8vtwBt1erwoD6A0W*j?Z^Hl_K3zi69(_tyGvPC z8~mKZs$Am3clwI;Z5U9BgR9zsUT$P3%r`uSBG0DpQxsm2DHv(k@425(%XT9*!iryh zC8@HUj`L7>XbSW+Z77By@eX-QZ0SB}nYQA=yzs6}N$G4m1;|^NGtlu%v%=N2c0bkE z!~q~2{7Cq^5CjQz1#{zBk`MQERn7}v#U9(f?6Liy?omC!;I@`Ax)O4q;HhP-p;6HT z^R=}DMPXL}|CUMadSUNihsjU%N3_7c!o}uDh|Pk#TWpe9o_R5d+N%-wD=cru4qQ0* zk3fmJ`BTT00c1-<;GjXb)%a|?L7t{T-kSg4b2|*rYjtr2Zb-CH0*#Y5h=?sAW;$)r zj0_#$T=Z-Oyw7jW(?5oXIcWmi_of7$ouH?;L)H2JYYUd13|+dCSp)C;a!S5sm0R6q zegV!=^ zCyqJOC|kC;|I(h6wvkDixqW>8gn8`xi6Ne#|HPzQ_9_R+$!OTzh@a=E6Jo}S0(qZT*gjs z+*cpo^sujlIF51Ddu^H!_@fzXKC{95z)NZ9fu-^RO;?fvQC&6{zIe5XnBQPJYZ^|v zW__tyX)F3hcrsQ$QqnB1)ru>{cPm4Sxzxn`-z?y19XO|rT|W)=^jg5>Lr0|?7IMnl zMBwMdeKXQa<6DgxCZu?N#6MqrgdPip-Xgv>>4C66OShAm$Sl9uzf_*oF+N=6QaYId zX)r)7Wje06xWb?8|8z0yDfVF32=7q0oF7ly)nI71;n*!==R_83dqo{fcxTe4_1;DV u#qmp~TV0}+uB_W__|tXT|NX>(9=!I+N`Fw10YbXCnGE*FVp!<7g1-P0ss>~L literal 0 HcmV?d00001 diff --git a/browser-extension/edge/assets/icons/icon-16.png b/browser-extension/edge/assets/icons/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..bf6900f3683eb84ff271e06d36a1674dafd5d4dd GIT binary patch literal 462 zcmV;<0WtoGP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0b@x-K~y+TV_+C` zfWIW)fWIuafWI`i0Rxxi7VwtkTA=HJ1HRI{e*Ut&|Aa7KS>Aedy$t;2`3@jSf$sYM zA{*xa7um540}F3j@L#aM8DdaLP6CPnd?k4m0u=>dMV5!R{P#b#2Lpq|g|{vF&tF~m zALJzz13&@-b*2BMcdh)t_2sGmRo-g<r~Kcz_Rzs=P1|Bt+V`G4!n$6$GoI-CZ8 zox3>izmQEHf*sw2;uX9GfNZ#RWA=aFsw4lw;Ng=0z5z@AKm7my|E(_{iF84UBa*F6 z|AoY(NOQsRll}i~yr=(P`}XDkBNwOtw=7uyUwO|O!Uljs7Zl1KCno&Y6j%GNIcv{< zyCk*$LP?WQT~Jek&48Q$Q2Yu`??O?Gj)mqf<^1OY@F{6H{I3e}T3d zOx#coNr|Po_xbbl1yBtDxgtMb0FPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0q{vgK~z{rV_+Bs zqks^okLTbo&v)Q2&21nVgY@O+3!ocG6aZ=DE6bbDUzYcu3V1tLNtOh<9XJ6YfhMEol#pQ?J zKmWtQ!zKTHtBxSp0ZaZrM96{xNImV+K#3!gubci0iAQ0op=JnRV0uRZCI_Mb_~lYbHMzG7>1F9g_ceu!2u;X2{6Ti{mmGLk%K{P1DKh7 zC3zL-cA@}Ks|D^_P$;aLg<&8`c*Fev0u=>F4#@RDw-W>KmF1p?X#i;!oZJqMM^drS zte*e;)rE-QFUxxlYUHBZhXMFY@(uV)^S&d81T`>GzJ~!&(}}+f36Wa8%}Sq=yF p@f;wH;G97=&Ius9Z!ikz0RY6TAhZ_Qd8_~c002ovPDHLkV1fe@{ow!r literal 0 HcmV?d00001 diff --git a/browser-extension/edge/assets/icons/icon-48.png b/browser-extension/edge/assets/icons/icon-48.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7b81a69e06914a854132a8ea00b5b594738bbc GIT binary patch literal 826 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 b&!2we{`Y3RvNePMuDbHtE7o3q+p_-v#{dGC literal 0 HcmV?d00001 diff --git a/browser-extension/edge/assets/store/screenshot-1-json-compare-1280x800.png b/browser-extension/edge/assets/store/screenshot-1-json-compare-1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6e7340b0ff6a3394473b5a0af319a72ca1b578 GIT binary patch literal 30699 zcmeFZc~n#9zA(Hg7Hm$`V-XRS7d>}U8rzj@lv z?GyHgmw&7MEdT(^j~+ST2moJ$UscyFRRjOQJfO+Ie^i1U5C04lw&;$7e=PC->G)3o zP@JS8zW@#WCg8}qU;xmphyGWgqW=5^0K%e=9{A~Wxcg*3w&1Gw1*S|!Rphj#TtB{P z!`{5@FN5-qC^qCh*}8m6ADDSO_YF`27X*Rn!FMEkHy7bQPRreQx^V8&JuV5zb}40 zl%{fGag27L+P=l%J`HPuO$%SMzVrUi!2gP#1RP);!Er^)M;>x|Jah855V1ckj=B;# zHg~GoKV-P0=kh7-Q<*w|Lk8U0M%b6jabe;LrCgNFB4#&=I66r-r)&i8G%|IT95x2J zXfshWm9)diS5&eLBa+;s=55KaIB63#@sUy;rx6-O0|^|m@~`&b)HX8%e5qxq{PpFS z-q)cZJi%i>izagt4KRWFxS5Az@nM{qa?ab79Y2Ch3(N$L^~H{P)lNF!?{YBDM+R#9 zJ63ksYekDnl$@MPUC29;+0Q8Z2rwN5H2f^>_C0US(407Z?4=yy@>eCQ9@uPJ#-q6p zVHuH;rgXO~i{4_N?pN3s=~a#CvBN_ftvRH~9OtA% z2-w=8Uz)bh7-c0eIE5A2{)`WI)2_7DKcqu1x;p!{F0OW0t6Hf#IBv|=a(9_DoBs-Yxa$Q9fv)PwPb6Be^gEaR5_~?v zp0}Cp2WM+9%q~>!MpsS;17Q~dYml^K-zuisx72-nI0b^XnL-){@qFLuywz?1F6^86 zR-~~Hn!2?{uzIt@*?fGU-z%?_F8gKCB}~8-mJdDK^`gfZSRVaw4*)@N;(Jw(v1QTF zgWnr~2NtU9ps$;D1D9HWrQo-HN0&uEH2z;Sl<``HKk-_llTDcmXpfthD>==?ImN|% z7<1xz7eNO+QuJ%^NQ`WiBK>xyNPWP?Eto}fVhV-xxGnjxd6{yA%s-_Hj`Mg6JScZt z18}`*3O=c7uXcNAxdDa&a|%<4Vuo@cqfsOVm)d~^Ff=wVv9V+~x?YdC6yXJJQhf<{ z=lVu<&;dVD-|Au7=q@6=C@}k=N83P@+v)*KK~LqAKd!!0jKnbw+#&7+qTYa8ey?65 z^=8GY_P|F7G0?ATfD-3nz`PVGX)W_*hMz(YzkA5%Ku@}NsMWknF$J~7b&a@Uc=gCr zZazWIPR+~5O*VHrl_{qKs%3`Fqv3D3NFBFEc)y&` zK3F|+-0TcY@fYeeUf444=n7Lb$nx?Bq|y(2U>tSktlf|k#4kn8(20G30;DpsIRUXc z;bN|PP`z(nK3?e8`r*t)Shd2fQ!LM!UxC$h!z#ve>hdAE^gyivjGfy6$s7uN)XYL zZNOOy##FaGv{>rB<|Z*!Wd(G!I*?}R+5l5=|MD@$YxhW5mKO@0Mm45IL{8OSxESAZ%JA#=Ci>K#GAu{&n*71BmoU9bmplmGty7zV4; zkK{Tu+vRD^)t+#4!#3yVGw!EdpwFT4_I_&nK!l+|GI#@hxa{T8Zu_ZEmPH?k)QT3E zmlnKc^>El`zO5x1s}x<0Lf+R!m)SW%sWD`Y-tH#67}@$k|DuDQD)l(mW_o7E`gWvWlo9sg` zN9()61Db8NZx=MdD>7Q?M_d~Vn|`Y(xX^FV1SzW`%>`Y?Ac2GwwJ`$E0TL-u;fl(>WQpQ?vsrkQG%Uo|_M44#e0GPtRH<9VGbR06VO5<@g^3 z{&VyT2XE6#Xh3*YQ?mT5o2TnmZ2FC|gbuIjp+<69Oat90qQdKYcF81T-*Bk`^8Ukv z1T(CAzB`NoFP*8t+@|e_P#$H-r66ciASV0^R0mh!1_zk&Mu+oi)oU758(p=2SZ!mj z#l;0M6zj09a|ZAeJlsATe1!;c$&JoW*8Z)+mUx)%_3ON~NZDj09-8w?)^?~9I`qwI z+A}O#8Xf6=QtqQJw&GMyE~+G#yO*qFkxqsy6&qW;UCOR~jm!@f;*(fSFQ=H9550Iy zBUy2_uPeL_9dfyqnwBEwg6grd9)Dy{r(DD#0Lk&5sKmNziw0y z&&nd*5+$ssh_U6jx!avMKZRb|cm6a+Ujb{EvrBsEPl7$pIuTWhs9s#--=AT1?C)$D z@;Z)HY({3z(7lwxV`)#R>>usYXr}(Ew@F^kShbpt(c?eP>;3s`w*1|%^NI8}0*O|< zNh;Nwv&?%oYcVSO5^EG`38F6&&owqk08s~O)tQ)4r6ap1XU5ofSbe-aUjGDXZg*zj z~B&?TPqP3#+ zREPV}Yw(l9B$R<*E+j>0S~R23xksvht`d;qNI%JWKC?|8X|Jo8j%5=nTor|x`n<|w zk`@3=Kup?b3Eb~1QuVkg*!X*Rkv7~T{Rl#mXfP9&R!CLlpPN*#&TWrncZzm%>$p#u zbDgSf&8@`dZw_TitSexrF#YzM$g74%Q3nhveXqLwH0&9cff|0{_L_jG_cIp=>bdwK zpgYjY91|sf8INLP8`!}CIGxJn4F)Ab?wZ@oGVY$NLJHsaH>vBR_JhPIDXWnlAq_zX z?>~2O@R^ldcUU-%)!PKm;aB)v9r;Y{!C4&!@Ic#kSpCDP+v=3o7-fTMUxno1&hhrw zL_16c*}xc1y4?}pitc?eL*)vu=CyE51ut(QXg%MsNc%C0!mWWBO*e1zr$hJR`!Bs( zz6Hj;qUyonmIP$oZu}EIEc9vd%`Ce%BdYx1sc(xMC?qvMryL$)Kj#N+gcBvfJp9}$ zWN9W6{OJc|Be*EdTk#30%c2>mZk1h%n%NIp`YiR#bgj!djt2O-qGU^&(m;0EAh zCH&?IspTCQ>&aN$tqw0+JkB_mR)Wg??w3usYcCF=yYIh(vuWN+p*=QZoJ-k1%!(!K z)xE;0yK91e^k(!3W^&K+=ppoXwr*zF)PA*9>D1vQVnvmPziKY2zLvgQSy>|S%z=qd z&S&J1OD8ECa+A>E8U2LdR+*viKY>d6OND=gb-+-x&PEX(xmi>ry{y%C%D_r7XeP2S znDn$a)HT}dNMt|1uNAFfbZS_7Hv1>_nuiS$Sw=`sh1;lUA0)otsMi#7VEp045WUyL_U+H+ zMJhmaKWIfE6~EjD6yh^4<{4F`781F*%jRbevg?E&(NvIv3hjSby3JEEM(z6SS0(ri zQSFh5oroN`6nhnPuM9z}pMVB*>$Li0QIK7b1Ko;f!PX52IX_|8EAFkS9#$X38f1y_ zyV9i?!t!W=&!zimrUHwnH)A?Pr31hNr8P)Xip2M>v|GeZBipmH;YpxHs!%!_1lte$ z-m~P5W!)C?$P?o<{FJBe5bsPx*)_>@hn_pEX<(pK{vwz36UVpn2*!`a-L8Bf@OgSh z7tnfbkm)}gv0V0gk4IHBP!r%| z$A%;CpkjP9NSO_DPhs5CU7zF>RDL&MwEjbt!tV!j6V;z!zcnZbO)zb;O@e`_q}HF3 z$|1eJuC>go-i>)b-9Z|8Ii7US%Md|}$i24SDO~5=D7LlELX};6C$iw~-OJ4y=?bapASd%I zNqF^~NswNe_ps%-jGWt6b}#ow1e458ttg1MM|_8GzJzw$691Y_=W<^Tqm#8C)U}7a zoG@jSO>xio+EIun0Og@x+i?2aqI)rS4O&xch4UJA#x zIh%*oUyXyJK;>F8JJyw51+K!!lGQnf^$Z`Wk7}sjoQcRH#r-b9R&wweD|0VgoswIU z?v3(vxOtjqfn&l`ba}_p^ z#^*(DnAGuCn4vdUZj)Fi)oLV`kH+!(b7VN^Us-+h>!#Ie_UE={%C21|OsR9@4bo^0 zS^@0_W=eB6Hhx5mrYLp4jHjs`@!_RU~fjJ%}&FLs>Ab9AzR@|oh`ntqZ%6vW6Eh(g4vdK zqvxHU_z2YZq!E<>{Igxl06n=47@bUi^cK;z`Fsa^xfgiq~PEG z-H6Tdnrg~wY+B|oz|OlvUv;s0-vPjHabQrOR-;@N?Rn`{v}i7B2>^_M`VwLsSq9!R ziisC*dGha9^mwxtu>0l9S&)`p3qT2minWW5IOLTB(f**GSqqebzR*sj@-M?qv_XWq zoVDEYO#fWV2HZPu9%&$40sc&9I#vs&JcnG)z0pRhZ>=-xyBRjL=PTgEKNf=n3|j{Z z4l1S9s3drq-?C_jeueUq`6Hg9Go5xb$Mux4qu(IL?3XaLnm4k^4!-k@-_V~(_1-pW zN`-?nQq#fuR$M+KF`(xXk?x1oU^*t_%7$j>mtF8MncE=%SPDX2W~Vx6HxS}!@^tc| zb2ayPE4#E>B|v$NcSwI^m5mh2mGl*JU!I)tf)CTLS>&?b4iUAY6fH*k%^$%KQ^%>Z zVPs0hRJz#NAr@tHh{6cq_`Z-^{*}%2S^`A>wittTRnH`f56AQtijq?cli;L3)M{eX zy)6tDc32jzbNb`z3fsCvEWyC_V>&#?X7tb_JsqHt|P3+)- zINJ9Y7^fwx)r4VY3okFz$S2yY*1S^L(aDpgfUzQD3NY8J8Pi|V2zwZBa3C({q4g1e zkojb#xSRd08G0RpJ>3neqL>RX$%7%;Q}r6YkQ=O*Wxo>Nf~t}Yr5LQpajy%L6yHZC z_OQbP;O!)FEgP<9x4GGWgOIJ`jv8XrCsodr7Ih2@N!c(wrlRpYGLHZJM&=30tYl9X z%$LHg;Q3it6AuzLR2iBi^2H_GS9?|(AXnkjM#jAjwg}ih*h4u}?Is4kQnqOHHi=D^ z;%!VLbf%=*v2;-#<4_VUJFuY%420H$++eE>AmnWEVK8_m;6}`zT=3f>?Puf@`uLAN z2*1gXdw={0V(A@&CG?!sD38@Pr#6e=L^vku;vL@uw7(u&KX#q075%C@XvIWU@7^8o zf{D-uatOgwo(BlkG|}%kO3a0;o$3v@X~jG*n^#8Hlhz{d_mo^8K+G3^&+g$09o)t; zq-l7}oHu?|U&~4YLPS1#n{iC^QkKbmN~aIrqNACNARc#Tpvx_UKZQaBDf!2T$tJk{ z@SZSbHSa~8SJI)^Z)EzeLg;qDC8>q+Nx9nZDn#b!-ZmvqZEsl>RJmXe9rDfe#Vs3v3p0J#kJP&nS z{RZJ+(+!H(?+rdrnyL~d@_PhC1vb>p0ZZ0&<5{&UX5Eo78FchCcBR3FE^(D5JV_sq zAh_QwZ_TGskKPH(A4q({*mr*V`C(%4uBC<9Z2E=@xgOnx#0ZcIkLk(o5weAzacl;< z0!IK<(9ckg#{__fPRw0i#?4d4u7h$jPwqZz;1FHHJ6(_li>VeIEXbvEq_%gaXHCfy zZ_2v{nE2P5&puomKFz6(oQW<~uy+to|Dzk)TZ&dqIlJFxXOcrTTJzH|Uw>9e@Yq9xYm!Q_J9@iT4{^@Jg`l=4E zqxg3-s$9tn0T>)bIP%IqL~^W28{q3SX)rmjw8QH-rfP(^g=R*6XNQq)g=y=iKjD~>5cXB2+YcwjmPi(46RR^fss zMY45LkwquxF*UW7U@pyxGCMYw{dUO9t?MaH<;XL7OwCBlE6Gp3E;H-Q(E9D_T}}GG z!RUeKzBe$Q^C&I-@bFx`k@w71!Y2ADc7&clB~Y^4iiUr~?oO5q`7D#`O;v*?=hSLO zWUtx8D)}41MzoDcVi`i_bv!8(&uQ9n@R42 z4|8{|B0iM`f8&1&TObrIMYyv?tMHoJ`ibP@B^rVhV zQBYMZDr531IJx&=H=K`}R_iZ$s{g{?pc{>l9AA!XGLYyyP5*Rdc(nZ9g*{44D#AfN z)^vMHJwKSX$`+g0D(cv)eGK{i1IZeVg9asRuLL-C{~JUS+}?2S$WEEu%AS6hqxc>= zRI5l|DVC29i&0#1;+6{L02d5(tyhA2sWi=!G(hiZoyQqj79JZ|#k?fLr1glxyr-vU z-|Mb)jOjQX^6nN%T*`k{+;JWWy6QTMD-p{+_;%bU@9d{H$^9_ZpIB4}@a4_P`&-RR zwK|F7&7!CkYv8w1;S!CEgdi7_=@$lZ&)qUb6dGe-TU4fWcGYqA-YOF_Ug{qW63 z`)3}9MLsHT`mP$8#2p{BL{XSSyw6Pm4<7?nL8;n6wu&fnKx4^)$cOB;#uT0Z9wr zTH1%(JWP^ZMK14zDS^jy*o%;&@Zryy*aMkMq z)zYhl+IMtgah(^?uW=@cx4kT6HMAh zk3H1NM!5^#)>t*lK&`KvV_SC%3--`RX8mI1<2gaTn9MM;3Uzal!F~9MY|~AxC!~_zkcHO9THI z+E=(dI!P~zECv0FLOAG3Iir;Ccy`A{lYfxiFi>S9_1!unB-zoeDx};pY{(Hk)^{*B zmu%Bf7H>x&-7tIj)2sCDPCjL)z;ebt$gSN242bAjXCRaI4CM6r>K8>&J!x;u;0hzx zs?*i{;Ww?JNbt!NLzG2QfQzdF1YWQJ%Q} zybXFfmcRMscg}^bx$f3c>m&I)4Y?f;H9ALkFe09&Fme-nO;I^unQxKriu6$s6D8i% z%SGX3%SjAL({--;>n--gc>P^=SSuW-uMz1#9-4<{G*12i0AND?;f@GE{zi*}&<@FR zk};WzME=v1P9NHzjyLVe;qWRSuhGyvT|a3kSPwIXJQYg-Cx?;OEVpPo83k2pP#4do zQ3AF_M(@;nDSc4&jepMDo~QmGOi*RPHCOd9LAl*qWOvQ1)^2-BiFDKbRPfwsejI2) zKWIU7pbJrAs2h-lZc>y0Tw?5x@Ll)248^pw!B(A{-(o=oErbo5G^2@94k1%;=zN*f zYt$m0^1&}N#&&xvQB#6 zX>6XN)Cy%8&OGf*k(Y9I49&e9*fKY3vsGO5T&t}8w0~u)p%`Kl$U_CgS7$cRy?aFO zmRil+U8Bi|oKoaBM*DXGn;krX2|t6IDaRAH-V@IWIQ?2rncfD6em`9vmx6tj{xpcu zf3+Oq(iM9aDnHe2svf(>4tg@<@}kC+J9X!k&m-Na)LUxg%fKtQ*;4#hJp}zXaEDFupibNf73|mpyuk! z-w!byRXt3m*8;NMxC>qzHoSdP(wS3e_9P@F>TFLO!)JS0fAf7A#D`Eo1*RK(=YVce z@Z6>5q~P?NN$npQs)I53bN#`5gUR)+KsOz}Y{#MBCkat!*G^8F2=?^P`n~rHEBS&K z24`(Gqg(AFeaF3L(V9^w4Xz|aJ^K#j56IukOTN*{*mfD1@O@Elo1buJ>m-6HBxc^< zE-uw9y{02V8<1%;ijuFK+F&~~k=p=HxRne+SI8Lm&Zq144Osf`Z|@5=bNMIW zUaJmX5K=y5nqtdQEd-zpCqqdb2WLl3fKVNJQL+*JR?x0nJ0rjGlFZtyIq5j6f94R{ z%57+NsI;=@lgNU3lc;B=1?t6hpc zgR}3$B~3P~z%2je@V|g=zti=$&hdwmy*Aj<*R@&FD(HPZEbQ!`ef4ku^v?;V_1al$ zkhm{yGm;rokzZ1JEVAE54_1<{!{l7pr9V9uN1pXqBQL1&_$yUszE0?70vs|3u3Ox| zTSy5+`)@sG+PHJgfw7FEojAsIaSs6`6ssa#t&I91v=g_D#F*OrC1W@5MKm_wpea-F z=TNqCN9HJRWda^;2iC~uz)Wz0@7Z%F_yswq-w=yS16Ekby)=V)%t+$tR@xPv3!vZ$ z`t8{$D-9Hg5}h4i(A~`01lWAI>}!g`Z13<(U#&>P^vwP?m0fUJi?FwLSv0p3H+G72 z(sSt6_f<=RXLlCZ=qymJG1BVzfd0y|5->?uVOTzC^rdQe30n)i)BtJwPns3%HIpT) zoTxl8b>a2o>C~-XK=J?51W46e!K0i_KvjP~3MiOY-q89r8{PCTN*ZdpNSc4Wdckyv z6>qRZ$Ndc1FxOx8f3V|*PGJWA1wPOuDSJGV4nQ^mIX4wnm)d*Y$h|_>X6yZ~$+qk! zXu5w+?}1NBt*}9*XcmfnF4x>m?A>dobVbh&$MP?gma=kM4r<-W&J2~0^l)s$H#F5u zp0;3gKw7nT(aW5P-}ie7QP~|=pL%u`uJ(G+>~N2K1G@QN#}yEtiRvlSU6=p5duFoN zY~XaddGO|{+g>LT8e_4mX@|9b%XYE~1l!a`-(Jda2936>-}EONYYB95h&^X0A;!9( znXllI43?qJpX)?u<89U(t>wULu|i`(y6)w%GgPAbKYU=$bEcrpM(ctNrt+qIeN$OPDX zQ1ForHeAiccWUI&oT&C0DOuILhVkI$^j~)j)ds0ULoX!ql1*9~LoiG=C{29%11^zO;i412_COC2m~wej8uT#y6CRDSAHFz4b4b^Cq4 z(`9b*sfIq%QX(-1$q-bU(U5*o?m3bybv9tyjerN|jzXs|=wQiygCsu?m=W&Z=u_SD zL!^40z%99}3H)e0mrE6|hYmgroMrOsDa(?xlqvsi0NAOUC2->CErn15TR=&+J~Ix) zE7aoK=$sq2?!STsw)|=%vj?t$RL&AD9*ZNu9$9ejHu+%wv(f)N)WM$7&XCH-dO3Ln zED|l+i*T=&)$%8kJ4lX6y#0{kgQ?e8p{|gRhK;6{Wx0_$tXAkC$Yl$zeva1LUd4xJ zTGX5bOUypD?0QymFM}mZmhlvclc|3JTemrUVw$4Ld{TL?^t6PW{6ZDvgo`Yy_-R~z z7{yv&IhMq;)6d#Oc337JbWGM{Fj!H;uXIh{VZ&4(XIcNv^fEZ$u9#-zkzNeUrnulS z%ESZw(4)Pvw$-Y|0#?*6WvrGO0*$43i(WdgW!Dy9iJ~jSgFOR`d8+o8OR0f;#tJ-4HmPY{5!ssb_hj`+9jS&&7&VvKd3daG37m3pSijpPqdoNnPQ+! z{&}UD^c&^sw{ExJplLqDKem`(_Itp-w90$Q82+}STu_2;HG`84qO`6kHaKu<&&$@h z5f4k4t#e1)RxxNS*|3b4t5SqTR$GKRF!8Ojo9yr0ZZ;%62yadY#VKODNCMxu5I*QJ z2N^jJb;M)%U6^j)sbf|1ebfgORzN`H(YI$oaWsv@Aoon@nc{Vc2u%b1Os$qoEZL1| zywS&Qa#T=VC?un$26VPs4HsprOI^*(Ng^Xc8<0;}JZNs)UWG%3L6zs{O#*`UiGicgt@DYn^C^Io!)a?+|G=97^IGMf;EQ@}le)HZXrkuf)Fv6BP(w5CQ z?m3#82l18-*?SF8={}Vj8G3u;@>X|!CilGfk4lcsJ3~3{uH-N=Hb?xu$Crp12ix^Z z4oLe1=C3kW;L-+1mrkua()$ajhq^xqu#*IUiePMWk`Fp0m(ro-R`qE)=n>jUykW^9fbVEgveN7d*JETi0ZuqE&GsMSjfjnmp(Pf*Em-@fzc9CY?eNjzb_`%EyvxKIOnp z98uzJ8!>h(>$o$>*9iv9)G>oU(R;(HruI&W)_k+cr+#u$V8aE@mPw)xnv99UeK#F7lhg+iqIwMu~_7QRaix$CwZga^JRW z(zuO3E}HI-r)vS1VC92LfR_4&`=Yu2TM!;^OdvV(_L+k=Il*zrjglTFB=)*1RQ zR@WG?ZIf&lY2JW*1j2%k@Slw!Z|{Ez>cUGcXKVBp8YSGq6ndSj>&lL{X`cDy28n$@ z7CCh06F*~$DnwG3JQstd^RCIEWuLi)4l)er3N3m}eFIw2Nqx@MwG>@j?Q@^~qc9A? zq~)XDEw45JQVCkGRM-2sf)er3W9t{VeTloNeMi3Zul{L1)&MZ55YBQcwBTzLEfbt{juxh!AE=hKLg?p#sQGGx#%ma)$}wi^%ppPbu=^gv!J(w-fKd^ ze}waYoNyM>SHr{Y(EXyY)5xVte0aslnZK}|I)#+%$oh1Lmic*ph;QjEy4SUok?#Oc z4rlcFn9i3U*}o90h<|3Z?GBveb_m>pFtqo*)F*CN?5GVdNvEh`x!sGAkugx{EL=Y2 zCw9{MdLCijKdfKiU#+~)=~AylAhUJZ#aZKKyhj=#K6F<;+qXhb!e2X`o# zrFQpG!L=uY)i2r+<4sO42rI(YqQ&zZ!(wwGHXV!%6M1XT%g%QE&XOdvtna@}_Z;q} z=dvnKPy8KHnK4Iv_;Gr0C+u`WzM?b+E*Y#7n#(WI+142a@VU~#ZPU4^=k55TR@O;B z5-SkgYgX53#$oqpY<|#Fcv2U!8BTKI-8y3Bx)9CjF;|0vW7s6XTE$W?QN`$B4B@`h zrvT2(g@RXcnTDO!>f0?Y9kb3vO~tol()4Z}%Om%cHR4I*DXIU^s_!wQk1`U>8@ z8}mWuTw6yAHQZy0s7vz z&lZ$vA}=0dlTitIPM5h7g|woE`JDR{^qn~05jp?Ww&hL>4CZ8?$m?y^WoCO>kbTWQ zy9905O_iiS+Ab~X`d{A&+^in4Dqn1*hD~1nyp-);**U|*a*OS4HH!wao-HZtZxOh0 z-U{3*-9Fjm|Ku$eD)IjVGBI?nhCx+!#gx=454HqUwQh-}5z17>S%))3j0;v-=1jzF z#4vg|-Kt@y>2630w(XhLjhu(o^DoN!oo#-|h<0<>Nonpym|4@&tah}DQ>DtF{tAwn~%$3#DZ3* zgDKAmi>|Z!w%svI4J~9r#w`G9A(Ne1TLa&@XEHU!iK^2P_^4)<^e#&4l16k_y ziBtQ2xrd*u5M7(gsiF+EY;nnnD5`ilH%5my%gyS?Qs-(~+;1^V5B`Zos14XPe7{dgSl@9u$I?p~U z+UNCFU#m0wo}kk1p>UHZN&0*wy$U614t5M?uM@%bP{h7%M~U=d(mEFn zxx$LKHAFGjmh+ybOxYtZQK5{7_Fel^V?JAWZ%8k1OlV`>tTR=G>ZTpszPLr0F11qG zC%{6#?4pW~vn2x$L6y+@Sp#q8l2rpG-a9ZGconLxB6i7j)T_xzY~S%0gPI4<2FG1& z)%wOgQr)(fvZxkM(gUlwG;a_eQ3RIksYcRhE+QC{G_VTHoj!B_0`#Hu*b2VpehE{9 zQ;}ITqjQ;qT%lel*1I)IcVOEYW!XSsbs|sCg1iOPe4vswOJ_xSC-T}3eb#8HJINqS z#(P#_W32z=YBtQUc1kyEE0^8PG*g^?(^UL(_0+y&g{cSUBhAaY>p8go?APfmS&h+07_FBN~ zoE&zm_fpfmmy@>df`8(iq04+pu^^)?LGBL5(3M{derUBKrmN~$t%#&3SUAMnWLD*@ z`2y+SmqESH`hs+z*YiLVX@58Jo9i#M7L_@az5ci|$V;Eb{wD?pbNT-xvI?)%+#ll8$sw~9bw1$EHtpM`ZXm$Aw^4J&nB%I$NQ1t{z~2s~4_ZG`=q zi>Vzuj(MSxZ%-h4)DqlS_U*zBx=cE12lYu&B8&6vO0eOC5TS zy3@mvG*%Z(5MU7&V7TC?oOr{zhqA*PyM|hn2B&usfBamL>%r@_ssn3d^Kw&6n30mwZ5B4vuq zhNLON)!pLdcxghhD8VdJ8#@CF z1C6xYLx$|xJpcWV11e`Fq`=m8I!kyKXR$fQBAnR3Ah;(El&h{cgtE4YyhL6Ts6JLL z8io2YSha37^!FFx!#SqaivIa;&E^j2%Qaj$*z0xp>U@`(gvtm;UAwqkcgUyB;WjeF zV&mvym=2}{z?v1d-2$>U^?xV*K)uwX9k%WgepLn>BYQEH8YJnE$A&E(i$`kj@(Y#1 z2^-|R4mM>Z=m?n6g^E;q%uQe_PWIGJms!X9CFB_B8Na}NarRB*Yd4vF&-GYB zrZbpQieK=%Wlw|w7!;Ajs{9>{Rx}{2!)&y+;Xh+)@Cp8>-?K!E&_U_VC>793_3ry( zMBlaFUR+zi)j~beeIH0f)6eN&U2`xgv%wgqwC&3%9+Zk!B;rNN!u`UJ$aptpK75S#!O+XFDn zRZy|r3rNew@0~3duFf}RZ}h=iMJX?$$EQ>HE6Sk^8W^f2H}>V)b-@ykgxn$)-W@|uBa5lfe;()dQ8=OJIPjuomZyTJ4Uz#5Tg z?!qlpoBOW;Yj%9xVGZKr5*__KQehNZ(Rpe}2j~VQ z^3v4@qKiRD*K7e76o8$uEx-rwTfm)^k09P5E}S=P9nkm|geeW0O@k_FkF8b!o}(a4 zVB8C^yrI%LnD_kGwIu)jxo5)wYv>(5mpm?*|EieUpcRK&;sN@ws(0>zo5P_#Z@l`x z1xzng=KufMpIr$GKP8|zQZO;cX?SDYJbHiOHZn&_B87jkBtOjxzdOzK*ON$lRgXrH zqpL7;w!v#DqDl6nrX7nHlZm8_p0v{rHet^ro;yKT7BON~_%reBN1)|xoa1NGPA4HE z3L=Leu5A6)aB<2M$MDYqC-R)6MBSx{ZV*usk?pmO)8qrZJNpJ~JSm{`jOIs8RMMPt z?1>r<&?PoC-*v!Lm9wX)TBQW(JhCdp!n&txu?fYz@~Y@tMW3L3C>3g^|LZYs7OD8P zsb^(Tp=g;W!GFIjpYduFKX7I-i}R`WRo$)`QqdSR|0)x_TuS!tMAY5Ihb6FpZ3K1jfd_M0 zHSP1e1%4l}V2{|xUMs)-Jg7T-@#WXcI+4WBH%u|!%b_>M-~&5ZYFDdFrBoe^1qOn z^;O@1V*pj2@!kc}t`yO3YaISZ0%F5D@aKk`z249(2*$vf&P-~C;2p*08E*4qf-1Ou zP1X9@ho%dYQiyY9Y(+g1>lS{`V};ns%r)2#-PuGYjsIAN(9ZxDiZ)z(k>~?zet)nS z{t_vb6~m6Ve5iF{&&!<=PBz-OqCpc9c9(VSz0N2+S}C8OvvIh&B`=R-*XiqQu4Twm z)#_X6es|fJfK%%1?hAk-vgUoM_#yPRGT7CkOr4j4?-ZZUj*PC9WkgO`>5e{nq*7$l zsQ6hl;LUa5pXx+_cMJ7xHP>6oQ+5x{nW%bjv31h4xcg!Xnf-L|er>?AXb{f*j9K_f zsAq?$UQ@CfW`a;P(v6XZ`J%&&<;NSV%Ucb#0q-1A-eKNc>=-3eFg3UqALlvzR@GzJ zx`QP3{%I;L3RMW*E|sT{zmD>+DuphHI*;EoSJGqWdk;p!PVDd8v8qZwTg*V(SkR(S zaP#Am-K$dXM4I(k%`pp;+TnguKLIEkvV8VuMW23s^?mujqZlT-xUeTy3m8xS=~lZl&9{ z84*visp(|5-tkd4@C|xYF7W%Keuy`Sebl7na7sU1H(Ueosw1X6O^GftAyE?_M?}fX zL9`V0nTj9&0MdFEd>5skq&R2t)iXyMa&tzrS;V*>_gt9X23O;5biz$_UYO)+-3SeE zo!K+o5b-CHSHWu^+UrIpt9k@oPBjk?MM}J%weHgHU6l}WG`F3W@ng3%vx_LUV_aMgyt`$uQocDh6-Jf_-Qv^emIWk(Up6Sv8-rPb1On|~(NQ{P# zXJKsANj=7rG2&~p@5ouEqPCuZ6|QbqI_wlZPY|T$`KN<#*q#v6{N%aeKOTssNm7-%H8I{xHmlc+!@fE<^Zno$hK~6rAV8l(ci}1f`I{Zd8?(@%YN@UOV9>lyvMQ| zD`$VQHK^hz-m-J>LO#u6W9Gk9KR{scF(VTQMUo$#ac!HuF zzJ0hZ^)LI&lpAIG6?NV-u`t1M_2-B9F45d4#YXjjd6-3=&{r`wP~QHMw!^%6xwtFy zG4y)cy0Xt_IV;Pd%*D5^c=6&=pD#roc82R!)9x*MsaItkeqO$_PGWtJvLp*#0cZa) zs;DkgUJXB(>_jgCFM$HKwtg1RLUH^)ll%TvLdp%Z<&WJNb8#fMOF*^5e0~N>dR`d&15i6D-(ngAmzaq-3nHng_!>Fl|9b0G! zA3UH49j?4-xGp75Yc*w0^xO z$+@h0y0=~!J{p&oLIW3$&c5004K?tCrVBU5%n(x%(;J44UlcE10qE)i-i}7CFZ&@| zA6T6j+D`K{)2k^hT)1`H|DG-US-%CFOs(uA+oE^evUVF`csRl`WP1h&mhMV)oZPt#7 z?7V||_Q#Zy!JqcdPNI(EaXCIW%czJG*!38uPsz|EAM2l&aYeat4f{NM_gdj4)&7y0 zA-;L}&bSTkq$WXms^?p;(+VKaDI!t;#GZF1~sYyw;B6C+-XPoAEZzZTG&g zpwFbAtY8znW$%I&jQmkEy0&DBvq}qfuN@&Or|Bi4%&>))ifdY@9hw^}J^r%8rUk4! zhVA21>Yu3aJuau=HxGB`<5!JLJ+$^Mi8kIcd{=s}{QZZdp0iBW;OL|_ei zqTSA9t_SZ^)&EjCuBNO>*jKFq-qY6X(&%H}SwW4LBJ%fkw+_E}fpSX>O za_=9^bQYGztS5=QOWNr)APufTQm}S1U-`l9W%n4ym|=_{Zm$T zKc879%zpcfuqTIx2z1i{@7RgH+w<9si|pX_-~Aa@`+gO9qSRl&@6rY`=MifMDh3eR zYA%FLd&kh}w1N&FBzgqf|ua8)gNqt(v3(<1}kU@%4KG^V-Dii z533VifOgX_;oqHdo{HCn*nsFmxAyc;@g8`2m=fBK)O17$jpp9fNeBtLa2FVEjyK(O zS06YfpN<8IrRdpEdK_jT^>(ldVxbPJ4CAQjOR$hX*8?i%0XJG+cB z)fBeXl32bQB~2a~WM$!$7uX^V&??20meaDJmt|T{pZ2aatjTLze~49EQL3J*D4@O6dfTc&Q3x`%){2UXRzWR8(jo+82!lWfBtfen zqNK`EM21wUOc4TQ3`q!rLOBSLAu>b=5g`x)1VRQvhPyv-;A!vqeeZLg{>!kxot-_b zcdvKt{jOw+aGf@yZ)9YHfOp3u2?wReT<`GS7`c_L;?8XRW5-?XrKF+`3743M-R)ZD zDc``lT)}}Vhc#{winsqG-MLeF+Up3xQ~E4Raxq zPm8_-kg_-kLL$HSWpwAnlJTsYJ8b*Xerj(`QI zW7Y3IKW3|PV}G*Z+YKZVLE8LRSm)yvj5%0;j8cLt*x=!R1M4uD4W+Q*0)B6uU@sZs zaxP_slDk(5_RA7D09B2xXNRx?zl(nFyVe|iM&$!8C zRz-2;5M+HK9z`=I8r?)lj`&SA>O$%jfd366py(0Uvt4@?>il%7jE=8jzLr#8|98-mT29rhM; zd_qxvi>)RXqaE{;S?IBh*MnzjAKeuX*}8$mv9Rb;yi%Bhot;s*sX)!teyEXG~IFRz4zG_!t2BAgLnM1kn&-qdjIYvvcO&GCM*4#k&34yXDVu;GZap8 zWJeB`(kX~a$3Gz03xKJf@ck^^12)W zsM=EO|veRVTSSxl)H~M3d5L$nJ#id^Tej>|2 z>82a&1mNhnZT*Dl>~YyOU$N7T3(H%~wnSBzbwmMTqR4-N5zZn>++c4B{1K%=mBc7o z77I>?oO^DwzPCqsLZ|a71wh9cIb~RZsm)l3)(UPkJQPl(LkGxu z!BcLR*Z6pO;7r*>=WtO{XNzX_FGIGqAqXG^Y|Fo?7~^Ool()N9C0q=8%xiOCBkX(c zHzILJ(NX7l%B0}EYljm|C-^QF0gt*uYSvA5H6#^#G1FKYG-Tj8Zu3=4H&(e?uys5y zGkrGjaeGs%spN$*v~|D-*WJKhPL8o=CWw=UjG_wo(`mS<34v2&-6ZyWYt+l=Fv-SP zpgg-G_AxJ62o`-!%YuF?bBNNA_kVj_m+i1z^0oi&#Ck?uI}p~E$~!EU)d4M=2Jt%l zGsF1yRYl-hg<1S28{+3bi9&BMINE8xAq`&oU2gAJ9&Q@7_`yzD=O&e|HVtNo#RUt% zh%heHo|prp(H!lu@R{0fi4SNH6zzYNkUj5o;MoTI8T@hW6ihpGU4O@Dt>LS%?6olX zpctC6zk-h;>D3+I&26~ZCcctXH^=*$OYBe1g*K2hqIIywLQq?LaA3rc_{#g=`IIFN z8pV5`k`=7l|7Y-#*P5Y%>T77E>7zY@B(N^){=fK?(Q4{CDwZ&^PxjE6Le&nlFr{W( z6iqei3VX%VR&UVJyuegrKbhUmP1AN4i?T^-W&|@$*H|pdqB(fj;U;GOf;_U9gQ7aC z^lM8#yOE>NfKvhq@jK%F7vRB0J)QJ5Z&T(|Rw-{YTCP~ZBa7}QWY5c`KhRo-2oC-> ziCGNhOl;RXHXwhm_K7z~&1)B77U8YU!86Y`&NGuO(3zQ3Qgk0p#{=}kV*hAn)!6M$ z*Ez^pVP-zW0T7A)X@2I=!Ce8eyp6wxE396V+5YUID6I1+Uz=gUrNw)-H|#j-ER6|o zcU#TADc8>I3=LI1pAikTdjHTCj>*UHFs&-&CbomNGP!9jF}+)8$5Izm>=B-D;i6bu zkYvf;Gr`tDs)n3=_IY-osGFQ|mmRQi*oo4oNLj=`-5cCo#$BO^BN0zInly%@l8z!p zLNND>Y|2?2Soj@WERcZiHM#K(b&pZOP#mpl?29G|Joy*%y8nCj7fpC@kqZ>(&czvZ-__GeZG>d(438> z$5&(}oueZfJ~x(y0c+c3@^(1_>T6Pcdk9l=#q0U`aI$MMX2K-NxAktyhVDxaiG7&C zY);SerPZzkaM$VKatQE3JBQ0h8hk08FJ~4DR}nqH zG_v$w=r3^-TbGsM6Aw^d4By5dKsWqxCme{s2B~lLMreSF=PzCE+9y#hEd%J!(lZ*w zzdH(3&bNlsXCfx77CFb|HvVd5^!(n%T%#MF9=(LE?Tle?{CQPT`Rmk3MW3yr zeAqVoTdu%wHRqOFgz1ev2uH)_*=Y$p3nLW0uBcw0@#UMWHxh?y%N)z)!2rm*p)Re? zBJbvQ8D{xnGcSwSX1kM!olx8*>D@CEq0>8!M%OYqZPFt#K~6L>8uy5zhcq$Zkuve@ z@|lb9mOpF(EK`V60f0m9yQLTW7}0W9bA(wgiFrX>g68W5HzK>;lRj`rDg2<`&nx&P~0#SAKP^;mL%X0gX|m&S4!*t)1et zk;w|f%x}6j2-{Xu++Lkc5y*OD9(}U3Mm}hZG=v$Jq7UBhM~aAz7$j)URO^?aFjbsU|ov-K_#*F@nJmkAW)aJZdMOorD1?cYF>bfd{x^O zc(?|$T!dFsjGyAGu@kRSK8fEBZW=kT&AsJO9EzizID=;22b@(0{o*1$2`~rE6un9u zbi}~@P(sL9&1+`XPMY1ZW;_3J3Ffs)wKG}jtD8B2Xy_29hK)#5trTr9>!)LEXeERC zXtf2TZwF?t(``4-{&dZy6jRC?0M%6shN%1G=?ANPWp~J~8D@R1OKR#UX2?h*erUB9 z(KkR^haVaV222#j^H1v2UNl8uLzsem5~MrM=}4OMK=8L(${_ z3ZP5gd$KVCGtZBhWQ~^LX@LC*d|9M;7g#f`QdDsE>))*BnXm)Y@UQ>#Q$^}MI38OQ zC2P7kO8IbI(svu2u_{c%J(Lzuo6v7>L$BAl?2jK1E&F*W?`6g(Wkqi6*9!3$Yze3Z zT5I$s#9P_5#?T|6zQzGhi=a2K@jKORa3v;hojv%?e{`G|PO=l$;B1v5Ocgd&!ln|M z9qLM0x3o7ApygMAP>i6X`)35a7l3$H(U)Gl3#=nD?fCAQj%;a+a*kgp@6Qt+vz&bf zvT@Z~1zrJT1Va0;@*A83tl7INc=CIt4_u9p8z)z&JmP}8`>Y1 zDk?JqCBO*+itO~nF4;0999KJR3~|yK&)u`DR9hayH3WES&Od{bWObi|&tNEr3IL-6 ztJql1?jsEpWAdAT!W|ag@@_6^pxC|;@8lD~)Xpvd!OOx9y&~<|SQ%nb9)ed!9JC^C;(J&!jm+nK%~*{orAYwz(sv z9lBc#lx9-#giOsx=jT(|4dxMF@Qc^fX==&v--b^|Sx0JrD)~Nsv}`^Bo-4J3Pd|3)6?-XjUMW>zVlxS-YYfN4 zrq}(xvu)UaF$)2DL+H^=8~bkfP}g4K)DiH2_I0tO3O0wa1yoet-kF=>Ia%AOr4b-= zpX}8P$lNzHz=`XeGjIVOn!{W?Z7x}3)0YJq>w)QI9k-hvwrIYM7rc5XQO(yw4;?%# zlU$(YQ!3X6&E*F~_eN&!?Q_qQjZ)_t@!vTp+fMN*zDgeUCIjIM=bY&<5c>cWXwOMb z#>-R`^nHZ|IL)@J|K}XnO#5}76W}|jCrCw0c}+D=4@rF2NEz51Kp%>INu@{BsHVGR-N7sqkK)dG3m!CGm!|R%dkJG zMdD9lFeq{nzVmSsfA{tueVaORtmegB3x?WKsQO*wtBmm%(jKZyj zx`7>5GQNlydB`q_2!$S{vHE(NF2Y}dbdjIrmSD7Y@+ZYZ>$q_?E+b=N=#16u!_Cd> z`WYN6=ch0&6C3VPiSrx(&{wA8Kb@on z3WA89ywvTaMhwCpIfBp2oW|79nbS0yv;FKo*>V46kJv~V1!UVi)eh&r)UxN%;nc); z9219LwGRJ!w%#kA*CtNzVNCOgj15mABvpH<1F>BDqJok(`_nw$93td9)~G;E30uOB zp3I1{6DwlJL^~w_{nIddhv##ICgR7tMo!!yjvcUp-h8y{?Tai}-eRuU4W$0B^KIDu s${=?B$+oNDV#)kVv%d?z>mDtM{Exs3rXGu$;lV!i-Ld_J`_PyE2P#08KmY&$ literal 0 HcmV?d00001 diff --git a/browser-extension/edge/assets/store/screenshot-2-url-curl-1280x800.png b/browser-extension/edge/assets/store/screenshot-2-url-curl-1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4c8c5963f6c7898cf375c5879c9f1e1e57620c GIT binary patch literal 30571 zcmeFZcT|&E*Ef72BRJ9=oiPdmI<}c{Bq|C@b;eOdR1{QHN>B$8F@z#L1uH57Dr!VZ zR79l42B9V(O^txm00BY|BtU==(v$aG;HdZgJnvf1THhbf`o8a8Yepc~&MCY8&ffbv z*AMKs(VDM2AA%q)+ueUTK+s(9tLpN3YTyUeSbjE z%UBKB37GVI-`&RoAV|9${$HgU^ZaiJ3WjX|`r}ZD+h`{)>zwBamQ-3TPiwe$ao_5d zTQYvj_0QNXUzzdbx02gFscu_#URnJ8YGH$0szYyh=3fOrq4)OYQ@iImEFWCG>brH{ zw=Q@z_u_KD6@k9Jhz-}{Ag%8b-Bs}_vax`ex@}fGc2?#VWH>oA*)#jtYj*sxx-2pF zDY=wAVi`U?f=f1*2A`f*kZO}lME2mHkk_kh?|}cFP6({`De4NM?)~$(2XuG#*IkJ! z2Vjy_wz__5+h?d(c~vZhR?mL%2haZy{#W)y;~|Ssj!U4dKc3TeDlKy@3HQe=)x)We z{IoSi_17IeQ}%i7jrIYA5*NY8fV2z@PFlbr(*&Ox-;{~5nBFU>Fh<_=S+J}II%?g( ztLIr6;<^o_WBlemdxOm6kiowMBQG6ihi-T(IT#`EIV2R=B)hfVrHVzbn_u=Jcj+}5 z$(FcviUH?)nIO%kWL@&x0N(ErYl=ikfPgBwQMrfrQBt90;^h z@x1(~*zY1j&HJ;3f@`6-_1+K zZ#Z6J*KECNRY%qypER{nNji<6DtKFI*HaA>Kqk-d8`@>@>2(&tzqRM=K?4$-)7BRY z6kas=@e6d?etW}5(|{?5JZs&qO=m7-#;c51q`!{SqqrSIqNbZrFx}OI1nP{@cVDo$^z$euJ0;|)J-E%b~{dZ;MA;c36i`H0tO1tj_y z@LI1)2ZAO12&zUsuyW5lyB?wyW0Ouqp-O|DS!J!d_hf?-f6o^dMTjeBa~Coi1fq0nH7a}nC7aAEKF zF`SU%I@7~W^7e$xOdt6`Pngho4Wn;0nc#X}UwWQTpsg¬f$em?~8(LfLDIU$0wP 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
}37jw>==2BiQ}9$>Hl`&-pASk?FM`?qe!Hg(MxS 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 Go&Og&lWLy; literal 0 HcmV?d00001 diff --git a/browser-extension/edge/assets/store/screenshot-3-tree-view-1280x800.png b/browser-extension/edge/assets/store/screenshot-3-tree-view-1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..193def163195650e9cade5cd099c43934ed4158e GIT binary patch literal 24732 zcmeHvc~n!^-slMy@fJl}d%*#S)mCd&B3K0(65FcWeoj?e0U3fKqA~PRiK6ar*|qC{m#6(K-K!X!aL2oREx;pDuXfVQ`9-S_=<-~HaZu7xY+oSnUY z`!`Q}pZ{{V_q?~4ybVFnyf6N?bsq#-g8$B1HfJ{YAYJ3@!3QdKpZ8}_af|&+@a3(r zPj`I^L1i>+!y(hqzeNAdFBXDq>P`PpJi<>$ASl@Ri>;r2l@KHsi7pgs<2v*PtBmbd z4GSJMqpU2d$IdE9F-|RM=eJs*&crT0*`NJmaHs8)VC(n1%Wkb`^!0V~UGb3T-qCO^ zWQFiom&<40dS|i4`Ov?txl*?A*(1m1i-V#3JQ&OTwUy0e4kzAAI)N+DF;28etI=D@j$snCEEoAsg^RFG`kU{KgK~toaHFDC{2Eb;cNuoNz^!v7&c00 zW=|Tap*z8&njo$rs@4wAaqigbaOPG36fe;d%M3CKgN|1HV20z_jbRGD=i$3!i?|EN zhHO(r3IlUW-58}^H9eI>jZY9WQ5!y#E+<+ziY&&2RHD(2atf!Gc_8K)E}sgFlU!_< z->Kn#aGP8HWaK9>3(Xi5aZn+m{)X89ZF<921^T1ET%hkHzx=_~idj&YegZY+N;AGa zI7-k@gL1i;=}O3>p6M!=Bpr{Fso8bLk8j=bgE+=PdHE`a@ID8wM8nf#_hr}McM0V8 zOymwu{o(1;wGcA;!nFmddEpZ^NspZd{$*DZ+)z~R)uyEChi8V-_3Fm3JtO`Mh5Gkl zHAs)Vk(=MQh%$HTBij^Lf{1PCJV8~KOz-fZCf5${A@pI#_qPXU{?NR4Erg*U5~T#D zAk`VuV~W|Mg69s63Y6z}mOTX}>^Sw`DVpRG4L$r7EXja(_z35_Ov2oFzfSvy7GrmO z9KCKBEf!3V_;9GgwS{}ANPi(*&n%2cKa5HkcZG=AUr)cj7iT9y9YZa8VDaTNMziii zbC04vGQYjO(+`?m4qY|FvhVI%=!_rqU*=(}_uHn_t%W``54*bBx;EH0W%~C|u382I z9Wgz7=o5?e*DQaW-iu2pYEjew+-1^ZPzib?yDgKRtZoX+(+&^UQ+2%KaT-M*Ctl+} zy*pt!G&g>yb!}9Z8e>!v3iAxLdx|JMVMf*7;ZbB2(&(d`ziWCZ4Inapu66AwQ%ac( z;kxv6l_ti9pukbC_`>HK_O32y^XI}Vys6gr^3fz&Imo4Dspk>b< z<7n7y>+cmdq{wp;dibH}uGHw*7mwOM;Kbc>l^Hi4H7mcbh4xX$|i z{vM3gB{LBKOqnq#UpdBbO_qwCd_Ju5XXy5%n%_P90uX4e(4tiDRAoFIkxukfaoRkL z@csg#aX8gSVR(S4P>v(f@i_5#EY7Qn7E2o2V=P6kPRnBMSAZq%uY-`sCCG5_>dIyh zqsZ!jLMO-LVKiNjJWCWPs3%n|ctdp^Sv=^Cov?=Ux0-SF@-~1g<2b4Vo|0WbPu;8A z7t!P)M#OCkk(VpZ-0|P8&^<3Hr1VIP*>xe;CYlxO4(f?%rrNy{@LrZ}3Z63BS?3b5 zlVL~}DBy9dkz@wu*H_eF5Z6%O0hgLv@@lK?z7*+L3&pMTLi`Ifp4!g=HF|KY$p<)nQJd03JPPB7xplsHKQ@;r%+-*Fg|I8> zIfsDm2=T%?1Y-FB!_S@`MJ+OEP&6|COlX&Lk|3WFI@VE~jG8j!Qx2CVB=*h1zvO29 zyfGZ*7SQB1KCq`S&oSaJB|7E&xps+m4Yo;o4mm=P!#adaPv{&rJt2MSP91>K5Bk|J z);47Yp*8DZQ>6c38e0M&5a-eMcwgt21GJxdZq_6$ifzil5`92`khn5!?Y7z0wPa50 zi2=24ldY4U1Ap4pKfZC~V9ABc4m_!!3Gf87nkk`M_T1CR+gg#rr-u(8LAeG%Hj=1e zVt!hX_Z~{LN;zCi z>1sa!;LlDFcLG)fGO3dfCFpLNGp`)7*MF!B=a$H0GQYsAL z^D>?6)CYH_b<-O4vE!_$#B2`i_<6}CT5Mu+IW|m>lkRU36C?~t6-I~?4+#|!y#8$E zrt&;qR%9ZH?1K&w!a~;FeCh-DzAjo-nyP_7&^cf9ns2wGwG1bt=IPU@hI_mX$v3<-!sGX$94+ORb!L$~f#e}RDvaBZ zC?|vu_IonnT5{8;GF2=N{GUA?2615i>vxcZ& zArEz%Qt^-tJ-_-KIy}LjR(_31;*upC{UREf-E^GSFPzv!i<2u((4}F#li?$>!?CDE zF>>$jhRO!Cup{zfb6Ek;Lld9jnRkiiJY}FsjM09cBxc!*A``=Y3>dbc1~TL$Dt@s@ zg0xB&n<&eIate^X_z1sEq?lx*MS{R08eMPKzhSiT(ZoHZ`=S?BXrF{~Q(qfgLMiNx zrHHI+%Xk|UNm;GwJlF9}v8oa{SFSWf_(8k!wUg1TtBv)X>%3}j}O1MTTeE*W{$RuSnQLZ2_ja`x$WJL=f;6!km$2KqNrd<+t zXvQbG#k1+I(v(w|40B^6kXG3K4-Zkhv!PlZs~|~RbOimM-l6JUgW@w5^f}aFA|GO6eb7gX|YR{OR$_e z>9Heam2!{ahNu+-;};E`Iw=*_CG^qZ2ZNUh@^C^lzLMkwe3;w&A5Cijk3q{|#By?5 z2*XviyoxZfP2;Cj)cdX2aazTzkW)rZjwdukg>YXqU@zo}u(XMlEIVyJ9sflK;|4SPWOI$-8yv0%YnORg4%edUB;yd3`Fv~a72rWX-69djI743xKMEwj5XXmVb>mv_BT!fWWy(m9+CM+|)& zO_)L}j}Qxb1-DHinKUDkcMw%YxQ1%%RLmRYU26@5f;LvpsnIQxVFoo-^B2-&!<4!B zF&f6Eaw99PW%Awd!rsUcD$c1(S-Bm%r#`gaASI0`tK`)k8aZZ3GPgiq`C>eMlXSc} zG21)MGapdvrCJ*>8iTZSNh|Zet4f21sa|-`hB_QNpgxe9ck2;vgTYr6$EJvaS_H<4 z`%DF!s!kBl0F+;?0S?L6b}8$0y%@NzhjOtD3Ls25yZh|85lH2TM;Q+OA2c)RK53$c zDT~8D_x9bO;xxx6jdQV?(lm~|hclnfyT{je$Rm^Ofk`awC10pY>oxHeEomg2E5QmL zI%*VqL-;U9v!QR3`ow_80SR)aSNRDA9gp*lp@ofLBaIyHy{vXoe!gIEydU$viNz0^ z4e-TAi?Q*bztKdQ_v{+`2^-+}GkTAcIKDV)tOFfanQ|?0=`Bn*-))Acvb()M4(qAp8qd^3*xb58m zLwrN#awfK6jIVJvT&q9(t5XOqF=B7|F6yThGB|Zdb>zC_bd%ms4&i?)=;$B9wX1+O zyDSUc9UB#5VtZKy7azjsH;}6g0rD8c=|Yuy1rS|b`3Z7ayc)5JmEGLT-`mr_SR3`Q zQS*|Vrb4$i2zO&0fmMI`3$XVG;!xK*?>RwwDmFAW@xDY~EaMJwA{wn#&i%ARu70EM z$uv*AY^6fKHH6N0R%mOjtZ3w^GQj$V&5Q89^BiRdm14@&IHQx=xrqf&({KskD=HmG zg#S{_p{Ew>hfMaH+%-OaPQc%`fqu(@A#qJw8a59nK3k_MeG#%7_Zpz1D3c?TKQHJb z8cWeh?wGL9jYQ7gQADX1=DKLFX{JVRl-a358cQ2#)k@?1rTUzx?xPy5L!uZUYN~su zmsJSu&`4R(CklBgn)+l6*rYLa>a>yo*rJB;pS~db)n2>EQyHdEt7A~hSdxCjb~q)2BCR}x|00!#oK*-pN=)!u9M!K=3r{B{CxS}&I z`pf6j)KB=9GPQ%ce#(tj|EFL3K`ngXMa_h~W<1RJfM@mIcmrI=OSHF5(I1%(qhE3O z`VD_tW167TG4$OT@L$E$ufE@Rf)E}7;k9vfFG`Ao0uY1?M<|L;oMO@BZEaFYqK2%X zI#n?H*(-I;%THWOy-uUdD0W(0R!ebv8}zZkvLkjJFn0 zRUE`^a_HhVt!F6kzGe9%dfd>?wUb{Kt!(1)GxD17<};r&)5z%g(ko$+}*OR$xj zD0swLPFPbqTi`vwD~v5NAvqPe&(jf&0=phWxwnYMC)}l;l`?$i3H!QyYRf$ zu2#_gfb8g5d298{&sNr)=L_HW5QpEy4{Url(f{s{9CD5R zG<5GN5vzFIjRB<}YSO95^PaMcFKut69vjA>suOMq@F|lBGG*Pi+b(aP(ksP6z#C>=>_|tmY&j8;6)t;X1xv&^j1fDb=TWVp?}e)QN!JvTDbG6$=Tj zve;+bqO!YU&CQoMx+)+&Fms`RH>9VvBQ-f3TIMcN(;+4y+(1ze@{hrKuNeO`(uiTK z3ddbYU{H$YMwzlt?mMTqO{c2#VB1$mF>jeODy2snf6}whDhv-8Uhal>DH%YO#8x@~H9Hz<@BFY^bB%l$SyFq>JYjr#dHc(ikvyUY?*l z37tHgn45H3T!1+15QGIgDyCxFlhgA@H4V~34L3vjl$#=Wk-J3nVli=lq^Gx@Bk54O z`29xCBQeDrT~zV0SOP3uvTkU65@(gEDrtQw3(-pt3k5IIdB1HOcTSaaipKSuC)@-^ z?G&7+&DlkAcDm;rs+NbLc@R9vqwE701r z#{KWMzi*cUD?avQ$j-tER|rD=R2YFVemHJQ zTk%yL!Zb|WIXZ1K{mNp2a6peeA*Az@oV<%$&kOCT$YOlvLI&e$4&&wZ@%VmC?35c( ztf*#eOr(Qd`cb*w)XH!tQ~r(yeCpB&>)OrKh0%BoW0<4N#GO*xMV#WIORM+5Plj{3 zy54g1*P{|appD8d<&?uoRF%xKr>C;=6K&-g1!b7~qXWmyk;=SBb0(oU;<1MbB~NJ^ zS*BeMDBVNe-!So-gpn7?K@FptgXNODNI?28vdT(WTdBY%cWbg+D}|$7YH4|%Z2V5k zn7sWuDf`d+l7&pd-jetTlv@lMvxJ>{>1cQR5Illwc}gSpB)VwhTUFA(1MhdpKqM=41knZv)$sP!p6#XnGJO03D0jGCCzA24NCCP?C@=YBI9 zgTDXJy4D+GYbANJ8O)Y}$exU`OnjbWfE|HGwH;_=q$>5jk zSw#hdqI^GevK$jxtxND>xRQ`&9r_l6@P&%;7CmdHpz6^(ATdWFcZbjT)FP;nfFRQI3Wo z2u-3$WK{5^!~x~~n4*Z>h49&%fJ~E9AQEV-f<|<9h}Lzs_5CNNwDMEx+rRpAAXd^l zn-fk?4Q=cHp;-~Im|1ksNgNM{%)ULD>s0CZ{`U;K5I-z-D3v zV@l_kw5F+?CQeb=Yz-0NZ7>Fm8oN4-abBd65PW9XywQGO0L>~RtXly#J!OdJBM+oR zVTDUVfQ*0ETwUlhnfo|%{+@08?E8>*ua;47dYpL5`d~$iblcDE(Kk#LjnK#DlzFfZ z<30T)6LakSj@h%O%#$3p!pLMCpTHwUcgSRqE;nM%))K-&2uOp z#TeWMBvZ*vexJN(l5TSs*Pszmz@#=N5X}7owN25C;(XcT z?V`2<*Qojfgl<-B<+0+TCjet7$U#l2)_g9Z*n?mJXZ_GzoQC(s;vCc!$Z} zxP#T}Trd#R?qP|9wIQKyZY*0pn0p4Px+A-Kr?}r;p5cm2)uZj##s?Qu$CNl3?;8-A zoQgCl3l_wB>GAWN=>8%mykpHLg4OTXkaLZVd{R>BZ>Pzy1dSX+o|*X71|)Dx3$1IJ z8ppXo%j)}wi&dWwxPSQUMsce|uRtP8AD!l@fKSe$o;UG#uW9lcXmZ65TZbtRCKgoh zK7Z;b*>jrl-Fy1I!C=J8-)3|b#qI!d)_Lt;VUPBJeEZKP}8`GlnUJ0VXsYF`>Z;B1qV{guQcjh~75B zCuW9LV5l*rtkZYQWgYHwllc8MJ#9QDMUVOJ(7mCD-^s3i{w-%WbK5Rz;;bF!YN#2; za%kYIt(XJTu$@3Xdf(SnDE&9QVqxiI$^0U*_6#!CL?icg7Ew8)=ZQGB?!qNuvTEs` z63WQqUj0RpI*aeMv0t7SNH&Ok7+Nu3g%}dHVGjHplrJ;(EyQu)BtPbCdcwrLwlD!w zNMx(hf&}4;4La$nWjc4SHp?C+Vz|>N?eV7?cbvf?r)hBKuzx0DyrPX?jC3kU@`*j$ zlePQ)Kf$fJr*8n&hn%^UPJ`gE`Y_$qgK+JD_S_rX${$P3)(u z#2m&cKV*?GV@)d>#QjlUm$b(1wXRK*6*9&sePnzGj9vAC&b)-wyNPd&WnC_wz}=zUAnD2Tj55gZ>mYGqkkg^Hko17cJ&^dlWseT0!1MMiVn4fC(wbyli$CZE zpG5Wso$3MmdG=IcE=1a7y+)or#jd9&&9b{PwDH_|#e4Q^eHt>zAxPo5p@;tkb{Y8G zBD$$Zo~#H#E!tlJrXcpHY>7C18X$(!W~|+QIJ4I)*0mez6>qTu{vJRgiov8A z!s|gGDSg+nr`t@_3J`ZlC6DyJP{UW@s44#f9G7&2t*Di4?zV{T>py62F}N`^o6s)B zr#;hYY2)QbXjG7Y@g()V1ekIV+U)~2YgYlWSmH`}ih%IfL7#tI0dGiS+&Nl5-D2YUBNMYngSeF>)6v=P?&L(y0IHAIMY_uuid^t2`cT;3c@) zy1`o2jv$e=Bgw7$5bV}>PD8hqB16J7n}c=^PJr~)|!2X7L{ zhpMUfO>|Jl~__se?c`M6BK&&{~cSdgrO&INP$PI!*C_ zd91WhI8iCIJ?U?k!bYPxQ#PNO<#P2W=BywP+gA#`zzI6u_y-&>%U_;U*603W!A+og zw%FAD>t30BZ?KbRMs?ks}KvTrQ6ijz+GT>(mu%v4jc4dcXPt$WqrlXh(I(exbeUPNRw}gK zLanp7B(5P}vnwdxzuaNiU1fKA!Ap}14DZ-!n%~so(hho20@o8*al|o;#cGw#+_&b~ zrw2^)VDms+7n#vcqm0;DU9j&E%qI`sYm+geR2XOA1FZH0#PYLC2^1-Q9j1IxjC{6O z9iuRwG2Z#>b=lQ9slXabI@{r)qtqL-^iu{r`4;uK$+@sHIs2fV=cBP($BJoH_=QkK z#IGEZ?wte<7cVYXa9m^ejp30uU-B^fji&pt;tysv5;FHDryk6VHKU zHL_|ZwwRdfk|(>mI;*(Vz37eIT$6mkHU)8wmN{@`A` z*+@>OhW}k2@c)xtT>ms|C=CgKunGF!VdEKw4{_AXS5y;=?m2QQwj`T6-;pIkr+w%m zIlVuWGwb{B7ycD;VwqEJb^PSe_%l&t> z6bE3eJk9|Q$Imr$_`_MX@^ZTaBI?(k4Nb(9gH1k&^3jxamP)qO(|OG@Z;T(EX6ugl$(ee;?0KC z%4rE2M2eP!2`FHd>*=8!2B>43Ma}w*9=`}0QMb#J;Y-&)2C$A_Q$QO->58K1P`Lw^ zyTO>Zp?Dc(@?#}++b0r~Bh9oOwO0HwfMT&-3c!lj)HhHthp9nNdWU}p)(ADNbH7EC z0X7U$2&`m9UC#wnind0Z=d5%HUTgxiP{|IRcCumPf|Ssx552a4r5nx5=PK3#Imw7Y zbp%eqnAy-^V^Yd`2`a-`f;#cUUE&X95A+rPm{({u=TFmt_Tu5kZwAjG_uq;QuWU@A zSU)fwWJIeTT)}a4Q?5Fy&H6pr1*QDk9;M7Cg zI&0AS2j%q)hpMDcr4s8cD_40)h&d8zv-iBuI#Pe^HM*E&cN4&P!lQu@Xx$>`(PTu#n5=d7PnrrE_RC?`~6Z|iNCk(9Z+ z<2VElE}_X-Rt|sa2U$4J2n=Wn!+j9J+G3xWZ6u~faDMAH*jzPQ#PomfqU&22oK=DUfPpF3b%N52Q7C3mm!8qDpIEa} ztl#_(&@M#2!Bex-UWf-V=M>2b>2@)-KP1A@-bv!P?92994?dOZ(;td|Xx_}(oLX{p z@z7Ni@$N*-I#Q(FXmYK1{|z1}yP{grTp=Gk!Sg zFv@MJp-JmhZ=aU_UC!YLaLo_nTXdSfqFMqy7)1$zj6= zv42xw(~xnGY*Ip;5PW)(GkXZ8bXG9vdS)mp{_!g{5KXh}8M3aAwL>QGh#jIk9X#SO z3;t+v^hbX47g*&gP}a5g&>9E*=({PlyH9e6?Jd9UKZ+TwH0loz;B*n>WSqs^2ajIQ zMgmP)%&mj=o=)@MhH0((n76Fn>iPb@<1!m}i5)U$Y>eoUwwN#`a)xTvakSRuvgclJAsgb}kH9BrPb>5c>$vZv-3Dd!POYrF#(07wj zRn23irF!oN=M)_6GsG)=Bj>4&|KK@te`3G))vs z^q|Sg?e>*iMK5SG6v_>nEsCY6+1!4i#RA`DGs1r*0J3;5Qw2SxaONYk(vgp5*)RNq zahlPekDMi`IQ2%Y$Ps${2m5psHRsDc?X&(4Oz%aLNqnsaAQey^e==ro2LI8t|5I%E zh;=Q5Vn>qP3kp;Ih+C2VMfKI27u9w_eqKtI^mJcMiOMLTZUkm<&?EY9gUQS$V$b(Y znpU%A>iMhH9JhHk3*;c0`P@Y!1OZLz5f1(6bk@~vOYQOKlw+A%8~e*zv6Irl?E@wJ z$#n10LzKntGqbkN%od-esC_?6kw2X$Tw}8!dWrqAuIbqrjU+3Z$0S^{S;{P)Ur|Aa zIJ4GAsq{ zZlnvl&CG^lRZW`MK|Qb@>2xi{Y1&NyXAMk@ZLnX~5^6H+wf!yvrFMpKbT8a$2?) zDalwR`HJPT0T9~bU;ETPtSx`?Vkn1jl9C#qBMEt(s7U~hT~|!Xw?BYz_yorv`pm;NrL0M_t3~l! zx-z-&wPXM*x5dL|K^d?;Al$Ova*SuOJ_DFAtwUD~h4#bmVrDhx7!S4lfEm&#)Eqe| z)H*-JtXi=2Cmf1Jv>i1mvzfwWJ!SjEQ=h`&{veeaQK1c1i%vV#AWi2?n+z7%2sw-Q(+H&7^){lRX%dNL!RzaH|1f^cSAX@3r! zOa6mJwOls+Bq`#tX#=jLCK6%N#KeTPY zQyn`#*Tl6V2XC^?CJWA{CK6OX;F6ZUdhTVmawB}LSN2*Gk**|`q7W$i*^dX5H4Am{`o&<+G|&c1X~f=-}{42IgCSBv=r8BpN(}GH3tM=G#~R%MlF{| zOjwL3m@^_BM>yz`--Xf_`W4)~(m(A}g4}yHNS+6o^DCRO6udw9sJ1Dkk1fU$Kn(bc zDa-!rO3VUUra3XPYfwM_T8K=!_=x+EXAp?+iUyf>->cv?mln#ZG|}-6P+-a9BKANcb~Tmj(iQ)n_T{z zV#U8OJ^!yu{J)v`P4Nx%TKy-MB4;|t@pGZ3=>pXs3$fs3Pj2%3+5h}4INvs(vj}vX zjXFC=iHQ8%)ihc?`+u%Hy0r6{k$cNs}5C@1PRaf(BRyZl9@- z*3;3{aWkT1e+_ES;2sMJWhz=#gM2rqG*b}O9psfT7Eir>_X)|WgATfETAiCT2TX0H zph2i6S%O(OyTjX6Kzkp6gEP0sx=8#@7xyVG!2KrgLQTrSqGb4;>+ayad7Y4Kg}~G( zKVn^5?4fa-y7Mcvum-(!Xi)2XlrwAR2GC*ZKB%SS&a~?KXgs!o6LiF}v$LX~h^rFA z;*dwwuy3_C>yMZ^fDdu-J^<=;aOK2ajZcWAI++?Lv#EV)YV97b6VBJKnD_}y3DEHK z$1NJuA)S$qnd?Bl_!)rl|5xwyo8A1UT!Q*f+vne~z<&x01d+52oeOo(H0x%r_kGUs z!BfE|C!K5+l>+4{zge_mYfj zWKlLVcM~@=M)SOG@X7iY##qxGQs6HzS+wWpc>T{l_~h`?#wUZ|retu$*&pT;*r(LD z#Z2T!gk-vf4*Ut)>r?0Z@UdNA$4RQ%C843Q?^)NjSYtTx>f7-+{LF+E!-M|B7WG$D zIM-*kN8!bE)6Lr+cO3QU`jlYMx0T7r+;dc+p>2Zb7t~4)R^iC=-biKS4670d6&xJu-qAn|ztMikbXu`k2q{&o%9GW~RrzOgwvY zhhJ#?DeKzZ8WGh_*zPK3i4fAvmDh*B!4(y8zkMsX4cqOBWw5kQS_He5PSeBYYt6!+ z>?B%^LBdH=+qJ1RUv)Zw8@*%4Gr!3pTY$^Q%LxysFA%t#5f4sLr4hEsj2dSr#NC?> zjj+H~)GrvpK_nM3D=|z3&YK&hGuIh+9n|!5Fr1V9Ck4;R8oZ`8AI^R5yjf=%oG;`U zMU4b-6HwRkQvJXwWaNd9#8atD^Up++_;pI@U&$>2F&rj69_~W{BPO>3HXUlb&DhXAJK2~nw5mqis|p*Kg8TuSgs%t($7c_ z?GT6mmZJS@yB~otsSy2-_}J&>E&{>#_}ZUWY(3!gp0tMaL?MO!V0)T>{;zTnpvobT)z)_Ccez2~K{dYfl)o8pdGU9WI$Ov~$A%Ij)! z{@Uj`Qh2!gfbs1}ojXm%%GUz-7DNs^+E!ny(q8{AW2c>ArOng#fxXeaIfmW0|Ezd$ z+VMljk=v=V{UaM|YyzX0YEN?SQ@bO+mMI$8*L7<|Fr)qbSSBk|CNLMgdO{04nv;@K zmDF{UYPl}?L`rhqkq5a~O$N=gU)QwVuKuN7)x(kXA#yl(rhVPY?x8}Ovg5Xf+(wnI z=Ex_xbGsdL)=TEHDpk7OE-Vb#zWsumyMxp7jPP!q?uh~0)3uUw9@K}B9JB7^^gB)I zdasq7+h$hf7#|qj6*k=HxvXbdfIqY2X^w_T&ynRuPLzhhCgm2S)_7omkEcUC!KhH-2KGzZNCG)_ZqDLZW}js=(02oJ6hL6#w65rXe~p%e)fq&0lS>!F3tjUvRqR?U2k&Bgxkp*K<-l z3%x0J4Sl_bn;CQ57VIpUpz24oD@u_!J`|_G6z7V0IB`tbQ}h&9xE5_#RXJ^i>(Av} zH-=Vm$|M^6plq7%mMMDG4^uQ~68c;vQdi6lqULhfqLc71bkV=S|6q05R)1g0Y;Lo! zA7M?|R`lztZDga|#wT;!PR8DvVE?7JdNNJy)D%7VOY~bCeX10DihdhO=a+f{O(I*D zd^+~lF%|3zkND;tru)4yT)`$9Nl!=L5C2H4{18PA{)N&h3TgDhR#(PKvnEp&^sTeQ z^ID}Ur)|<>1<|D)eI{{_T|5!1yYu?&J?Q&YvCFvPyPk0RvaT|1O3&{r%8$oO8l&Ie zF~mP_g{uyCC9Axx^hb^ZTdMXot8pbd7wj%8w{@@$46K!W*ORU2CH(6Y{e~+HPuHZW zcP-!d8cs!DeOdR48?A@Xjy?oF(!PeGN+ap77CEgR!kWr$B$^U)%0AFBT9S2EO@+?6%)WZ@O4O24TVgXegk9vQ1C>tThP4t_-Z zuiE;YUCeD0w_;b9^eT}APnA(WTlmyOKA5#PPV>0RdRF5Lx`ObQcV3@JRDP6V$#tut z1o17+RnL00sl(=p2?T)+N!1>ao386Bg`e!0Bhg=tpR7dNT6n*Apt54QKbv)!iah+e`=hI|v?vept;mt^3y7CMNhd2bE66OR_3^4QGQ@2+fyj zXuTRg#Z%?IZA6{@c}wvRId*X!yLut^46gY05R`KoR})!B_!smS8-%AjYC&y8_)cW9 za4koO(~(_XcTM^t^00O$>EB%HOCeZYZYwS)BNu^ZycOIFJ6a{yX3l$o8-o3AF|eKp zh9G>fLLYSG#7tlv;7k{o`Miy4>Z6CgA~L^Gl?496x5S;-Pn2jAjSrSMun*JXF9)3) z$6=)^w}oNmA4Kyc!=GXvC;U4UdXyh|A8aeFPGg!9Rp)p}7|GFo>nJA*y&Rq{ibP`~ z1b(;RFX$HG8w~zyfBnv6gx(CMx{6#=VmjX?{#8dgnR8m!00qZ`CCB0(mXi}&f~AQ@ z@tU5FK6}{^Q-mj1g${d#s}y@XM>Y04r^O=Ib?>CP5N}Y}K~@(t-MFR~{N=y%Sf-S~ zTW;^+$kXTSDHC^?z?6#94D_17f13Xv9Q9y{2N^r)DF%lydv7C9?F5gL0=G3A=P|;l3s?^lhjeL z!F_g)+wB|(=X3TfBpOH7LwrK{W}6&yA0A;3mdMjHSq6(y>|cr}HxzkSwP1dDY66&v zBFYvhT*a41ZNkmm)h}-}Lx6D$GeG74hM)Q+y~4jnBt|OH6>bJW48V^S**AD9oUVB4 zROT{)@2x7U-C7)Dmkp)G3+@njscp^#B*7vc^+XsNwd9wmZCs?L$y za~k6aklVkHSflx2ik_ii4W0s42%ehIzN7)J^!(0FnSe(!JjKpgVy#*k%NAlKfrViK z7sp$;OCY}%iE`MJ=i@OHsgw`JD;pCjYBiJz0_T{Zs=z8n838vXl$dZwMd29$hX?nF zv2{f%^D`f-l(;3GJiz*Ws^}>#U{EsQMq+4r*AS+|umO(FFcY0eaQF3eNt%m5BZ4C7 zd*d~w@T@cz0NsuRB!xTUsXt8DqK}ZOJ%Nr0Svvn?yoQ7QNN~OQy+xLklO6sHR+|Ez zyg-#H28q}Yh1{zsdG0JJX$!_urpQ6X(zPdHFyuK7@U9XZe&Rn_blAs&UR-V~8qI~z z*;%^Q6UTx$%ysZYDT|Vm1A7%f9s^Cl0T|TUd0qalHYxD=;a&z7e2Yx?ZuD!;CL}B` zM|X%K1wvt}bM~CPslr)EyT+A#sl8QZZ(@xSD)VtekW;^zhj zX3AcQE+4+5x;I8*6vzRZazr>%KZcM{oWc;n75t|%+s*5B+gb<(czFQGif+57y(EU= z=jdZe_|9^5`6j1!7XKi%cu4SIYVkh^9`avM48+0z5B>_tY#pAru*v`c;dHj;OVhRJ ztLsd+%W@{Sm;Q%b3OSdP^sWYl!l#^!189{ITVaWM>y84Lz!Mni-*(U=jZ46t*wI>M^P?c8;~$rzNz z;jv|v>3pbjy)OINHJlsn`<9!@{7`$|ai5D_K;3U;~ z_9Q`=?jdQqcn$^o5j1IoXFTn8D}QK6atxqZ8{t=}d+6f2%Sz~^R<#&Pu%$RTGs<;% zmCrlRNw#G))nyhpi`Fkf-^vVHGSNtxM#?rsK|nwp=vObJS(Xb?Bm0AFe2vbdHUQ!9 z`6^|xQ0<|B&5!1rfnBKSJ~$^gvIbAHd@f<$KZgVwrA+UFv}1T!cPn$bE`J%SRwDI8 z+uG*pZn-lv$||1j_{@jhDE_ijg18Pf6f)blVf(f``CMK ziY?mrXIFl?9A=t;z6@wTC1_swGdQHmjOpHO&Z@^P;FyYD>@Bf9x{$8{egC5*=@SbprA5I<2eE(9#Bh6U9IBLL z+~7`-i$jqB8CHoI-1GJa+68m{OL;r%gZUX7Awn_g`bm&kjIEP`3bX3&ujz|hH1hJr z(pW(@Zcdw%0e$E-2ad}8IpBm z5>}K)Ql_w;n(u$*H#X5+!h>C;WH{gbgUP1m`}~3Q;JfWI^;T!3Ar|6J&nE|u0LmBbFxjO>qi#Q01&T8*(GUE+YBFF zACUc(R(cbe@^jWHB2B_z5ml8Hdfjx<(b7ZpwF2TQlHGdAzePFFI_>M1qnSOt_s=ry zh8vtuQ=f$!nDCxn>iD57g151~vuUPO0)FIzU?FxYYm&p3o?S(S^R7W*zfF$ys6X!H z-v*mxaj=>u&(D|4xk8-BurCB|aB~_nH0eQL^gy$d&FNyTf)P!ns7+mUX>Mu81IGq3 ze_7UZT`iQ&uX_KEKakA#JI*M_2~IcRaoQkIyS?_?a7AN^k^uNY9IPT&_~#W9m3zFI z6@#yiF55P3dCBk7+x)sM_KY~}PV|2^V+Ti`k;xJuZ~+}Pz)0?;OQDG3w%CT%cV z=scBN$i5GcAA>PCX9F4O`)Wpwpu_8$Ct)auLF^~=65tOIMz$|#d;rI|fc6qGm2xzt ztcQ&U_FO1Nl@h-$3ge1-8Kg3YDEmG|25+Ck3#a@%FnDyR=ho-$!oACZ5)%nLPql{W zMmPr%`*6d&<&h7)=h78o(|_H$}fPLaXDQ~l+K0}@Y2v)Uf)m#-1dnJx)TK6Z%5Y46QNFuNZQZm z=g>3D?NT#`fYfaIF6`hENyfiUhNOMHY8`8#DNSkz{tMhwNbzuJ?WLPhBtU3r$z@%l zJtAGNzX!i|U*S3jF=JJvio;NMGJ;-6IgDIf(!5wIkyoZ%b}8C`?10xO!i)<+{dKIS zxR*C7j3sF6QOd{Tuty3(bEBF&R|fe0>1?ym2j&6<1ZRQ6qkY`=yibwKLW&jCjf^*} z8_LXB49>YW4`LsVhGyXr3$8O(mtSoo5(s#Iz)s?T=nv!N8^RTU0}bd3cdH&Wa@b}A zv5Xy?C+5l7NhNgro8U4Kw6Bz|M(>=_lbgYO_Tfq6zWpJ6-v+ctPE%8w(!=Y|g*-i; zSXY0h`-A>MP6<|7p!n`VgyQ`*S%+u!!!J8FKe716w(!ZsIm(RQj&f;;0-q4aNL!E6 z#st+Tn+6lF_V0F|k!Lh0x5n;!ZzFC0VcvsoG_B^_+^%gsYwlx6YT^xH?_$ zObWovBxgSiWFezkN7tYwiwnYE799#EJ?>^TjnS@y5S2Wa==$JiqP^K)KKA6kYk#1s zU9HQsZUGL}Xh0NT?9e63Or$Gy;;dHg>FvCe_H|Z3-ee1CH6^XSM zbrmE9CxD0;aC__o_QMGvQjuQ}O}XEA1=$qQ!L|E-uLAw#Pidz4`F(Ic=maX)2`n5h zu23Vvja_W8a6HG=aM8lyoD@g(l17i%%$64vtIpdH)L0EwtT6s}DX4?THv?&5e=BUFr4L*7OCKE4%%AJ8HQrC%ESL zp>i^Akds*R_>_-cG~0WMfWja#b!av5i{5)laDEu;u%s*!&C_-}3VhAMPc4*O=(pnu zuAKL#n=TSCM4)gveH4uA0oV`&dhTOywFIrjb}B8kBV`uQ0i(2<2ru2&UTVk)>EHxN zZ%q_aYN=H_(|z}*4Yx0U&CIgw&^Ko?Qk-{1IJ|!HEYxeiAS$e5w@E@4GZ5oQy0Je! zqsR$ccR|SdfyD(#oc;qkH+o3VkYObL(H+)a%)2&(z^6CN(m!$IfXt>#pU?hls?0V68 z@~JyJOA2iAXS`M9<%RO&ZynxW7`eNsX@?gWz=s9AIZjq$PK0WGegBtTEqFyq(yt~! z4HpVQ%2*RfqVJo4Scgo6l{RHJ+`nQD_VO^?Gd!<&!8~HIaX{lIf2Hh+qed)MI}zvc zP_+ywL>xjoJg0JcN6qvxT~ri@uQ1e_O_yG&p`dyUdP$w-J+cqvG%ru93Ge=D7)e1F z8cl${s~X~jFl4^xaDdNkf)1iHQX?s9Y|FRpTzUG~=CdJAVw~)SP?kU_*JoOUv_AJ& zN{JPl+ETmpagE!Bn6ME`_H|#%x1bC%=d2k-SYe;l5?s0GS(F|Z;f;ykA$=fiIYIlT zvGc;H7gjxur|)!7t0V9|VH$A%0vMoVx!(fzih10V7K9TY!)5x*rp zz~TN3E$X#oUX!hjz5%Rl?Gv@6f4v2lybe`3I6xBw6*n(}ku(A|B!?TBb|=87NAI3b%qrYng}R0kdK$Pk1Q^|z33$(r%$kROg|&2FLe=r2 zy;OyEmTlRLIt4F z6&w#-_(EjP72Ll(OO~MNqV~DBn%H$+g*McaEjNbN7SXu8couaEFPhsX?P7X2{@QTg z*D-sb%OvwBCdVNyde}U+F~ufjv3GudYG;MEnu$%b;VnF{qa%r>d+&uVVmY0%aOPi= zCOjyHJ&~0a2$_BbaDp~dvW}+Z8V-J|Z;T7;u=IJ~*Y>GfP1)gBvv2vynFeY#_MFWO zJ>WMm+UP0)VX4~LV2HL6Nnc3)PZou~W-p$f*w3EQ({8{v2*x!HIQ^Gi&G7U{TG-5I z@Zou{zz;0vZk|u~=}v|2uxGP94oNL8xgTYx^VGI;=2xjkVdz5W>bW4J%yW?@*L;B@ zjCxUyWoP=ymt6RJk%g8PN%<3P?RRn-?AIK(*Y zP4exy;Jjb0x~U#RUQh+{F(~9)pqpOB5CCxYkorrH%E&}j4m5>78QQ*GaU3YTmejSp z-OTXN>#2mAv_lDW%NE1eJ-eo2wh2xo^$HzTb(!fq@vaB1k{NbpgEr(MR{sf2b-f7N zfQr;<-)Uwd1+oc|b`utFR4Pw2utF#Ut%md1VJ#`jyR`be^hUw)9JdW@1a2xPewa^A zeGVlICu1hfDF0dLCcD;YlaKj!4XKA}e;uJT&iM$+vGYt!THb4wEBo7o7bo&k7ODJLl7$N79`~(@nXXsG zzH3{Lwo*}jxQ=ePjTVeb?tGV;;XUP+N#Ep(3IWP9o#`+b~dy@b>D8b z?~dQVWJq;G1>f{Aexck`QyLPcNUugMB`Cw2J2S5>PwC$LV(spp3k4!3@$SYO8 zyl2mysjPW%n#%P0+^WzWi?j+tOH}R;Jv>+G-Xvkt(P$z|jb^L7O2An%pt(?kc^U`d zgHg$s8RqS3ohJ%IGJPCADn-7YO1==-@~~kCKcPc@TAo7SaGZcI6?6p`%J9qaY=VO_ z^Fd}!gLnR2JO9SQHJLq^1`a-Sef8Ah*#+yAp`NYL5u5y5Y_Xmq!a<<N{XP7C##lYy)~v8D;dEi=p_e*fuT~2s>GU?-}t%0A^hsVqpn*$+|s}T zuOC#hKCk`!V2yQb1kXh>&_I8T07#^*aH`Stq71~Wlk z6u)-OYnJBSJ0G$22MOaQ{dc%3DE*8+im4E}Dr*T;ZKQ`$WclZGz3=1{=9U40`;=EF zko^e@@U^7W!Bf#qA+$4xy(Jt1o;G^7vQ=tJWCU1wf~qvIrYQ|U`+n1EOiavb9&VE! z(f6+ynNg==FKUDw!7PgQby82IQ`CpC|dBk9Pl&`hZ7UN|P`I0vX5qeC7pzu(NSx&}yjV z9IM~mq4-o()G-_Akk#`1f0AU(rYax|E9wb-rb}hG6XoKMEgE{c`E}tu><`c*jAf@t zbFS$EQ^^cqbX?%QVr15EE+%HSx?X@xN0?>$SIl5S2SSlN(H8sovnXRKuO5- z?-a+f2Q_>%+0o78hmr+E3K7f)*gENYmqFXq#m--E{3dBm`^i86m?8LKSRPZ@S~e>Y zffewldvb#_FB5T=0;{C%k*I|vQQ@nQ{{SBUOZ!?Q8Z;tTrBn_*?5r59_K)~_i|+E` z+qdol?fU$06(5akXZnM3M;_0hD_rNX3{dk31Alx)2x{Bkr(-IbT^%);+@*ytJayY} zIeRO+)zNoXM0R(zV%6JAkbk1CQL0(mKhx~b!RN-PRe&8HA2N!aiY77xi8xde z=qJWi2jiqbBny+kAdrg1^_*PoJ!OdGy(7tS(aQGeatZu1CO#~sY|tf-n&PpFRsST{ zyS<*7T4f^wgmBE3`6VHI7pA883yW~> zyPl(AW6v&RB3Ly(K~;-P^^w96k?fugE|}~GQ^@f}H~0}_KfxNvn4l9uX?`|^$~4#Z zv?PsRE-H#*8LSca6Wm4m66pM467B1IK`sd@N0AVP_4D>1@sib_y-H#gcw^R3o-Kv= zdOq!k`c9fISXG47I9|r6ne$g|;dgE!qN+~MwKYU%#>bXGU@xRv0#LyN37_=98VZ$j zsU+4+ssxT%z%mttr)97I*C0}3S_gVZehnjxAlp=^z9@WbB3QWywT*D&$T}pxj}Cw^ z57SZS6l3hQioIp%La2^lY{^6xku!uL7;T{RdzuY50dx^*1Y$RZD#Bz*!7V;#%lalw zy(x~f^w=LDYOqHZl~-ayzgH^(39~S_Duv}45Cxxrm2V>T%-8a$YbfZG?o9)x2?S?v z$dKhwDS!z*p3pp}13f9KPr)Y-{@V9Lrv>*66oFY0wRU)0Kug85T}-c$odGp*K2s_2 z{TuSCZFtEKL3bCj!6-Uj|cwCkacnB9Vg3C*ClpyX~R^lQwjJ1PlhEZAe zxFrl$9>{WICZT)1$Dr2sZp#j@iYT4r)X#JGs~Ng<{M{deBZ1kzRcA8e1I=!U9^$=~ zXE+64kd938pQ)RGGeX*paz?$4WcM?}hQ0*G4*B}*&*~W+a$zr!WCL%n!t>#GT@IGO zp(;TMgOw9}mj!njBaW@Db%4@&WljBDRIHMiLmnoyLJPGC8uy2;Dfxx#nN>7+5cYPjh#?0icbve)2}d1iH3N0;62YVT|L0 zgl4Tc9F6cyW^qbFlDwv~>hzE2uzD%?Ti%tT-=l}azxDbb37U(ADpcsCz}$fCc)Ct8 zsyGz2P|l0f)O>hnzh1GhRAkiqK8-v(s)q15&rrD8YvSG%BM;Sx71%t|7sn&QJ1Q8& z&7-vh@Hb*!pWtZ#41LSUJc|ELiG;&PL25<^rgzsv8C6aBiOknO(#?!QWyj;S>NmB-y>NJ>MCO* zJAT-cdNq;lZLbAqbZ;W(v#r<2mQRNx>@)86Qv92omm(nk<)Ffa`1@QeG4gvgD_nQ8 zYzQ@vwMqXh9I)Pv9HSpjaqhoLf)caQCo-rzMT#qAWOhRyc?31bYca@4ngY6G%Dp}R zMK1v}7HB~z(d=fLYvg~l{t0^esTK(lYZSl+@m~4tJsY^y#! zfhfy5OxG$*ksZ^~f`*yChD(Q0qFmgz+HWaNJV!}EJuwCK!*I=9ktN^_X|lVEAE{={ zOiu~-r&^ElCFIJAK48ozqpx(>34h8l8>%mJ;Rt`uR@Ld&maI$>141Gh0BV| zUVrG5jhMAK_8y#L^__wGo6quX_agXxbQTyWhqOEo!x}QU(XOcl0pwo>*hGf-gq=Vv?Vw@~NMIv6r64plfukO7 z|I3HUUY=fVScmh^p{~1yLvB*9us$&)N$5}=X5>O@gG?!rdRQnYhLRr*_W)yrv7Q(l zU*VcU)?6%@Asg))t-#o4U7|x{#=!jw17`QIh4Q~ndPd%Dm5X{C^)|%HblSjGUx8U8 zN(P1)9tHtBH@>T;;PQaDh zbKZ14i+^c$Id^D9Rj3iUJ{Gam;;87x&+^nXnl5W8BcxM($w2TM1s!gTMUU1<;Fux8CEeP>&_v?B4xgcDnz`|)!`0Jzf8zD(WH}eIoqJ3{Z+MB`I$pDHL zsWVU~Lk<`kA!>legbe^~Ks;*8XmfO}sTE0Aw4~D_{%BK^NaZc5#KsSmUFy%8Dbl<@ z_P%iLzKbd8N4t=QHTA!BzKbZ&=ybotM5!2WDuK*k^oc_Z6p+L!WwqovQqxyx-E&54 z4XRAtm;Y3se>Sfu?K3&8T|K!(Tah(nvs{M=!*$=-A4c3-FIna}ee1L03noX$HYeT; zGY?7PMfM_ajaibYP-v&fl)#~j3oxEY|9CtB`tCDP-DJ)^XxyrI4UvmRisJX7i~+mPxjE(}Q5x49Fx%2zqTV2Fp{CM1j zqF9#{y59}l?ETPmU+1ev7V@E3Zr#1yb^U~d<=V$6OCgNfDg$uP>v?OjtEa8tsr$M} zdl;JdBkyDFqo{Mbz*+<}RMibxf2`l{w8-81gNDahYpY;nc{@u4&Cs$z)C~i*L&^j} zB{EJeQ*;t45hAKRfYOUmW$kc)Hf5RVK(f!Sr)e2>j(y4Q8LgyjD?8`;+!yS`^cIyv z?tP#2>ON~Q>aR5ghK%?kHIr92^KExSP^+~|45?qGN4)=9cW2km?C!MU?tv(;e8TIN zw(f3v*ku`3R9j8Km&80rj(Pv=k#!@%y77So=1}f#>y8HrX8yO)bnb12Oe>=CvcqIEQ%LJ z40Kz(T;bi{#A_<%eQrv67NC$djSI7d`q2Bu=w>7pi%nm}IS2R&gHkekNH8jmQ!1Lv zwfdw654T?|Pt??q4PB~VFAn}Maq0X9325fdrhUFjuo&2y2jTzWk(%{Qjjdu`pV%)G z(IY6BMHxwa;(XqWx3oFNdCx>v6eGeZChto_-oB)S{+zROcBg`?5}88=1kUr=2&XM< z>@%Lt3?SRFwIgg0&xc7je=ZLj9fSql9|>hX$N+#aJP_yvLHAC=Yuv$(h0OWV~0Ls{`R=W(+?27l69!Ho;ai!C>y_v9z>9^`?p z%>UzSWr?mY)*pBqw$PtOq;=1@E$1Lcl}=-Lrb=_>OLHuEv-NlpCzR-vAeXR!$BdB7 z!M;0Xecdb_PQ~q1Ii^-VIk!$$+Ity|63~9uKe1T^<{r9udpFlUL9>Mpqa^#1U6&&Y} z?%Vamnu1D+W#9CM!j{@*H699iH1c{V;=1*u{Qdye;Pz!bp0^oMY0KC!sd}K zu75%w+#7K3Eivlqjfl7z+F`7>er^3BBi1h%xdR~uZD|Xevp>>~(?2@%G;)_pQhRbH za>LIidVPFz&a*wh?F=>NUvypSc24b$?!iM|#px-e>?tJRh$dn@1`q(yjnxHNyC2EU zz`C!V+O$Zk>^!;2b%`uXIU^{vpj4kLVZlkE`#I1^%m+cPrPdiihbTsoZ>%#07H}of zm`*)yT5q|%)giHO>0v(>i*w#ZNieN08AbfjIiOh-6(!D9x)gVBIf+$2l?D!@o__bD z4E6oNWJ%6*-b3dD%S`M)e|cN}Ouq1C-Sc(a5ud)qX9i!syiGq;_k`S$aieS4kx|Ur zt*fO~@TcK)d&M*O`~gsn*Kb4353pW#2J39BX4R0fv2|a8!G*lf6ZLk_;4ZrmKV0%8 zi=O;7+u@<+kK$DK#viXg9*H`)Ku!@LWkqQ=ry)1*Bd;l3Nn&{E|8gl6YGk!O3TVa958V z?dY3V!*!Uill`!J)!wuvpQi3E72E!Gp~D1LBeTsz(YUu^o$dLdoDtK#ZBLamgTg&i z3!8L#J_{yrnqmk>kDEI72b`CSE9)p`2IPlTQwU5|^J zzC6-=$?!GnMN{_IM{9^>g>&B6wb%PMY*9dG2c*hE`Idy@1=nPc zc4YwD1NPKML23__QeV(JnyX1P?Xsx0OrPc!q6Cxr{iup7hhTn3#SnZ<(PPLs~vw6d8IN@yQUH%1&+wk2|G&Y0G&NPSsqZQEZ*tqJ>F zsAQ-NU96d5cg=vx+soFjh>}Gd;h2^KR>`qIEDW82TXZc59>9ek$MXm(e}EE|pgq=j zmwRE`@9*!uW6wZBQKjY(Z>Z-mVo?SoV1N>pyp52}3x1ae4QDF)CW}=F$EZ%z>GyWpA&o z0&vZ9X}dx92xpH~;P}+WG+de=Y@yWtQms*kJ&n0=^R2KQ4ISEmT(On{Oi2Nm>p^7F zQK=Lo;ou9479h%t?0pErb&SxOyoR<4?SB>}f%R&8Ftl^6fGbz-FK}Vrmu4aNue|k!=NtrNvcI^xPJ9 z9_h62AG2+4tc7uXC0b#ErX+~(Wm`b#2jCiKEnqPVwyOYfg7A+Kf6m;-Eh?OgZ44RR zC&cfb?<|pMD}5Ny`Cu(!$@}fUZ#K#4QI!TZ9nHW(FoW$Rqp;AXSxG!$dCJuPJRQpC zWU+ajd9+Bx?21u``#M>hepvEk`_0YE(pwft*RzPg-LzmaDpT%)zLolb z$)TDg=a_R+zfS73ZJ10w^PzgcGVjvs4_`|gFxpxdoA*s2F;|25_!`m9+`4*Ps+Q>s zDIW`HWAxraLO*tSiZ3^zhLT=bZ1u}B`L2N>I zWh#bCkeg4uoHFueQD*zdsbT&2`nfKiYQ_#ePe+FINAi-&ZPBta^Ye*A?ZRih%7+WT{6S_;j#-pty6Z%0ATf)rV7J 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 D#t6qf literal 0 HcmV?d00001 diff --git a/browser-extension/edge/assets/store/store-icon-128.png b/browser-extension/edge/assets/store/store-icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..8658432dfab6bebdaeaef4235d12981e9e4caeff GIT binary patch literal 1659 zcmZ8hc~BE}6a57tM2-~XiX3t%Rv@F*FC672hSM4#C4{IPwtfV#5GuFQhNDElhD%VC zf+3QETEbysEC~{d7HbqRs34{MRZ&nR8Ws$*Z91eut#-gQZAI|H=WsJWke$(Y$SEuFA2P`l$#>%p z>7VvKbd?PZ4CursZ8ra3qsP5sj(K$SP8L|4zCo*0?p$@@9PoLxnru%hsJn@s6{p&5 zWVtRDCA(Lya4mAU>gt@Bx`2a(zHg;Z8ByE(hwih>xa(FV^sJU-VvkF zOLJdA9QM6DX%+(;K|E{jbLg_4|BQZ1D$@ zb;+~UMv+u+M`Vg=@e2DX_01V+X6{Tn!sUcRZ5M8UWZWLwa0T>= z+1&t-a-Z;|tIgcLeui5vwfaMuOhT8vtwBt1erwoD6A0W*j?Z^Hl_K3zi69(_tyGvPC z8~mKZs$Am3clwI;Z5U9BgR9zsUT$P3%r`uSBG0DpQxsm2DHv(k@425(%XT9*!iryh zC8@HUj`L7>XbSW+Z77By@eX-QZ0SB}nYQA=yzs6}N$G4m1;|^NGtlu%v%=N2c0bkE z!~q~2{7Cq^5CjQz1#{zBk`MQERn7}v#U9(f?6Liy?omC!;I@`Ax)O4q;HhP-p;6HT z^R=}DMPXL}|CUMadSUNihsjU%N3_7c!o}uDh|Pk#TWpe9o_R5d+N%-wD=cru4qQ0* zk3fmJ`BTT00c1-<;GjXb)%a|?L7t{T-kSg4b2|*rYjtr2Zb-CH0*#Y5h=?sAW;$)r zj0_#$T=Z-Oyw7jW(?5oXIcWmi_of7$ouH?;L)H2JYYUd13|+dCSp)C;a!S5sm0R6q zegV!=^ zCyqJOC|kC;|I(h6wvkDixqW>8gn8`xi6Ne#|HPzQ_9_R+$!OTzh@a=E6Jo}S0(qZT*gjs z+*cpo^sujlIF51Ddu^H!_@fzXKC{95z)NZ9fu-^RO;?fvQC&6{zIe5XnBQPJYZ^|v zW__tyX)F3hcrsQ$QqnB1)ru>{cPm4Sxzxn`-z?y19XO|rT|W)=^jg5>Lr0|?7IMnl zMBwMdeKXQa<6DgxCZu?N#6MqrgdPip-Xgv>>4C66OShAm$Sl9uzf_*oF+N=6QaYId zX)r)7Wje06xWb?8|8z0yDfVF32=7q0oF7ly)nI71;n*!==R_83dqo{fcxTe4_1;DV u#qmp~TV0}+uB_W__|tXT|NX>(9=!I+N`Fw10YbXCnGE*FVp!<7g1-P0ss>~L literal 0 HcmV?d00001 diff --git a/browser-extension/edge/manifest.json b/browser-extension/edge/manifest.json new file mode 100644 index 0000000..8ebf24b --- /dev/null +++ b/browser-extension/edge/manifest.json @@ -0,0 +1,24 @@ +{ + "manifest_version": 3, + "name": "API Response Comparator", + "description": "Compare JSON API responses across Dev, QA, and Prod from a browser popup.", + "version": "0.1.0", + "icons": { + "16": "assets/icons/icon-16.png", + "32": "assets/icons/icon-32.png", + "48": "assets/icons/icon-48.png", + "128": "assets/icons/icon-128.png" + }, + "action": { + "default_title": "API Response Comparator", + "default_popup": "popup.html", + "default_icon": { + "16": "assets/icons/icon-16.png", + "32": "assets/icons/icon-32.png", + "48": "assets/icons/icon-48.png", + "128": "assets/icons/icon-128.png" + } + }, + "permissions": ["storage", "clipboardWrite"], + "host_permissions": ["https://*/*"] +} diff --git a/browser-extension/edge/popup.css b/browser-extension/edge/popup.css new file mode 100644 index 0000000..e55f80f --- /dev/null +++ b/browser-extension/edge/popup.css @@ -0,0 +1,440 @@ +:root { + color-scheme: light; + --bg: #f7f8fb; + --panel: #ffffff; + --panel-soft: #eef2f7; + --text: #111827; + --muted: #64748b; + --line: #d8dee8; + --brand: #0f766e; + --brand-strong: #115e59; + --danger: #b91c1c; + --added: #047857; + --removed: #b91c1c; + --changed: #b45309; + --type: #7c3aed; + --shadow: 0 1px 2px rgb(15 23 42 / 8%); +} + +body.theme-dark { + color-scheme: dark; + --bg: #111318; + --panel: #1a1d24; + --panel-soft: #242936; + --text: #f8fafc; + --muted: #9aa4b2; + --line: #303746; + --brand: #2dd4bf; + --brand-strong: #5eead4; + --danger: #f87171; +} + +* { + box-sizing: border-box; +} + +body { + width: 820px; + min-height: 600px; + margin: 0; + background: var(--bg); + color: var(--text); + font: 13px/1.45 system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +button, +input, +textarea { + font: inherit; +} + +button { + border: 1px solid transparent; + border-radius: 7px; + background: var(--brand); + color: #ffffff; + cursor: pointer; + font-weight: 700; + min-height: 34px; + padding: 7px 12px; +} + +button:hover { + background: var(--brand-strong); +} + +button:disabled { + cursor: not-allowed; + opacity: 0.65; +} + +.shell { + padding: 14px; +} + +.header, +.header-actions, +.actions, +.tools, +.summary, +.result-toolbar, +.mini-actions, +.env-head { + display: flex; + gap: 8px; +} + +.header { + align-items: start; + justify-content: space-between; + margin-bottom: 12px; +} + +.header-actions { + flex-shrink: 0; +} + +h1 { + font-size: 18px; + letter-spacing: 0; + line-height: 1.2; + margin: 0; +} + +h2 { + font-size: 13px; + letter-spacing: 0; + margin: 0; +} + +p { + color: var(--muted); + margin: 4px 0 0; +} + +.icon-button, +.mini-button, +.file-button, +.secondary, +.mode-button, +.count, +.view-button { + background: var(--panel); + border-color: var(--line); + color: var(--text); +} + +.icon-button:hover, +.mini-button:hover, +.file-button:hover, +.secondary:hover, +.mode-button:hover, +.count:hover, +.view-button:hover, +.mode-button.active, +.count.active, +.view-button.active { + background: var(--panel-soft); +} + +.icon-button, +.mini-button, +.file-button { + align-items: center; + display: inline-flex; + justify-content: center; + min-width: 34px; + padding: 0; +} + +.mini-button, +.file-button { + min-height: 26px; + min-width: 26px; +} + +.file-button { + border: 1px solid var(--line); + border-radius: 7px; + cursor: pointer; + font-weight: 800; +} + +.mode-bar { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 8px; + margin-bottom: 10px; +} + +.mode-panel, +.table-wrap, +.tree-panel, +.suggestions { + background: var(--panel); + border: 1px solid var(--line); + border-radius: 8px; + box-shadow: var(--shadow); +} + +.mode-panel { + padding: 10px; +} + +.hidden, +.file-input { + display: none !important; +} + +.env-grid { + display: grid; + gap: 10px; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.env-card, +.field { + display: grid; + gap: 5px; +} + +.env-head { + align-items: center; + justify-content: space-between; +} + +.env-head label, +.field span { + color: var(--muted); + font-weight: 700; +} + +textarea, +input { + background: var(--bg); + border: 1px solid var(--line); + border-radius: 7px; + color: var(--text); + min-width: 0; + outline: none; + padding: 8px; +} + +textarea:focus, +input:focus { + border-color: var(--brand); + box-shadow: 0 0 0 2px color-mix(in srgb, var(--brand), transparent 78%); +} + +textarea { + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + height: 132px; + resize: vertical; +} + +.actions { + justify-content: end; + margin-top: 10px; +} + +.tools { + align-items: end; + margin: 12px 0 8px; +} + +.compact { + flex: 1; +} + +.tall { + min-height: 36px; +} + +.status { + color: var(--danger); + min-height: 20px; +} + +.suggestions { + display: grid; + gap: 6px; + margin: 8px 0; + max-height: 92px; + overflow: auto; + padding: 8px; +} + +.suggestion { + align-items: center; + display: grid; + gap: 8px; + grid-template-columns: minmax(0, 1fr) auto auto; +} + +.suggestion strong, +.tree-key, +.mono { + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; +} + +.suggestion small { + color: var(--muted); +} + +.summary { + flex-wrap: wrap; + margin: 6px 0 10px; +} + +.count { + align-items: center; + display: inline-flex; + gap: 6px; +} + +.result-toolbar { + align-items: center; + justify-content: end; + margin-bottom: 8px; +} + +.contract-alert { + color: var(--danger); + font-weight: 800; + margin-right: auto; +} + +.view-tabs { + display: inline-flex; + gap: 4px; + margin-right: auto; +} + +.contract-alert:not(.hidden) + .view-tabs { + margin-left: 8px; + margin-right: 0; +} + +.table-wrap { + max-height: 260px; + overflow: auto; +} + +table { + border-collapse: collapse; + min-width: 100%; +} + +th, +td { + border-bottom: 1px solid var(--line); + max-width: 210px; + padding: 8px; + text-align: left; + vertical-align: top; +} + +th { + background: var(--panel-soft); + position: sticky; + top: 0; + z-index: 1; +} + +td { + overflow-wrap: anywhere; +} + +.empty { + color: var(--muted); + text-align: center; +} + +.badge { + border-radius: 999px; + color: #ffffff; + display: inline-block; + font-size: 11px; + font-weight: 800; + padding: 3px 7px; +} + +.ADDED, +.tree-node.ADDED > .tree-line { + background: color-mix(in srgb, var(--added), transparent 84%); +} + +.REMOVED, +.tree-node.REMOVED > .tree-line { + background: color-mix(in srgb, var(--removed), transparent 84%); +} + +.CHANGED, +.tree-node.CHANGED > .tree-line { + background: color-mix(in srgb, var(--changed), transparent 84%); +} + +.TYPE_CHANGE, +.tree-node.TYPE_CHANGE > .tree-line { + background: color-mix(in srgb, var(--type), transparent 84%); +} + +.badge.ADDED { + background: var(--added); +} + +.badge.REMOVED { + background: var(--removed); +} + +.badge.CHANGED { + background: var(--changed); +} + +.badge.TYPE_CHANGE { + background: var(--type); +} + +.tree-grid { + display: grid; + gap: 10px; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.tree-panel { + min-height: 220px; + overflow: hidden; +} + +.tree-panel h2 { + background: var(--panel-soft); + border-bottom: 1px solid var(--line); + padding: 8px; +} + +.tree-body { + max-height: 240px; + overflow: auto; + padding: 8px; +} + +.tree-node { + margin-left: 12px; +} + +.tree-node.root { + margin-left: 0; +} + +.tree-line { + border-radius: 6px; + display: flex; + gap: 6px; + min-height: 24px; + padding: 3px 5px; +} + +.tree-value { + color: var(--muted); + overflow-wrap: anywhere; +} diff --git a/browser-extension/edge/popup.html b/browser-extension/edge/popup.html new file mode 100644 index 0000000..826b757 --- /dev/null +++ b/browser-extension/edge/popup.html @@ -0,0 +1,180 @@ + + + + + + API Response Comparator + + + +
+
+
+

API Response Comparator

+

Compare Dev, QA, and Prod responses from JSON, URL, or cURL.

+
+
+ + +
+
+ +
+ + + +
+ +
+
+
+
+ +
+ + +
+
+ + +
+
+
+ +
+ + +
+
+ + +
+
+
+ +
+ + +
+
+ + +
+
+
+ + +
+
+ + + + + +
+ + + +
+ + +
+ +
+ + + + + +
+ +
+ +
+ + +
+ + + +
+ +
+ + + + + + + + + + + + + + + +
PathTypeDevQAProd
No comparison yet.
+
+ + +
+ + + diff --git a/browser-extension/edge/popup.js b/browser-extension/edge/popup.js new file mode 100644 index 0000000..1c1cdbc --- /dev/null +++ b/browser-extension/edge/popup.js @@ -0,0 +1,971 @@ +const ENVIRONMENTS = [ + { id: 'dev', label: 'Dev', valueKey: 'devValue' }, + { id: 'qa', label: 'QA', valueKey: 'qaValue' }, + { id: 'prod', label: 'Prod', valueKey: 'prodValue' }, +]; +const DATA_FLAGS = new Set(['-d', '--data', '--data-raw', '--data-binary', '--data-ascii']); +const SUGGESTION_THRESHOLD = 60; +const MAX_REQUEST_BODY_SIZE = 1024 * 1024; +const STRONG_VOLATILE_NAME_PATTERNS = [ + /timestamp/i, + /time/i, + /date/i, + /createdAt/i, + /updatedAt/i, + /requestId/i, + /traceId/i, + /correlationId/i, + /sessionId/i, + /token/i, + /uuid/i, + /guid/i, + /nonce/i, + /etag/i, + /version/i, +]; +const TEMPORAL_NAME_PATTERN = /(?:lastLogin|lastSeen|lastModified|expires|expiry|generated|modified)/i; +const WEAK_IDENTIFIER_NAME_PATTERN = /(?:tracking|transaction|operation|event|message)Id$/i; +const NOISY_PATH_SEGMENTS = new Set(['headers', 'metadata', 'audit', 'debug', 'links']); +const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; +const ISO_DATETIME_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/; +const EPOCH_PATTERN = /^\d{10,13}$/; +const PREFIXED_IDENTIFIER_PATTERN = /^[A-Z][A-Z0-9]{0,9}-[A-Z0-9]{6,}$/i; +const TOKEN_PATTERN = /^[A-Za-z0-9-_]{20,}$/; +const BLOCKED_REQUEST_HEADERS = new Set([ + 'connection', + 'content-length', + 'host', + 'origin', + 'proxy-authorization', + 'proxy-connection', + 'referer', + 'transfer-encoding', + 'upgrade', +]); + +const state = { + mode: 'json', + view: 'table', + theme: 'light', + diffs: [], + filter: 'ALL', + suggestions: [], + compared: { dev: undefined, qa: undefined, prod: undefined }, + active: { dev: false, qa: false, prod: false }, + urlController: undefined, + curlController: undefined, +}; +const extensionApi = globalThis.browser ?? globalThis.chrome; + +const draftIds = [ + 'devJson', + 'qaJson', + 'prodJson', + 'devUrl', + 'qaUrl', + 'prodUrl', + 'devCurl', + 'qaCurl', + 'prodCurl', + 'ignoreFields', + 'pathSearch', +]; + +const elementIds = [ + ...draftIds, + 'jsonMode', + 'urlMode', + 'curlMode', + 'status', + 'suggestions', + 'diffTable', + 'contractAlert', + 'tableView', + 'treeView', + 'devTree', + 'qaTree', + 'prodTree', + 'countAll', + 'countAdded', + 'countRemoved', + 'countChanged', + 'countType', + 'compareJsonButton', + 'formatButton', + 'fetchButton', + 'curlButton', + 'suggestButton', + 'copyButton', + 'downloadButton', + 'excelButton', + 'resetButton', + 'themeButton', +]; + +const elements = Object.fromEntries(elementIds.map((id) => [id, document.getElementById(id)])); + +document.addEventListener('DOMContentLoaded', async () => { + await restoreDraft(); + bindEvents(); + render(); +}); + +function bindEvents() { + document.querySelectorAll('.mode-button').forEach((button) => { + button.addEventListener('click', () => setMode(button.dataset.mode)); + }); + + document.querySelectorAll('.view-button').forEach((button) => { + button.addEventListener('click', () => { + state.view = button.dataset.view; + persistDraft(); + render(); + }); + }); + + document.querySelectorAll('.count').forEach((button) => { + button.addEventListener('click', () => { + state.filter = button.dataset.filter; + render(); + }); + }); + + document.querySelectorAll('[data-clear]').forEach((button) => { + button.addEventListener('click', () => { + elements[button.dataset.clear].value = ''; + persistDraft(); + clearSourceDerivedState(); + }); + }); + + document.querySelectorAll('.file-input').forEach((input) => { + input.addEventListener('change', handleFileUpload); + }); + + draftIds.forEach((id) => { + elements[id].addEventListener('input', () => { + persistDraft(); + if (id === 'pathSearch') { + render(); + } else { + clearSourceDerivedState(); + } + }); + }); + + elements.compareJsonButton.addEventListener('click', compareFromJson); + elements.formatButton.addEventListener('click', formatJsonInputs); + elements.fetchButton.addEventListener('click', compareFromUrls); + elements.curlButton.addEventListener('click', compareFromCurl); + elements.suggestButton.addEventListener('click', generateSuggestions); + elements.copyButton.addEventListener('click', copyDiffs); + elements.downloadButton.addEventListener('click', downloadJson); + elements.excelButton.addEventListener('click', downloadExcel); + elements.resetButton.addEventListener('click', resetAll); + elements.themeButton.addEventListener('click', toggleTheme); +} + +function setMode(mode) { + state.mode = mode; + document.querySelectorAll('.mode-button').forEach((button) => { + button.classList.toggle('active', button.dataset.mode === mode); + }); + elements.jsonMode.classList.toggle('hidden', mode !== 'json'); + elements.urlMode.classList.toggle('hidden', mode !== 'url'); + elements.curlMode.classList.toggle('hidden', mode !== 'curl'); + clearStatus(); + persistDraft(); +} + +function toggleTheme() { + state.theme = state.theme === 'dark' ? 'light' : 'dark'; + applyTheme(); + persistDraft(); +} + +function applyTheme() { + document.body.classList.toggle('theme-dark', state.theme === 'dark'); + elements.themeButton.textContent = state.theme === 'dark' ? '☼' : '◐'; +} + +async function handleFileUpload(event) { + const input = event.currentTarget; + const file = input.files?.[0]; + if (!file) return; + + try { + const text = await file.text(); + JSON.parse(text); + elements[input.dataset.target].value = text; + persistDraft(); + clearSourceDerivedState(); + clearStatus(); + } catch { + showStatus(`${file.name} does not contain valid JSON.`); + } finally { + input.value = ''; + } +} + +function compareFromJson() { + const parsed = parseModeJson(); + if (!parsed) return; + compareParsed(parsed.values, parsed.active, getIgnoreFields()); +} + +async function compareFromUrls() { + const urls = getEnvironmentInputValues('Url'); + if (Object.values(urls).filter(Boolean).length < 2) { + showStatus('Provide at least two HTTPS URLs.'); + return; + } + + state.urlController?.abort(); + state.urlController = new AbortController(); + setLoading('url', true); + + try { + const results = await Promise.all( + ENVIRONMENTS.map(({ id, label }) => + fetchOptionalJson(urls[id], label, state.urlController.signal), + ), + ); + compareParsed( + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].value])), + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].active])), + [], + ); + } catch (error) { + if (!isAbortError(error)) { + showStatus(error instanceof Error ? error.message : 'Unable to fetch URLs.'); + } + } finally { + setLoading('url', false); + } +} + +async function compareFromCurl() { + const commands = getEnvironmentInputValues('Curl'); + if (Object.values(commands).filter(Boolean).length < 2) { + showStatus('Provide at least two cURL commands.'); + return; + } + + state.curlController?.abort(); + state.curlController = new AbortController(); + setLoading('curl', true); + + try { + const results = await Promise.all( + ENVIRONMENTS.map(({ id, label }) => + fetchOptionalCurlJson(commands[id], label, state.curlController.signal), + ), + ); + compareParsed( + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].value])), + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].active])), + [], + ); + } catch (error) { + if (!isAbortError(error)) { + showStatus(error instanceof Error ? error.message : 'Unable to import cURL commands.'); + } + } finally { + setLoading('curl', false); + } +} + +function compareParsed(values, active, ignoreFields) { + if (Object.values(active).filter(Boolean).length < 2) { + showStatus('Provide at least two populated environments.'); + return; + } + + state.compared = values; + state.active = active; + state.diffs = compareJson(values.dev, values.qa, values.prod, ignoreFields, active); + state.filter = 'ALL'; + state.suggestions = []; + showStatus(state.diffs.length ? '' : 'No differences found.'); + render(); +} + +function parseModeJson() { + const values = {}; + const active = {}; + for (const { id, label } of ENVIRONMENTS) { + const result = parseOptionalJson(elements[`${id}Json`].value, label); + if (!result.ok) return undefined; + values[id] = result.value; + active[id] = result.active; + } + return { values, active }; +} + +function formatJsonInputs() { + const updates = []; + for (const { id, label } of ENVIRONMENTS) { + const input = elements[`${id}Json`].value.trim(); + if (!input) continue; + try { + updates.push([`${id}Json`, JSON.stringify(JSON.parse(input), null, 2)]); + } catch { + showStatus(`${label} contains invalid JSON.`); + return; + } + } + updates.forEach(([id, value]) => { + elements[id].value = value; + }); + persistDraft(); + clearSourceDerivedState(); + clearStatus(); +} + +async function fetchOptionalJson(url, label, signal) { + if (!url.trim()) return { active: false, value: undefined }; + validateExtensionUrl(url, label); + + const response = await fetch(url, { + credentials: 'omit', + cache: 'no-store', + headers: { Accept: 'application/json' }, + signal, + }); + return parseJsonResponse(response, label); +} + +async function fetchOptionalCurlJson(command, label, signal) { + if (!command.trim()) return { active: false, value: undefined }; + const request = parseCurlCommand(command); + validateExtensionUrl(request.url, label); + if (request.body && new TextEncoder().encode(request.body).byteLength > MAX_REQUEST_BODY_SIZE) { + throw new Error(`${label} cURL request body is too large.`); + } + + const method = request.method.toUpperCase(); + const response = await fetch(request.url, { + method, + headers: sanitizeRequestHeaders(request.headers), + body: method === 'GET' || method === 'HEAD' ? undefined : request.body, + credentials: 'omit', + cache: 'no-store', + signal, + }); + return parseJsonResponse(response, label); +} + +async function parseJsonResponse(response, label) { + const text = await response.text(); + if (!response.ok) { + throw new Error(`${label} request failed: ${response.status} ${response.statusText}${text ? ` - ${text.slice(0, 240)}` : ''}`); + } + try { + return { active: true, value: JSON.parse(text) }; + } catch { + throw new Error(`${label} did not return valid JSON.`); + } +} + +function validateExtensionUrl(url, label) { + const target = new URL(url); + if (target.protocol !== 'https:') { + throw new Error(`${label} URL must start with https://`); + } +} + +function parseOptionalJson(input, label) { + if (!input.trim()) return { ok: true, active: false, value: undefined }; + try { + return { ok: true, active: true, value: JSON.parse(input) }; + } catch { + showStatus(`${label} contains invalid JSON.`); + return { ok: false, active: false, value: undefined }; + } +} + +function parseCurlCommand(command) { + const tokens = tokenizeCurl(command.trim()); + if (tokens[0]?.toLowerCase() !== 'curl') throw new Error('Command must start with curl'); + + let url = ''; + let method = ''; + let useGet = false; + const headers = {}; + const dataParts = []; + + for (let index = 1; index < tokens.length; index += 1) { + const token = tokens[index]; + if (token === '-X' || token === '--request') { + method = readFlagValue(tokens, ++index, token).toUpperCase(); + continue; + } + if (token === '-H' || token === '--header') { + const header = readFlagValue(tokens, ++index, token); + const separator = header.indexOf(':'); + if (separator <= 0) throw new Error(`Invalid header: ${header}`); + headers[header.slice(0, separator).trim()] = header.slice(separator + 1).trim(); + continue; + } + if (DATA_FLAGS.has(token)) { + const data = readFlagValue(tokens, ++index, token); + if (data.startsWith('@')) throw new Error('File-based cURL data is not supported'); + dataParts.push(data); + continue; + } + if (token === '-G' || token === '--get') { + useGet = true; + continue; + } + if (token === '--url') { + url = readFlagValue(tokens, ++index, token); + continue; + } + if (token === '-u' || token === '--user') { + headers.Authorization = `Basic ${btoa(readFlagValue(tokens, ++index, token))}`; + continue; + } + if (['--compressed', '-s', '--silent', '-L', '--location'].includes(token)) continue; + if (token === '-b' || token === '--cookie') { + headers.Cookie = readFlagValue(tokens, ++index, token); + continue; + } + if (token === '-A' || token === '--user-agent') { + headers['User-Agent'] = readFlagValue(tokens, ++index, token); + continue; + } + if (token === '-e' || token === '--referer') { + headers.Referer = readFlagValue(tokens, ++index, token); + continue; + } + if (token.startsWith('-')) throw new Error(`Unsupported cURL option: ${token}`); + if (url) throw new Error('cURL command contains more than one URL'); + url = token; + } + + if (!url) throw new Error('cURL command does not contain a URL'); + let body = dataParts.length ? dataParts.join('&') : undefined; + if (useGet && body) { + const target = new URL(url); + target.search += `${target.search ? '&' : ''}${body}`; + url = target.toString(); + body = undefined; + } + return { url, method: method || (body ? 'POST' : 'GET'), headers, ...(body === undefined ? {} : { body }) }; +} + +function tokenizeCurl(command) { + if (!command) throw new Error('cURL command is empty'); + const normalized = command.replace(/\\\r?\n/g, ' '); + const tokens = []; + let current = ''; + let quote; + + for (let index = 0; index < normalized.length; index += 1) { + const character = normalized[index]; + if (quote) { + if (character === quote) quote = undefined; + else if (character === '\\' && quote === '"' && index + 1 < normalized.length) current += normalized[++index]; + else current += character; + continue; + } + if (character === "'" || character === '"') { + quote = character; + continue; + } + if ( + character === '|' || + character === ';' || + character === '<' || + character === '>' || + character === '`' || + (character === '$' && normalized[index + 1] === '(') + ) { + throw new Error('Shell operators are not supported'); + } + if (/\s/.test(character)) { + if (current) { + tokens.push(current); + current = ''; + } + continue; + } + if (character === '\\' && index + 1 < normalized.length) { + current += normalized[++index]; + continue; + } + current += character; + } + + if (quote) throw new Error('cURL command contains an unclosed quote'); + if (current) tokens.push(current); + return tokens; +} + +function readFlagValue(tokens, index, flag) { + const value = tokens[index]; + if (value === undefined) throw new Error(`${flag} requires a value`); + return value; +} + +function sanitizeRequestHeaders(headers) { + return Object.entries(headers ?? {}).reduce((safeHeaders, [name, value]) => { + const normalizedName = name.trim().toLowerCase(); + if (!normalizedName || BLOCKED_REQUEST_HEADERS.has(normalizedName)) return safeHeaders; + safeHeaders[normalizedName] = value; + return safeHeaders; + }, {}); +} + +function compareJson(devJson, qaJson, prodJson, ignoreFields, comparedEnvironments) { + const environments = [ + { key: 'devValue', active: comparedEnvironments.dev, root: devJson, values: comparedEnvironments.dev ? flatten(devJson) : {} }, + { key: 'qaValue', active: comparedEnvironments.qa, root: qaJson, values: comparedEnvironments.qa ? flatten(qaJson) : {} }, + { key: 'prodValue', active: comparedEnvironments.prod, root: prodJson, values: comparedEnvironments.prod ? flatten(prodJson) : {} }, + ].filter((environment) => environment.active); + + const paths = Array.from(new Set(environments.flatMap((environment) => Object.keys(environment.values)))).sort((left, right) => + left.localeCompare(right), + ); + + return paths.reduce((diffs, path) => { + if (isIgnoredPath(path, ignoreFields)) return diffs; + const values = environments.map((environment) => ({ + ...environment, + comparable: getComparableValue(environment.root, environment.values, path), + })); + const baseline = values[0].comparable; + const diffsByType = new Map(); + + values.slice(1).forEach(({ key, comparable }) => { + const type = getDiffType(baseline, comparable); + if (!type) return; + let diff = diffsByType.get(type); + if (!diff) { + diff = { path, type }; + if (baseline.found) diff[values[0].key] = baseline.value; + diffsByType.set(type, diff); + } + if (comparable.found) diff[key] = comparable.value; + }); + + diffs.push(...diffsByType.values()); + return diffs; + }, []); +} + +function flatten(value) { + const result = {}; + visit(value, '', result); + return result; +} + +function visit(value, path, result) { + if (Array.isArray(value)) { + if (value.length === 0) { + result[path] = value; + return; + } + value.forEach((item, index) => visit(item, `${path}[${index}]`, result)); + return; + } + if (value && typeof value === 'object') { + const entries = Object.entries(value); + if (entries.length === 0) { + result[path] = value; + return; + } + entries.forEach(([key, childValue]) => visit(childValue, path ? `${path}.${key}` : key, result)); + return; + } + result[path] = value; +} + +function getDiffType(baseline, target) { + if (!baseline.found && !target.found) return undefined; + if (!baseline.found) return 'ADDED'; + if (!target.found) return 'REMOVED'; + if (JSON.stringify(baseline.value) === JSON.stringify(target.value)) return undefined; + if (baseline.value === null || target.value === null) return 'CHANGED'; + return getJsonType(baseline.value) === getJsonType(target.value) ? 'CHANGED' : 'TYPE_CHANGE'; +} + +function getComparableValue(root, flattened, path) { + if (Object.prototype.hasOwnProperty.call(flattened, path)) { + return { found: true, value: flattened[path] }; + } + return getValueAtPath(root, path); +} + +function getValueAtPath(root, path) { + if (path === '') return { found: true, value: root }; + const segments = path.match(/[^.[\]]+/g); + if (!segments) return { found: false, value: undefined }; + let current = root; + + for (const segment of segments) { + if (current === null || typeof current !== 'object') return { found: false, value: undefined }; + if (Array.isArray(current)) { + const index = Number(segment); + if (!Number.isInteger(index) || index < 0 || index >= current.length) return { found: false, value: undefined }; + current = current[index]; + } else { + if (!Object.prototype.hasOwnProperty.call(current, segment)) return { found: false, value: undefined }; + current = current[segment]; + } + } + return { found: true, value: current }; +} + +function isIgnoredPath(path, ignoreFields) { + if (!ignoreFields.length) return false; + const segments = path.split(/[.[\]]+/).filter(Boolean); + return segments.some((segment) => ignoreFields.includes(segment)); +} + +function getJsonType(value) { + if (value === null) return 'null'; + if (Array.isArray(value)) return 'array'; + return typeof value; +} + +function generateSuggestions() { + if (!state.diffs.length) { + showStatus('Compare responses before generating ignore rules.'); + return; + } + state.suggestions = generateIgnoreSuggestions(state.diffs); + if (!state.suggestions.length) showStatus('No volatile ignore rules detected.'); + renderSuggestions(); +} + +function generateIgnoreSuggestions(diffs) { + const changedDiffs = diffs.filter((diff) => diff.type === 'CHANGED'); + const pathFrequencies = countNormalizedPaths(changedDiffs); + const suggestions = new Map(); + + changedDiffs.forEach((diff) => { + const normalizedPath = normalizeArrayPath(diff.path); + const reasons = []; + let score = 0; + const nameResult = scoreFieldName(diff.path); + score += nameResult.score; + if (nameResult.reason) reasons.push(nameResult.reason); + const valueResult = scoreValues([diff.devValue, diff.qaValue, diff.prodValue]); + score += valueResult.score; + if (valueResult.reason) reasons.push(valueResult.reason); + if (looksLikeNoisyPath(diff.path)) { + score += 20; + reasons.push('path belongs to a noisy metadata area'); + } + const frequency = pathFrequencies.get(normalizedPath) ?? 0; + if (frequency >= 10) { + score += 30; + reasons.push('field changes repeatedly across 10 or more array items'); + } else if (frequency >= 3) { + score += 20; + reasons.push('field changes repeatedly across array items'); + } else if (frequency >= 2) { + score += 10; + reasons.push('field changes repeatedly across array items'); + } + if (score < SUGGESTION_THRESHOLD) return; + const suggestion = { path: normalizedPath, score, confidence: getConfidence(score), reason: reasons.join(', ') }; + const existing = suggestions.get(normalizedPath); + if (!existing || suggestion.score > existing.score) suggestions.set(normalizedPath, suggestion); + }); + + return Array.from(suggestions.values()).sort((left, right) => right.score - left.score || left.path.localeCompare(right.path)); +} + +function countNormalizedPaths(diffs) { + return Array.from(new Set(diffs.map((diff) => diff.path))).reduce((frequencies, diffPath) => { + const path = normalizeArrayPath(diffPath); + frequencies.set(path, (frequencies.get(path) ?? 0) + 1); + return frequencies; + }, new Map()); +} + +function scoreFieldName(path) { + const leaf = getIgnoreFieldFromPath(path); + if (!leaf) return { score: 0 }; + if (STRONG_VOLATILE_NAME_PATTERNS.some((pattern) => pattern.test(leaf))) return { score: 50, reason: 'field name looks dynamic' }; + if (TEMPORAL_NAME_PATTERN.test(leaf)) return { score: 25, reason: 'field name looks time-based' }; + if (WEAK_IDENTIFIER_NAME_PATTERN.test(leaf)) return { score: 20, reason: 'field name looks like a generated identifier' }; + return { score: 0 }; +} + +function scoreValues(values) { + return values.map(scoreValue).sort((left, right) => right.score - left.score)[0]; +} + +function scoreValue(value) { + const text = typeof value === 'number' ? String(value) : value; + if (typeof text !== 'string') return { score: 0 }; + if (UUID_PATTERN.test(text)) return { score: 40, reason: 'value looks like a UUID' }; + if (ISO_DATETIME_PATTERN.test(text)) return { score: 40, reason: 'value looks time-based' }; + if (EPOCH_PATTERN.test(text)) return { score: 35, reason: 'value looks like an epoch timestamp' }; + if (PREFIXED_IDENTIFIER_PATTERN.test(text)) return { score: 30, reason: 'value looks like a generated identifier' }; + if (TOKEN_PATTERN.test(text)) return { score: 30, reason: 'value looks like a generated token' }; + return { score: 0 }; +} + +function normalizeArrayPath(path) { + return path.replace(/\[\d+\]/g, '[*]'); +} + +function getIgnoreFieldFromPath(path) { + const segments = path.match(/[^.[\]]+/g); + const leaf = segments?.at(-1); + return leaf && leaf !== '*' && !/^\d+$/.test(leaf) ? leaf : undefined; +} + +function looksLikeNoisyPath(path) { + const segments = path.toLowerCase().split(/[.[\]]+/).filter(Boolean); + return segments.some((segment) => NOISY_PATH_SEGMENTS.has(segment)); +} + +function getConfidence(score) { + if (score >= 80) return 'High'; + if (score >= SUGGESTION_THRESHOLD) return 'Medium'; + return 'Low'; +} + +function render() { + updateCounts(); + renderModeAndView(); + renderTable(); + renderTrees(); + renderSuggestions(); + elements.contractAlert.classList.toggle('hidden', !state.diffs.some((diff) => ['ADDED', 'REMOVED', 'TYPE_CHANGE'].includes(diff.type))); +} + +function renderModeAndView() { + document.querySelectorAll('.count').forEach((button) => { + button.classList.toggle('active', button.dataset.filter === state.filter); + }); + document.querySelectorAll('.view-button').forEach((button) => { + button.classList.toggle('active', button.dataset.view === state.view); + }); + elements.tableView.classList.toggle('hidden', state.view !== 'table'); + elements.treeView.classList.toggle('hidden', state.view !== 'tree'); +} + +function renderTable() { + const visibleDiffs = getVisibleDiffs(); + if (!visibleDiffs.length) { + elements.diffTable.innerHTML = `${state.diffs.length ? 'No matching differences.' : 'No comparison yet.'}`; + return; + } + elements.diffTable.innerHTML = visibleDiffs + .map( + (diff) => ` + + ${escapeHtml(diff.path || '(root)')} + ${escapeHtml(diff.type)} + ${escapeHtml(formatValue(diff.devValue))} + ${escapeHtml(formatValue(diff.qaValue))} + ${escapeHtml(formatValue(diff.prodValue))} + + `, + ) + .join(''); +} + +function renderTrees() { + ENVIRONMENTS.forEach(({ id }) => { + const value = state.active[id] ? state.compared[id] : undefined; + elements[`${id}Tree`].innerHTML = value === undefined ? '
No active input.
' : renderTreeNode(value, id, '', '(root)', true); + }); +} + +function renderTreeNode(value, environmentId, path, label, isRoot = false) { + const diff = selectTreeDiff(path, environmentId); + const className = diff ? diff.type : ''; + if (Array.isArray(value)) { + const children = value.length + ? value.map((item, index) => renderTreeNode(item, environmentId, `${path}[${index}]`, `[${index}]`)).join('') + : '
[]
'; + return `
+
${escapeHtml(label)}Array(${value.length})
${children} +
`; + } + if (value && typeof value === 'object') { + const entries = Object.entries(value); + const children = entries.length + ? entries.map(([key, childValue]) => renderTreeNode(childValue, environmentId, path ? `${path}.${key}` : key, key)).join('') + : '
{}
'; + return `
+
${escapeHtml(label)}Object
${children} +
`; + } + return `
+
${escapeHtml(label)}${escapeHtml(formatValue(value))}
+
`; +} + +function selectTreeDiff(path, environmentId) { + const key = `${environmentId}Value`; + return state.diffs.find((diff) => diff.path === path && Object.prototype.hasOwnProperty.call(diff, key)); +} + +function renderSuggestions() { + elements.suggestions.classList.toggle('hidden', !state.suggestions.length); + elements.suggestions.innerHTML = state.suggestions + .map((suggestion) => { + const leaf = getIgnoreFieldFromPath(suggestion.path) ?? suggestion.path; + return `
+
${escapeHtml(suggestion.path)}
${escapeHtml(suggestion.confidence)} · ${suggestion.score} · ${escapeHtml(suggestion.reason)}
+ +
`; + }) + .join(''); + elements.suggestions.querySelectorAll('[data-add-ignore]').forEach((button) => { + button.addEventListener('click', () => addIgnoreField(button.dataset.addIgnore)); + }); +} + +function addIgnoreField(field) { + const fields = new Set(getIgnoreFields()); + fields.add(field); + elements.ignoreFields.value = Array.from(fields).join(', '); + persistDraft(); + showStatus(`Added ${field} to ignored fields. Compare again to apply it.`); +} + +function updateCounts() { + elements.countAll.textContent = String(state.diffs.length); + elements.countAdded.textContent = String(countType('ADDED')); + elements.countRemoved.textContent = String(countType('REMOVED')); + elements.countChanged.textContent = String(countType('CHANGED')); + elements.countType.textContent = String(countType('TYPE_CHANGE')); +} + +function getVisibleDiffs() { + const query = elements.pathSearch.value.trim().toLowerCase(); + return state.diffs.filter((diff) => { + const matchesFilter = state.filter === 'ALL' || diff.type === state.filter; + const matchesSearch = !query || diff.path.toLowerCase().includes(query); + return matchesFilter && matchesSearch; + }); +} + +function countType(type) { + return state.diffs.filter((diff) => diff.type === type).length; +} + +function copyDiffs() { + navigator.clipboard.writeText(JSON.stringify(state.diffs, null, 2)); + showStatus('Copied diff JSON.'); +} + +function downloadJson() { + downloadBlob(new Blob([JSON.stringify(state.diffs, null, 2)], { type: 'application/json' }), 'api-diff.json'); +} + +function downloadExcel() { + const header = ['Path', 'Type', 'Dev', 'QA', 'Prod']; + const rows = state.diffs.map((diff) => [diff.path, diff.type, formatValue(diff.devValue), formatValue(diff.qaValue), formatValue(diff.prodValue)]); + const html = `${[header, ...rows] + .map((row) => `${row.map((cell) => ``).join('')}`) + .join('')}
${escapeHtml(cell)}
`; + downloadBlob(new Blob([html], { type: 'application/vnd.ms-excel' }), 'api-diff.xls'); +} + +function downloadBlob(blob, fileName) { + const url = URL.createObjectURL(blob); + const anchor = document.createElement('a'); + anchor.href = url; + anchor.download = fileName; + anchor.click(); + URL.revokeObjectURL(url); +} + +function clearSourceDerivedState() { + state.diffs = []; + state.suggestions = []; + state.filter = 'ALL'; + state.compared = { dev: undefined, qa: undefined, prod: undefined }; + state.active = { dev: false, qa: false, prod: false }; + render(); +} + +function resetAll() { + state.urlController?.abort(); + state.curlController?.abort(); + draftIds.forEach((id) => { + elements[id].value = ''; + }); + state.mode = 'json'; + state.view = 'table'; + state.theme = 'light'; + setMode('json'); + applyTheme(); + clearSourceDerivedState(); + clearStatus(); + extensionApi.storage.local.remove('draft'); +} + +function setLoading(kind, isLoading) { + const button = kind === 'url' ? elements.fetchButton : elements.curlButton; + button.disabled = isLoading; + button.textContent = isLoading ? 'Comparing...' : kind === 'url' ? 'Fetch & Compare' : 'Import cURL & Compare'; +} + +function getEnvironmentInputValues(suffix) { + return Object.fromEntries(ENVIRONMENTS.map(({ id }) => [id, elements[`${id}${suffix}`].value.trim()])); +} + +function getIgnoreFields() { + return elements.ignoreFields.value + .split(',') + .map((field) => field.trim()) + .filter(Boolean); +} + +function showStatus(message) { + elements.status.textContent = message; +} + +function clearStatus() { + showStatus(''); +} + +function formatValue(value) { + if (value === undefined) return '-'; + if (typeof value === 'string') return value; + return JSON.stringify(value); +} + +function escapeHtml(value) { + return String(value) + .replaceAll('&', '&') + .replaceAll('<', '<') + .replaceAll('>', '>') + .replaceAll('"', '"') + .replaceAll("'", '''); +} + +function isAbortError(error) { + return error instanceof DOMException && error.name === 'AbortError'; +} + +function persistDraft() { + const draft = Object.fromEntries(draftIds.map((id) => [id, elements[id].value])); + draft.mode = state.mode; + draft.view = state.view; + draft.theme = state.theme; + extensionApi.storage.local.set({ draft }); +} + +async function restoreDraft() { + const stored = await extensionApi.storage.local.get('draft'); + const draft = stored.draft ?? {}; + draftIds.forEach((id) => { + elements[id].value = draft[id] ?? ''; + }); + state.view = draft.view === 'tree' ? 'tree' : 'table'; + state.theme = draft.theme === 'dark' ? 'dark' : 'light'; + applyTheme(); + setMode(['json', 'url', 'curl'].includes(draft.mode) ? draft.mode : 'json'); +} diff --git a/browser-extension/edge/store-listing.md b/browser-extension/edge/store-listing.md new file mode 100644 index 0000000..41eceb2 --- /dev/null +++ b/browser-extension/edge/store-listing.md @@ -0,0 +1,91 @@ +# Microsoft Edge Add-ons Listing Draft + +## Product Details + +Name: +API Response Comparator + +Short description: +Compare JSON API responses across Dev, QA, and Prod from a Microsoft Edge popup. + +Detailed description: +API Response Comparator helps developers and QA teams spot API response drift before it reaches users. Paste JSON, upload response files, fetch HTTPS API URLs, or import safe cURL commands, then compare Dev, QA, and Prod responses from a compact Microsoft Edge extension popup. + +The first populated environment in Dev, QA, Prod order becomes the baseline. The extension flattens nested JSON paths and reports `ADDED`, `REMOVED`, `CHANGED`, and `TYPE_CHANGE` differences. Any two environments are enough, so you can compare Dev vs QA, QA vs Prod, or all three together. + +Features: +- Manual JSON paste, format, upload, and clear controls +- Direct HTTPS URL fetch comparison +- Safe cURL parsing with structured browser fetch execution +- Optional third environment +- Ignore leaf fields and generate volatility-based ignore suggestions +- Separate rows when one path has different outcome types +- Contract-change alert for added, removed, or type-changed fields +- Count filters and path search +- Table and color-coded JSON tree views +- Copy, JSON download, and Excel-compatible export +- Full reset with in-flight request cancellation +- Light and dark themes + +The extension runs locally in the browser. It does not use analytics, ads, tracking, or a remote app backend. + +Category: +Developer tools + +Language: +English + +## Graphic Assets + +Extension package icons: +- `assets/icons/icon-16.png` +- `assets/icons/icon-32.png` +- `assets/icons/icon-48.png` +- `assets/icons/icon-128.png` + +Store icon: +- `assets/store/store-icon-128.png` + +Screenshots: +- `assets/store/screenshot-1-json-compare-1280x800.png` +- `assets/store/screenshot-2-url-curl-1280x800.png` +- `assets/store/screenshot-3-tree-view-1280x800.png` + +Promotional images: +- Small promo tile: `assets/store/small-promo-440x280.png` +- Marquee promo tile: `assets/store/marquee-promo-1400x560.png` + +## Privacy Practices + +Single purpose: +Compare JSON API responses across Dev, QA, and Prod so developers can identify response value changes and API contract changes. + +Permission justification: + +`storage`: +Stores draft inputs and UI preferences locally in Edge extension storage so users do not lose in-progress comparisons when the popup closes. + +`clipboardWrite`: +Lets the user copy generated diff JSON to the clipboard after clicking the Copy button. + +`https://*/*` host permission: +Allows the extension to fetch user-entered HTTPS API URLs and HTTPS cURL targets for comparison. The extension only sends requests when the user clicks Fetch & Compare or Import cURL & Compare. + +Data collection disclosure: +The extension does not collect, sell, share, or transmit user data to the developer or third-party analytics services. JSON payloads, URLs, cURL commands, ignore fields, and UI preferences remain in the browser except when the user explicitly fetches a user-entered HTTPS API endpoint. + +Privacy policy summary: +API Response Comparator stores draft comparison inputs locally in the browser and sends network requests only to HTTPS API endpoints the user provides. It does not collect analytics, sell data, share data with the developer, or transmit comparison data to a separate backend. + +## Test Instructions + +1. Load the extension in Microsoft Edge and open the toolbar popup. +2. In JSON mode, paste two JSON objects into Dev and QA, then click Compare. +3. Verify that the table reports changed paths and that Tree view highlights the changed values. +4. In URL mode, enter two HTTPS endpoints that return JSON and click Fetch & Compare. +5. In cURL mode, paste two HTTPS cURL commands and click Import cURL & Compare. +6. Verify Copy, JSON export, Excel export, ignore fields, path search, theme toggle, and Reset. + +## Submission Notes + +Current package behavior intentionally differs from the Next.js app proxy: the Edge extension performs browser extension fetches directly using HTTPS host permissions. Browser-restricted headers are filtered from cURL imports before fetch. From bf2508e47fa0896aeddf8bf7bd885041a7cb6381 Mon Sep 17 00:00:00 2001 From: Arnab Nandy Date: Sun, 28 Jun 2026 23:25:46 +0530 Subject: [PATCH 4/5] Safari extension --- browser-extension/safari/README.md | 42 + .../safari/web-extension/README.md | 47 + .../web-extension/assets/icons/icon-128.png | Bin 0 -> 1659 bytes .../web-extension/assets/icons/icon-16.png | Bin 0 -> 462 bytes .../web-extension/assets/icons/icon-32.png | Bin 0 -> 603 bytes .../web-extension/assets/icons/icon-48.png | Bin 0 -> 826 bytes .../assets/store/marquee-promo-1400x560.png | Bin 0 -> 102372 bytes .../screenshot-1-json-compare-1280x800.png | Bin 0 -> 30699 bytes .../store/screenshot-2-url-curl-1280x800.png | Bin 0 -> 30571 bytes .../store/screenshot-3-tree-view-1280x800.png | Bin 0 -> 24732 bytes .../assets/store/small-promo-440x280.png | Bin 0 -> 29172 bytes .../assets/store/store-icon-128.png | Bin 0 -> 1659 bytes .../safari/web-extension/manifest.json | 24 + .../safari/web-extension/popup.css | 496 ++++++++ .../safari/web-extension/popup.html | 180 +++ .../safari/web-extension/popup.js | 1039 +++++++++++++++++ .../safari/web-extension/store-listing.md | 106 ++ 17 files changed, 1934 insertions(+) create mode 100644 browser-extension/safari/README.md create mode 100644 browser-extension/safari/web-extension/README.md create mode 100644 browser-extension/safari/web-extension/assets/icons/icon-128.png create mode 100644 browser-extension/safari/web-extension/assets/icons/icon-16.png create mode 100644 browser-extension/safari/web-extension/assets/icons/icon-32.png create mode 100644 browser-extension/safari/web-extension/assets/icons/icon-48.png create mode 100644 browser-extension/safari/web-extension/assets/store/marquee-promo-1400x560.png create mode 100644 browser-extension/safari/web-extension/assets/store/screenshot-1-json-compare-1280x800.png create mode 100644 browser-extension/safari/web-extension/assets/store/screenshot-2-url-curl-1280x800.png create mode 100644 browser-extension/safari/web-extension/assets/store/screenshot-3-tree-view-1280x800.png create mode 100644 browser-extension/safari/web-extension/assets/store/small-promo-440x280.png create mode 100644 browser-extension/safari/web-extension/assets/store/store-icon-128.png create mode 100644 browser-extension/safari/web-extension/manifest.json create mode 100644 browser-extension/safari/web-extension/popup.css create mode 100644 browser-extension/safari/web-extension/popup.html create mode 100644 browser-extension/safari/web-extension/popup.js create mode 100644 browser-extension/safari/web-extension/store-listing.md diff --git a/browser-extension/safari/README.md b/browser-extension/safari/README.md new file mode 100644 index 0000000..075f81c --- /dev/null +++ b/browser-extension/safari/README.md @@ -0,0 +1,42 @@ +# API Response Comparator Safari Extension + +Safari Web Extensions are distributed as part of a native macOS/iOS app wrapper. +This repo contains the web extension source under `web-extension/`; the final +Safari extension bundle must be generated with Xcode on macOS. + +## What Is Included + +- `web-extension/`: Safari-compatible web extension source copied from the + Chromium package. +- `web-extension/assets/`: icons, screenshots, and promotional source images. +- `web-extension/store-listing.md`: App Store listing, privacy, and reviewer + notes draft. + +## Convert With Xcode On macOS + +From the repo root on macOS: + +```bash +xcrun safari-web-extension-converter browser-extension/safari/web-extension \ + --project-location browser-extension/safari/xcode +``` + +Then: + +1. Open the generated Xcode project. +2. Set bundle identifiers and signing team. +3. Run the containing app. +4. Open Safari settings and enable the extension. +5. Archive the app in Xcode for App Store Connect or TestFlight. + +## Important Limitations In This Workspace + +This Windows workspace can prepare the source package and assets, but it cannot +create, sign, archive, notarize, or upload the final Safari app bundle. Those +steps require Xcode on macOS and an Apple Developer account. + +## Source Package + +The source can be zipped and moved to a Mac for conversion. Make sure the zip +contains the contents of `web-extension/`, not an extra parent folder, when using +it as converter input. diff --git a/browser-extension/safari/web-extension/README.md b/browser-extension/safari/web-extension/README.md new file mode 100644 index 0000000..8580e61 --- /dev/null +++ b/browser-extension/safari/web-extension/README.md @@ -0,0 +1,47 @@ +# API Response Comparator Safari Web Extension Source + +This folder contains the browser-extension source that can be converted into a +Safari Web Extension with Xcode on macOS. + +Safari distribution requires an Apple app wrapper. Use this source folder as the +input for Apple's Safari Web Extension Converter. + +## Local Conversion On macOS + +```bash +xcrun safari-web-extension-converter browser-extension/safari/web-extension \ + --project-location browser-extension/safari/xcode +``` + +Then open the generated Xcode project, configure signing, run the containing app, +and enable the extension in Safari. + +## Current Scope + +- Safari Web Extension popup source +- Manual JSON paste, format, file upload, and per-input clear controls +- Direct HTTPS URL fetch comparison from the extension popup +- Safe cURL parsing and structured browser fetch execution +- Optional Dev, QA, and Prod comparison with any two inputs +- Ignore leaf fields and volatility-based ignore suggestions +- `ADDED`, `REMOVED`, `CHANGED`, and `TYPE_CHANGE` rows +- Separate rows when one path has different outcome types +- Contract-change alert +- Diff counts, type filters, and path search +- Table view and color-coded JSON tree view +- Copy, JSON download, and Excel-compatible `.xls` download +- Full reset with in-flight URL and cURL request invalidation +- Light and dark themes +- Local draft persistence with extension storage + +## Notes + +- This source fetches HTTPS API URLs directly using browser extension host + permissions instead of the Next.js app server proxy. +- cURL imports are parsed into structured requests. Shell operators and + file-based request bodies are rejected; browser-restricted headers are + filtered before fetch. +- The popup script uses `browser` when available and falls back to `chrome` so + the code stays portable across browser extension runtimes. +- The final Safari app/extension bundle must be created, signed, and archived + with Xcode on macOS. diff --git a/browser-extension/safari/web-extension/assets/icons/icon-128.png b/browser-extension/safari/web-extension/assets/icons/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..8658432dfab6bebdaeaef4235d12981e9e4caeff GIT binary patch literal 1659 zcmZ8hc~BE}6a57tM2-~XiX3t%Rv@F*FC672hSM4#C4{IPwtfV#5GuFQhNDElhD%VC zf+3QETEbysEC~{d7HbqRs34{MRZ&nR8Ws$*Z91eut#-gQZAI|H=WsJWke$(Y$SEuFA2P`l$#>%p z>7VvKbd?PZ4CursZ8ra3qsP5sj(K$SP8L|4zCo*0?p$@@9PoLxnru%hsJn@s6{p&5 zWVtRDCA(Lya4mAU>gt@Bx`2a(zHg;Z8ByE(hwih>xa(FV^sJU-VvkF zOLJdA9QM6DX%+(;K|E{jbLg_4|BQZ1D$@ zb;+~UMv+u+M`Vg=@e2DX_01V+X6{Tn!sUcRZ5M8UWZWLwa0T>= z+1&t-a-Z;|tIgcLeui5vwfaMuOhT8vtwBt1erwoD6A0W*j?Z^Hl_K3zi69(_tyGvPC z8~mKZs$Am3clwI;Z5U9BgR9zsUT$P3%r`uSBG0DpQxsm2DHv(k@425(%XT9*!iryh zC8@HUj`L7>XbSW+Z77By@eX-QZ0SB}nYQA=yzs6}N$G4m1;|^NGtlu%v%=N2c0bkE z!~q~2{7Cq^5CjQz1#{zBk`MQERn7}v#U9(f?6Liy?omC!;I@`Ax)O4q;HhP-p;6HT z^R=}DMPXL}|CUMadSUNihsjU%N3_7c!o}uDh|Pk#TWpe9o_R5d+N%-wD=cru4qQ0* zk3fmJ`BTT00c1-<;GjXb)%a|?L7t{T-kSg4b2|*rYjtr2Zb-CH0*#Y5h=?sAW;$)r zj0_#$T=Z-Oyw7jW(?5oXIcWmi_of7$ouH?;L)H2JYYUd13|+dCSp)C;a!S5sm0R6q zegV!=^ zCyqJOC|kC;|I(h6wvkDixqW>8gn8`xi6Ne#|HPzQ_9_R+$!OTzh@a=E6Jo}S0(qZT*gjs z+*cpo^sujlIF51Ddu^H!_@fzXKC{95z)NZ9fu-^RO;?fvQC&6{zIe5XnBQPJYZ^|v zW__tyX)F3hcrsQ$QqnB1)ru>{cPm4Sxzxn`-z?y19XO|rT|W)=^jg5>Lr0|?7IMnl zMBwMdeKXQa<6DgxCZu?N#6MqrgdPip-Xgv>>4C66OShAm$Sl9uzf_*oF+N=6QaYId zX)r)7Wje06xWb?8|8z0yDfVF32=7q0oF7ly)nI71;n*!==R_83dqo{fcxTe4_1;DV u#qmp~TV0}+uB_W__|tXT|NX>(9=!I+N`Fw10YbXCnGE*FVp!<7g1-P0ss>~L literal 0 HcmV?d00001 diff --git a/browser-extension/safari/web-extension/assets/icons/icon-16.png b/browser-extension/safari/web-extension/assets/icons/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..bf6900f3683eb84ff271e06d36a1674dafd5d4dd GIT binary patch literal 462 zcmV;<0WtoGP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0b@x-K~y+TV_+C` zfWIW)fWIuafWI`i0Rxxi7VwtkTA=HJ1HRI{e*Ut&|Aa7KS>Aedy$t;2`3@jSf$sYM zA{*xa7um540}F3j@L#aM8DdaLP6CPnd?k4m0u=>dMV5!R{P#b#2Lpq|g|{vF&tF~m zALJzz13&@-b*2BMcdh)t_2sGmRo-g<r~Kcz_Rzs=P1|Bt+V`G4!n$6$GoI-CZ8 zox3>izmQEHf*sw2;uX9GfNZ#RWA=aFsw4lw;Ng=0z5z@AKm7my|E(_{iF84UBa*F6 z|AoY(NOQsRll}i~yr=(P`}XDkBNwOtw=7uyUwO|O!Uljs7Zl1KCno&Y6j%GNIcv{< zyCk*$LP?WQT~Jek&48Q$Q2Yu`??O?Gj)mqf<^1OY@F{6H{I3e}T3d zOx#coNr|Po_xbbl1yBtDxgtMb0FPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0q{vgK~z{rV_+Bs zqks^okLTbo&v)Q2&21nVgY@O+3!ocG6aZ=DE6bbDUzYcu3V1tLNtOh<9XJ6YfhMEol#pQ?J zKmWtQ!zKTHtBxSp0ZaZrM96{xNImV+K#3!gubci0iAQ0op=JnRV0uRZCI_Mb_~lYbHMzG7>1F9g_ceu!2u;X2{6Ti{mmGLk%K{P1DKh7 zC3zL-cA@}Ks|D^_P$;aLg<&8`c*Fev0u=>F4#@RDw-W>KmF1p?X#i;!oZJqMM^drS zte*e;)rE-QFUxxlYUHBZhXMFY@(uV)^S&d81T`>GzJ~!&(}}+f36Wa8%}Sq=yF p@f;wH;G97=&Ius9Z!ikz0RY6TAhZ_Qd8_~c002ovPDHLkV1fe@{ow!r literal 0 HcmV?d00001 diff --git a/browser-extension/safari/web-extension/assets/icons/icon-48.png b/browser-extension/safari/web-extension/assets/icons/icon-48.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7b81a69e06914a854132a8ea00b5b594738bbc GIT binary patch literal 826 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 b&!2we{`Y3RvNePMuDbHtE7o3q+p_-v#{dGC literal 0 HcmV?d00001 diff --git a/browser-extension/safari/web-extension/assets/store/screenshot-1-json-compare-1280x800.png b/browser-extension/safari/web-extension/assets/store/screenshot-1-json-compare-1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6e7340b0ff6a3394473b5a0af319a72ca1b578 GIT binary patch literal 30699 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 literal 0 HcmV?d00001 diff --git a/browser-extension/safari/web-extension/assets/store/screenshot-2-url-curl-1280x800.png b/browser-extension/safari/web-extension/assets/store/screenshot-2-url-curl-1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4c8c5963f6c7898cf375c5879c9f1e1e57620c GIT binary patch literal 30571 zcmeFZcT|&E*Ef72BRJ9=oiPdmI<}c{Bq|C@b;eOdR1{QHN>B$8F@z#L1uH57Dr!VZ zR79l42B9V(O^txm00BY|BtU==(v$aG;HdZgJnvf1THhbf`o8a8Yepc~&MCY8&ffbv z*AMKs(VDM2AA%q)+ueUTK+s(9tLpN3YTyUeSbjE z%UBKB37GVI-`&RoAV|9${$HgU^ZaiJ3WjX|`r}ZD+h`{)>zwBamQ-3TPiwe$ao_5d zTQYvj_0QNXUzzdbx02gFscu_#URnJ8YGH$0szYyh=3fOrq4)OYQ@iImEFWCG>brH{ zw=Q@z_u_KD6@k9Jhz-}{Ag%8b-Bs}_vax`ex@}fGc2?#VWH>oA*)#jtYj*sxx-2pF zDY=wAVi`U?f=f1*2A`f*kZO}lME2mHkk_kh?|}cFP6({`De4NM?)~$(2XuG#*IkJ! z2Vjy_wz__5+h?d(c~vZhR?mL%2haZy{#W)y;~|Ssj!U4dKc3TeDlKy@3HQe=)x)We z{IoSi_17IeQ}%i7jrIYA5*NY8fV2z@PFlbr(*&Ox-;{~5nBFU>Fh<_=S+J}II%?g( ztLIr6;<^o_WBlemdxOm6kiowMBQG6ihi-T(IT#`EIV2R=B)hfVrHVzbn_u=Jcj+}5 z$(FcviUH?)nIO%kWL@&x0N(ErYl=ikfPgBwQMrfrQBt90;^h z@x1(~*zY1j&HJ;3f@`6-_1+K zZ#Z6J*KECNRY%qypER{nNji<6DtKFI*HaA>Kqk-d8`@>@>2(&tzqRM=K?4$-)7BRY z6kas=@e6d?etW}5(|{?5JZs&qO=m7-#;c51q`!{SqqrSIqNbZrFx}OI1nP{@cVDo$^z$euJ0;|)J-E%b~{dZ;MA;c36i`H0tO1tj_y z@LI1)2ZAO12&zUsuyW5lyB?wyW0Ouqp-O|DS!J!d_hf?-f6o^dMTjeBa~Coi1fq0nH7a}nC7aAEKF zF`SU%I@7~W^7e$xOdt6`Pngho4Wn;0nc#X}UwWQTpsg¬f$em?~8(LfLDIU$0wP z81_EFC(BK8oAq2Vn50b2cavNf9(F1b2t1%-X_4o)E%<~GInZ!L=n|mF0ybxu-*M}bI9Zoqxu|1>_UfqZm;Qbz5$XbCw-K=_XsA%#X?M0@wEO`iL zD~KuL&By2hs)&*k&_@?r)$VYsVEfHiuQapx$Ym`->6u;Psv+F`aK0zry4VXIZ~7|C zSgi=b_)jq>P9Wv2m|ZFD`vvJb`;*@;qoUNd!=wEQ%i9aWzUQJ4I%myW?R-LaOi`E4 zSkyDXXl5$#kdkv-pN*ar2sdc5OjWy|b)q_bYjT?pBc;?!In=>HPS<$l^Neb%LnWJv zv)u%bIWNZtz}W6P;P0oajCW$LSG{o^Nu|)%g|YH1A*&#%_hPkVtCGp->hh?z6>6nj znh`$^OmOm?*5j=V2KF8od@SmrjxSuCYQ*E{@pMp{5VZAYc%^5dVgWH_BN|~0X_rB* z2`abltgwbD^f=-drb7v%#&AYTfF8$%8^Mc8@Va3lSJ zj|oJxI0vF9^c@s|1)DR5d}t2pr6;H%(X>)~+{+RxRdAn)efDepKH|H|yABz_~IG#pCRu%&;J z*SSpIrox=YUQ$n!)H=79BuLrQVbw^tFV;!o@tgJ-7F95{m1XX!^vu;puSZ`23s!ZX z28-10Q6H0*423<_WkRi6KEAF z4I~{orh1xwrfB~JIn9mGCa@|l7F@w(h89fl0&%tWsXj${F#l|D-?`Vl&XETofZ@c= zC<1mG1C1E$e0$$gk`D82JW82!Un|0NDnF|kLriZ%cO15Wo|5@!OC!_bnsy^HW|+=p zpD`r2pCzIA4&{eAI9|9jb#hu7?iwo^ea1RXsw*fI@lOPh9MidPM2f8Gmq!WT?RBXe zB$Zc)e_$!194M}mx*!Qo3zf$h2()l8{#|iY1uDhE&O1xBnoljY znIb9_1Wd&;>d6=m4#mzJah8R?>SFHg9AwH8&nk}X$Ne6rJZ62PLi}RutxBE^R*Kw% zGpb^2q;^a(dBLG}7|QkG?j>$kz-5`wYTW&fU(`w~5V8qG-UMQD0x>+1f^O*BB|!(3 zVC9v;B$XH9E5XcB|GUUq!y@@$zrbukr%8{ro@W+GG{&@THx5m(G-%!&S}@+nvSBiB zcGaa{iFIOfr-Ny-%n|k>EVFi%)#4rj=~`Ei z$g_ktK79?j&dQWis7TDi`3QdvWIi>*Obqlg&F}zAMVP3Seq0JsSWDDO#|3?lPbe-< zguEE>N=6fZqSiDC&LRjK-4HrUCj{5Y0oudd*CPk_4|A94tm&bz#uQaNKWIli$76~= znGxf#o%gv3l4ViWkqs0NncqH|3pSw|$q=Heh+A?;PUX8uMg`);vnA+7hEXDUBF$aq zcMZcbSV)YM6n{@I>P>#q1@zjknAWydKY_ZYnbHJG6N*w!Y>$?W`_MTdzh~Ha6qMJ>! zoBqOvXEksLJ}u$lf#{X|-zcsmZW35V-#y9eyBVWqs!*vF(EC|uS)f*$)AMr^LA1Nm z1gCc4S(C@_#iL;d>~5;s7-2tF7?LB%z5Gig55jYfhzM^fxI7CdjO z%(y^MmwsI|eKhs3vg4_h@JROPGP_PZ8p*U#(z(HUIap_4Y44Uo#-=SQ<3!p7(V53n z^i-#CZ=b!X>dxH#%7sP0fy&8IuJn}X7^X8%=OSzSxDS_oT6n7ZcJ;%GkS0s$nNMGQ zg$Dp0X(DusKpIj>W`^PxopO;);xKdt#vGe4Aq7gZKakM1I>(7~>JC5P?9UTH&OWir z94KWOxh2-=^fAIL&9$Qv~qj3-V0#8+>gKl+~A0eDi(8Z3A5g)g6=m?Omt+AH~OfABj3pjq;^v z!JJAhTe-32GG?8?q?gjDG)wbI81xW?hY!bA_K!|48(X|8r?LN)1Y5k2($gPUUKa&4 zO`3Pp=J}LhAL|GX);x-@d?C*>L@veM?4$hTw*Tp9-;&NMV|_x4xgf;Q(ZMjXDbTLd zDxJvn?xfq5P+<_DJuAx%*sw8^c2XL|=zaY6F*NF98Z`nHQc@*)GvZOMwiH@~$;7}) zw6f+E{dnq1tq5;i@ex92=x~`4UfBq&J2Z(}JSE^7j|kQ?sxfT?Pcf0tL?*{tCh0d* z6&(VzxP>HXI)%_r$GntHKBELmMz(&a261jWYF2D^KFd_yB|n(E=Hf3Ti00sX1dFTE zL>lazt4pEAz5}gVrd2#4tU>4{ZtN!MJs-beAF!`$X0G$Bx(>ByN- zHfs7%#rKI4QQ(@goss`T?23uqjV%XM-8rK>iInqiqL3-0W=L9AdXqHIS1e#}KRI&U zS}hZ7!&|^W>v5jJio*0R>S$t*yi)O<;<(Lb*D6lclyU#+ z`$JY4!rXnk5FI0#8@6@t?=IvDX?Xw3)59KHQZbYq9*v>ccyy;^bU%wc-uKgScAz&f zD$(d0SG?$DHg^lOA5T^?zrTVBK1FgwFC-b(gvpQTT;?_QhhkX{S$pZcCjQMZBi%! zcQqqk=*%1(Z9Jfl9Y@tm_lYh@@yIZ9oA=N>X(@bq^gT2aZ=~R;36Lbvh?o!1gMydZ z5khO_`Dv;$+5RsK`zgmW z5gl_ln99G;DU7wij;}*0-mPyA9&oFf(*adb9D2Fh`?4zP0 za}R$jY2w_k7(EGd6UOKqA=MIK^o@{JV4ZX=>ipHt>D=+vkqcv&JL^MhQ4eUeLVnx0 z>B&asWMeb2ob})V)sT-ITg%(g8)QASQb!mTe_V2^)jvsZNBJMj!u8VQJtlQ$pHrB> zDLSlgyl2}mt3#&6pJe=G1@=bW<*_=U<*iY^$Hci`Tqj-T*Ri))d#XT>qJdP3Hbd0@ zeWtrkwHpOB7j^wuf??`G2--E04%CB?mA^B-xU6kHsz1$#zC$0?FAUYwN5+K}rN{P6 zG2YU*9_bX{zVCPD7kwUgmzE&Nc|hD@-43-1`RSv4oKC+4`#x}6f{C*F(m4O6A`m|H zJD&t%G}4L)M3(f)>mTKLm-Ij5rU<>Ct88G5->NQUcw9l&Hc|#Ug49bdF-P4+q4|Yq zCy)kl0X-r~VlgsNz%r8Ko52Zaf>e}8wU+BzzVJuW+yE0WZs@4X1Qf8LHZI?dhMD$Sodr2}oh z4y=5g7bF`eSuX%*Uiff*?P_k)P%wrJpP5sHYqJdgG+iOzi52ZUFJc*AM`q|yH)yLD z4xv|lq~7wzKW2o5_7G@%`C-1-nML&jt9QLv(hT0t!r@3wYeQvbFDBb zeI5-MQ+!2>EKiem%k6BCxlz}y9yD{p?^*?8G(Fs^WXi-Ig{O}`EWEiAmnB8vC6ZL1 z%nJ62sZGOm@~5kLPRS}8sQL{^2AWSfh_zh1(2y*ed`k(vTi3Xn9Cs%_(Sy=>5JPq&@if>n|3ufkD2LJDg0HO=V_Q0QmTRS(c_(>Gmna}s?a0Ymw|m+1&xT$XnJQV zE-XjNE2K|uXIF4|&LPdtD8t$0M?aD0Z5MrH0&%Gaaljaj%D;*_DhNHllZ%K4`|n{s zkOgn`edF5oHZX?vOZ2L)YLgzs^QhxK<;O{s`iV{Hu_w-l|Nfx!SsW2vL^VcJPN65~ z@_PdJ;FsMQ#Lx!Nlw$HQ9RmUxeJiKBkT*baq2)2jVhI`8dv3DGe7V@)6|;^Z zZJjo`L)L({d(A3xmVBICyhXR7J%hAAT!5jj*X`KD0hx?UNwRXv@Cmo8MTa^{e4DT; zVLVDSOo&8%Cy+fU9F2Nafgs$j@Yq+0dUO@DQpUU9h6wGswK03!ZvfKoAQ9ug$Iy4K zr<};HV-AJHk5QN&(?jXwQRB~ID0&LF$-Yk++x}ET-J}%P%ouKu$7N;G9c+9ukrgCw zkyzZc7Ou=DhYy`m?S5sv0$*TdLeLY)LIj}+i!uqxK~z|~PQa6mYmxi40 zNEvv1pZTJNjXqzzSIBfd*@pfkkm3w(HF?dzXq;}U7abIY!}Ea&^O%HuJ+ruj+ zeylWgDl~q_drH!bESVvOMO`2ZR|zL8-+*j)ym50bW<*#rS=GYAm)AMjCt+6<+rF|T z{J`Qz<#ublIzBnDkcjXOj~@@mR>C4nzrVu$k67fnIMjh>sTg`e47c&0ojmFDPix1d zjNkScj@@BchHmsvYB#bLbL(e}(fuAp&lOLnU*S1BDC^`$fs?lkxolW|2^D2U>g7Jb z7x*yqqwio=N??IK#*@;b!itkB23D~mV`2kEetW6--qG`}gBRO`Ep|BVD|ayF6BBkc z7pdUA&}v%r0Hm#dhr@{; zE};gw$rF{oUOdNI##2p49_Jz#Bp?$c&n9X}n&w4gIO;gMXnmR)b!acXUUx! z&QqH|wTJ?KXs?F#c`VF;=DRftu*wWgxk!KSd8(0TBo=#FE&RQ6E zpNe|TU5t-;n&VW>b_`kbro@Gq-LcEk+RctNc+kq8NZtQuZ{74O=J0O9;zgLX2G#8~ z80Cr>NSa|1_`AZ-~SM@P8#rc=Q=w5Dv*ze2@qjgkQM@lGTKq&4=1X%@IY#@owE5zfh zbfnlZ%JE5j^I}%yRN(Vmg4O!u?|TH6&rcobYC$)#`?k~zOj4L{s@Yz#jO(j%oY|v4 zmPCu>dthm7 zhhP5A$caW0IFeM(G;SIL;4kHGko8Shb=%1owFOwOA*x4rm@oYEzm+>u z`X<6dLlJkt$8cU0)L~Z5pk4rXp>;3 zlg;T0>~m|Rkt=l}{)1-k%Tskua2=;PQYpK@sUeARUJi2c0fHMAE-cu`|FPBnUd9{# zk5Gghs6EyFEj0vkBee=PkqVm~PXt73k+NFgcXL=pzFL1m(YMl_R_QREGO zFIaYwe+Z{HX#t==4OTb_6f*GP9;fm(;t6ukQ;#IGfX9Vc5A#^}ZGMA$1wc!DH&5=S zhk-&)cCwlHPtmWrKh!$v=c1F-fER*&YdR+rBjACd#Y*WP>cXoOUT95rJ1c4NsvC||J(!TQW-N$jrWF70=R}#1$qAc=y9035_!IfQzzIb5}~jgb^V{FOv7~%>&jQY$-j9f znAwA~!+UVVa!}uHf7r2>la_*u*qFl?G{HR=RA`&+h6)P?1+;4Z|>U7Jz|}0 zv6h`~a&Qb@;h!)x+6pCG5;jUs?l?{{j;CRoXUa2xbb7E(h8LyhE&g}%7Sz$psB^oy z_oW&wVb8y>*7NH0*NLcgL_g_(xpaBvxO^7%K|VKAgV7U8oqmG8{jklWC*l){D#}VH909%E|8FJIV5L z&QCo9TTp8S((qd<8|+a9g6hJ$!YXm7V2kNt(piO@?~$vk>-wv>s|bX@zsMy~#Wy@x zJ7WC~Hz^`6YNcyNCRzNF)2XAzSRs01BHlDpQu5Z0SX6h2BHu&jE`eSz;f5Aw?bD8U z&u@ee=f`G``EJ81zJ9(@G~eQ)u+g{Vxky87Pdir674;~OW~u6qQY-yQt#t4KW!&uW zVN22D0rG2`r4awFH{`N)l)>)_A0w7KGqWc@k0`-XV z#kE!*(8zOvW|W5V#7dd`O2DS#toxKkiRyMUH_xnZ$9EPGIPGty8bc7&=URrjn=%Da zO*zN|&QzVpDla;%G$WE!S+6dvc@DXlk{(Kd6A{FkBCs;H3r)B6020scMM zbKyz1?@M7{222K&ENcYm&d$lFi^eNYSZY@7=<5B%ko_6#w?vcnX+)wXrc<|Tk;0bY zE)?|vF$E&kfbtD+@;vo;=L7nkmrNcBH{-ocftdI|U#M(|dYPEkct43yV~h-G8+=DO zw|ivkIz(;jATO}EcFDJTK6n=YIAr|FiK)uL-o`M;N_&B;!mM88M48fP68URIj830| zG$W~R`i1Hv%lKA@IupX=wT8
}37jw>==2BiQ}9$>Hl`&-pASk?FM`?qe!Hg(MxS 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 Go&Og&lWLy; literal 0 HcmV?d00001 diff --git a/browser-extension/safari/web-extension/assets/store/screenshot-3-tree-view-1280x800.png b/browser-extension/safari/web-extension/assets/store/screenshot-3-tree-view-1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..193def163195650e9cade5cd099c43934ed4158e GIT binary patch literal 24732 zcmeHvc~n!^-slMy@fJl}d%*#S)mCd&B3K0(65FcWeoj?e0U3fKqA~PRiK6ar*|qC{m#6(K-K!X!aL2oREx;pDuXfVQ`9-S_=<-~HaZu7xY+oSnUY z`!`Q}pZ{{V_q?~4ybVFnyf6N?bsq#-g8$B1HfJ{YAYJ3@!3QdKpZ8}_af|&+@a3(r zPj`I^L1i>+!y(hqzeNAdFBXDq>P`PpJi<>$ASl@Ri>;r2l@KHsi7pgs<2v*PtBmbd z4GSJMqpU2d$IdE9F-|RM=eJs*&crT0*`NJmaHs8)VC(n1%Wkb`^!0V~UGb3T-qCO^ zWQFiom&<40dS|i4`Ov?txl*?A*(1m1i-V#3JQ&OTwUy0e4kzAAI)N+DF;28etI=D@j$snCEEoAsg^RFG`kU{KgK~toaHFDC{2Eb;cNuoNz^!v7&c00 zW=|Tap*z8&njo$rs@4wAaqigbaOPG36fe;d%M3CKgN|1HV20z_jbRGD=i$3!i?|EN zhHO(r3IlUW-58}^H9eI>jZY9WQ5!y#E+<+ziY&&2RHD(2atf!Gc_8K)E}sgFlU!_< z->Kn#aGP8HWaK9>3(Xi5aZn+m{)X89ZF<921^T1ET%hkHzx=_~idj&YegZY+N;AGa zI7-k@gL1i;=}O3>p6M!=Bpr{Fso8bLk8j=bgE+=PdHE`a@ID8wM8nf#_hr}McM0V8 zOymwu{o(1;wGcA;!nFmddEpZ^NspZd{$*DZ+)z~R)uyEChi8V-_3Fm3JtO`Mh5Gkl zHAs)Vk(=MQh%$HTBij^Lf{1PCJV8~KOz-fZCf5${A@pI#_qPXU{?NR4Erg*U5~T#D zAk`VuV~W|Mg69s63Y6z}mOTX}>^Sw`DVpRG4L$r7EXja(_z35_Ov2oFzfSvy7GrmO z9KCKBEf!3V_;9GgwS{}ANPi(*&n%2cKa5HkcZG=AUr)cj7iT9y9YZa8VDaTNMziii zbC04vGQYjO(+`?m4qY|FvhVI%=!_rqU*=(}_uHn_t%W``54*bBx;EH0W%~C|u382I z9Wgz7=o5?e*DQaW-iu2pYEjew+-1^ZPzib?yDgKRtZoX+(+&^UQ+2%KaT-M*Ctl+} zy*pt!G&g>yb!}9Z8e>!v3iAxLdx|JMVMf*7;ZbB2(&(d`ziWCZ4Inapu66AwQ%ac( z;kxv6l_ti9pukbC_`>HK_O32y^XI}Vys6gr^3fz&Imo4Dspk>b< z<7n7y>+cmdq{wp;dibH}uGHw*7mwOM;Kbc>l^Hi4H7mcbh4xX$|i z{vM3gB{LBKOqnq#UpdBbO_qwCd_Ju5XXy5%n%_P90uX4e(4tiDRAoFIkxukfaoRkL z@csg#aX8gSVR(S4P>v(f@i_5#EY7Qn7E2o2V=P6kPRnBMSAZq%uY-`sCCG5_>dIyh zqsZ!jLMO-LVKiNjJWCWPs3%n|ctdp^Sv=^Cov?=Ux0-SF@-~1g<2b4Vo|0WbPu;8A z7t!P)M#OCkk(VpZ-0|P8&^<3Hr1VIP*>xe;CYlxO4(f?%rrNy{@LrZ}3Z63BS?3b5 zlVL~}DBy9dkz@wu*H_eF5Z6%O0hgLv@@lK?z7*+L3&pMTLi`Ifp4!g=HF|KY$p<)nQJd03JPPB7xplsHKQ@;r%+-*Fg|I8> zIfsDm2=T%?1Y-FB!_S@`MJ+OEP&6|COlX&Lk|3WFI@VE~jG8j!Qx2CVB=*h1zvO29 zyfGZ*7SQB1KCq`S&oSaJB|7E&xps+m4Yo;o4mm=P!#adaPv{&rJt2MSP91>K5Bk|J z);47Yp*8DZQ>6c38e0M&5a-eMcwgt21GJxdZq_6$ifzil5`92`khn5!?Y7z0wPa50 zi2=24ldY4U1Ap4pKfZC~V9ABc4m_!!3Gf87nkk`M_T1CR+gg#rr-u(8LAeG%Hj=1e zVt!hX_Z~{LN;zCi z>1sa!;LlDFcLG)fGO3dfCFpLNGp`)7*MF!B=a$H0GQYsAL z^D>?6)CYH_b<-O4vE!_$#B2`i_<6}CT5Mu+IW|m>lkRU36C?~t6-I~?4+#|!y#8$E zrt&;qR%9ZH?1K&w!a~;FeCh-DzAjo-nyP_7&^cf9ns2wGwG1bt=IPU@hI_mX$v3<-!sGX$94+ORb!L$~f#e}RDvaBZ zC?|vu_IonnT5{8;GF2=N{GUA?2615i>vxcZ& zArEz%Qt^-tJ-_-KIy}LjR(_31;*upC{UREf-E^GSFPzv!i<2u((4}F#li?$>!?CDE zF>>$jhRO!Cup{zfb6Ek;Lld9jnRkiiJY}FsjM09cBxc!*A``=Y3>dbc1~TL$Dt@s@ zg0xB&n<&eIate^X_z1sEq?lx*MS{R08eMPKzhSiT(ZoHZ`=S?BXrF{~Q(qfgLMiNx zrHHI+%Xk|UNm;GwJlF9}v8oa{SFSWf_(8k!wUg1TtBv)X>%3}j}O1MTTeE*W{$RuSnQLZ2_ja`x$WJL=f;6!km$2KqNrd<+t zXvQbG#k1+I(v(w|40B^6kXG3K4-Zkhv!PlZs~|~RbOimM-l6JUgW@w5^f}aFA|GO6eb7gX|YR{OR$_e z>9Heam2!{ahNu+-;};E`Iw=*_CG^qZ2ZNUh@^C^lzLMkwe3;w&A5Cijk3q{|#By?5 z2*XviyoxZfP2;Cj)cdX2aazTzkW)rZjwdukg>YXqU@zo}u(XMlEIVyJ9sflK;|4SPWOI$-8yv0%YnORg4%edUB;yd3`Fv~a72rWX-69djI743xKMEwj5XXmVb>mv_BT!fWWy(m9+CM+|)& zO_)L}j}Qxb1-DHinKUDkcMw%YxQ1%%RLmRYU26@5f;LvpsnIQxVFoo-^B2-&!<4!B zF&f6Eaw99PW%Awd!rsUcD$c1(S-Bm%r#`gaASI0`tK`)k8aZZ3GPgiq`C>eMlXSc} zG21)MGapdvrCJ*>8iTZSNh|Zet4f21sa|-`hB_QNpgxe9ck2;vgTYr6$EJvaS_H<4 z`%DF!s!kBl0F+;?0S?L6b}8$0y%@NzhjOtD3Ls25yZh|85lH2TM;Q+OA2c)RK53$c zDT~8D_x9bO;xxx6jdQV?(lm~|hclnfyT{je$Rm^Ofk`awC10pY>oxHeEomg2E5QmL zI%*VqL-;U9v!QR3`ow_80SR)aSNRDA9gp*lp@ofLBaIyHy{vXoe!gIEydU$viNz0^ z4e-TAi?Q*bztKdQ_v{+`2^-+}GkTAcIKDV)tOFfanQ|?0=`Bn*-))Acvb()M4(qAp8qd^3*xb58m zLwrN#awfK6jIVJvT&q9(t5XOqF=B7|F6yThGB|Zdb>zC_bd%ms4&i?)=;$B9wX1+O zyDSUc9UB#5VtZKy7azjsH;}6g0rD8c=|Yuy1rS|b`3Z7ayc)5JmEGLT-`mr_SR3`Q zQS*|Vrb4$i2zO&0fmMI`3$XVG;!xK*?>RwwDmFAW@xDY~EaMJwA{wn#&i%ARu70EM z$uv*AY^6fKHH6N0R%mOjtZ3w^GQj$V&5Q89^BiRdm14@&IHQx=xrqf&({KskD=HmG zg#S{_p{Ew>hfMaH+%-OaPQc%`fqu(@A#qJw8a59nK3k_MeG#%7_Zpz1D3c?TKQHJb z8cWeh?wGL9jYQ7gQADX1=DKLFX{JVRl-a358cQ2#)k@?1rTUzx?xPy5L!uZUYN~su zmsJSu&`4R(CklBgn)+l6*rYLa>a>yo*rJB;pS~db)n2>EQyHdEt7A~hSdxCjb~q)2BCR}x|00!#oK*-pN=)!u9M!K=3r{B{CxS}&I z`pf6j)KB=9GPQ%ce#(tj|EFL3K`ngXMa_h~W<1RJfM@mIcmrI=OSHF5(I1%(qhE3O z`VD_tW167TG4$OT@L$E$ufE@Rf)E}7;k9vfFG`Ao0uY1?M<|L;oMO@BZEaFYqK2%X zI#n?H*(-I;%THWOy-uUdD0W(0R!ebv8}zZkvLkjJFn0 zRUE`^a_HhVt!F6kzGe9%dfd>?wUb{Kt!(1)GxD17<};r&)5z%g(ko$+}*OR$xj zD0swLPFPbqTi`vwD~v5NAvqPe&(jf&0=phWxwnYMC)}l;l`?$i3H!QyYRf$ zu2#_gfb8g5d298{&sNr)=L_HW5QpEy4{Url(f{s{9CD5R zG<5GN5vzFIjRB<}YSO95^PaMcFKut69vjA>suOMq@F|lBGG*Pi+b(aP(ksP6z#C>=>_|tmY&j8;6)t;X1xv&^j1fDb=TWVp?}e)QN!JvTDbG6$=Tj zve;+bqO!YU&CQoMx+)+&Fms`RH>9VvBQ-f3TIMcN(;+4y+(1ze@{hrKuNeO`(uiTK z3ddbYU{H$YMwzlt?mMTqO{c2#VB1$mF>jeODy2snf6}whDhv-8Uhal>DH%YO#8x@~H9Hz<@BFY^bB%l$SyFq>JYjr#dHc(ikvyUY?*l z37tHgn45H3T!1+15QGIgDyCxFlhgA@H4V~34L3vjl$#=Wk-J3nVli=lq^Gx@Bk54O z`29xCBQeDrT~zV0SOP3uvTkU65@(gEDrtQw3(-pt3k5IIdB1HOcTSaaipKSuC)@-^ z?G&7+&DlkAcDm;rs+NbLc@R9vqwE701r z#{KWMzi*cUD?avQ$j-tER|rD=R2YFVemHJQ zTk%yL!Zb|WIXZ1K{mNp2a6peeA*Az@oV<%$&kOCT$YOlvLI&e$4&&wZ@%VmC?35c( ztf*#eOr(Qd`cb*w)XH!tQ~r(yeCpB&>)OrKh0%BoW0<4N#GO*xMV#WIORM+5Plj{3 zy54g1*P{|appD8d<&?uoRF%xKr>C;=6K&-g1!b7~qXWmyk;=SBb0(oU;<1MbB~NJ^ zS*BeMDBVNe-!So-gpn7?K@FptgXNODNI?28vdT(WTdBY%cWbg+D}|$7YH4|%Z2V5k zn7sWuDf`d+l7&pd-jetTlv@lMvxJ>{>1cQR5Illwc}gSpB)VwhTUFA(1MhdpKqM=41knZv)$sP!p6#XnGJO03D0jGCCzA24NCCP?C@=YBI9 zgTDXJy4D+GYbANJ8O)Y}$exU`OnjbWfE|HGwH;_=q$>5jk zSw#hdqI^GevK$jxtxND>xRQ`&9r_l6@P&%;7CmdHpz6^(ATdWFcZbjT)FP;nfFRQI3Wo z2u-3$WK{5^!~x~~n4*Z>h49&%fJ~E9AQEV-f<|<9h}Lzs_5CNNwDMEx+rRpAAXd^l zn-fk?4Q=cHp;-~Im|1ksNgNM{%)ULD>s0CZ{`U;K5I-z-D3v zV@l_kw5F+?CQeb=Yz-0NZ7>Fm8oN4-abBd65PW9XywQGO0L>~RtXly#J!OdJBM+oR zVTDUVfQ*0ETwUlhnfo|%{+@08?E8>*ua;47dYpL5`d~$iblcDE(Kk#LjnK#DlzFfZ z<30T)6LakSj@h%O%#$3p!pLMCpTHwUcgSRqE;nM%))K-&2uOp z#TeWMBvZ*vexJN(l5TSs*Pszmz@#=N5X}7owN25C;(XcT z?V`2<*Qojfgl<-B<+0+TCjet7$U#l2)_g9Z*n?mJXZ_GzoQC(s;vCc!$Z} zxP#T}Trd#R?qP|9wIQKyZY*0pn0p4Px+A-Kr?}r;p5cm2)uZj##s?Qu$CNl3?;8-A zoQgCl3l_wB>GAWN=>8%mykpHLg4OTXkaLZVd{R>BZ>Pzy1dSX+o|*X71|)Dx3$1IJ z8ppXo%j)}wi&dWwxPSQUMsce|uRtP8AD!l@fKSe$o;UG#uW9lcXmZ65TZbtRCKgoh zK7Z;b*>jrl-Fy1I!C=J8-)3|b#qI!d)_Lt;VUPBJeEZKP}8`GlnUJ0VXsYF`>Z;B1qV{guQcjh~75B zCuW9LV5l*rtkZYQWgYHwllc8MJ#9QDMUVOJ(7mCD-^s3i{w-%WbK5Rz;;bF!YN#2; za%kYIt(XJTu$@3Xdf(SnDE&9QVqxiI$^0U*_6#!CL?icg7Ew8)=ZQGB?!qNuvTEs` z63WQqUj0RpI*aeMv0t7SNH&Ok7+Nu3g%}dHVGjHplrJ;(EyQu)BtPbCdcwrLwlD!w zNMx(hf&}4;4La$nWjc4SHp?C+Vz|>N?eV7?cbvf?r)hBKuzx0DyrPX?jC3kU@`*j$ zlePQ)Kf$fJr*8n&hn%^UPJ`gE`Y_$qgK+JD_S_rX${$P3)(u z#2m&cKV*?GV@)d>#QjlUm$b(1wXRK*6*9&sePnzGj9vAC&b)-wyNPd&WnC_wz}=zUAnD2Tj55gZ>mYGqkkg^Hko17cJ&^dlWseT0!1MMiVn4fC(wbyli$CZE zpG5Wso$3MmdG=IcE=1a7y+)or#jd9&&9b{PwDH_|#e4Q^eHt>zAxPo5p@;tkb{Y8G zBD$$Zo~#H#E!tlJrXcpHY>7C18X$(!W~|+QIJ4I)*0mez6>qTu{vJRgiov8A z!s|gGDSg+nr`t@_3J`ZlC6DyJP{UW@s44#f9G7&2t*Di4?zV{T>py62F}N`^o6s)B zr#;hYY2)QbXjG7Y@g()V1ekIV+U)~2YgYlWSmH`}ih%IfL7#tI0dGiS+&Nl5-D2YUBNMYngSeF>)6v=P?&L(y0IHAIMY_uuid^t2`cT;3c@) zy1`o2jv$e=Bgw7$5bV}>PD8hqB16J7n}c=^PJr~)|!2X7L{ zhpMUfO>|Jl~__se?c`M6BK&&{~cSdgrO&INP$PI!*C_ zd91WhI8iCIJ?U?k!bYPxQ#PNO<#P2W=BywP+gA#`zzI6u_y-&>%U_;U*603W!A+og zw%FAD>t30BZ?KbRMs?ks}KvTrQ6ijz+GT>(mu%v4jc4dcXPt$WqrlXh(I(exbeUPNRw}gK zLanp7B(5P}vnwdxzuaNiU1fKA!Ap}14DZ-!n%~so(hho20@o8*al|o;#cGw#+_&b~ zrw2^)VDms+7n#vcqm0;DU9j&E%qI`sYm+geR2XOA1FZH0#PYLC2^1-Q9j1IxjC{6O z9iuRwG2Z#>b=lQ9slXabI@{r)qtqL-^iu{r`4;uK$+@sHIs2fV=cBP($BJoH_=QkK z#IGEZ?wte<7cVYXa9m^ejp30uU-B^fji&pt;tysv5;FHDryk6VHKU zHL_|ZwwRdfk|(>mI;*(Vz37eIT$6mkHU)8wmN{@`A` z*+@>OhW}k2@c)xtT>ms|C=CgKunGF!VdEKw4{_AXS5y;=?m2QQwj`T6-;pIkr+w%m zIlVuWGwb{B7ycD;VwqEJb^PSe_%l&t> z6bE3eJk9|Q$Imr$_`_MX@^ZTaBI?(k4Nb(9gH1k&^3jxamP)qO(|OG@Z;T(EX6ugl$(ee;?0KC z%4rE2M2eP!2`FHd>*=8!2B>43Ma}w*9=`}0QMb#J;Y-&)2C$A_Q$QO->58K1P`Lw^ zyTO>Zp?Dc(@?#}++b0r~Bh9oOwO0HwfMT&-3c!lj)HhHthp9nNdWU}p)(ADNbH7EC z0X7U$2&`m9UC#wnind0Z=d5%HUTgxiP{|IRcCumPf|Ssx552a4r5nx5=PK3#Imw7Y zbp%eqnAy-^V^Yd`2`a-`f;#cUUE&X95A+rPm{({u=TFmt_Tu5kZwAjG_uq;QuWU@A zSU)fwWJIeTT)}a4Q?5Fy&H6pr1*QDk9;M7Cg zI&0AS2j%q)hpMDcr4s8cD_40)h&d8zv-iBuI#Pe^HM*E&cN4&P!lQu@Xx$>`(PTu#n5=d7PnrrE_RC?`~6Z|iNCk(9Z+ z<2VElE}_X-Rt|sa2U$4J2n=Wn!+j9J+G3xWZ6u~faDMAH*jzPQ#PomfqU&22oK=DUfPpF3b%N52Q7C3mm!8qDpIEa} ztl#_(&@M#2!Bex-UWf-V=M>2b>2@)-KP1A@-bv!P?92994?dOZ(;td|Xx_}(oLX{p z@z7Ni@$N*-I#Q(FXmYK1{|z1}yP{grTp=Gk!Sg zFv@MJp-JmhZ=aU_UC!YLaLo_nTXdSfqFMqy7)1$zj6= zv42xw(~xnGY*Ip;5PW)(GkXZ8bXG9vdS)mp{_!g{5KXh}8M3aAwL>QGh#jIk9X#SO z3;t+v^hbX47g*&gP}a5g&>9E*=({PlyH9e6?Jd9UKZ+TwH0loz;B*n>WSqs^2ajIQ zMgmP)%&mj=o=)@MhH0((n76Fn>iPb@<1!m}i5)U$Y>eoUwwN#`a)xTvakSRuvgclJAsgb}kH9BrPb>5c>$vZv-3Dd!POYrF#(07wj zRn23irF!oN=M)_6GsG)=Bj>4&|KK@te`3G))vs z^q|Sg?e>*iMK5SG6v_>nEsCY6+1!4i#RA`DGs1r*0J3;5Qw2SxaONYk(vgp5*)RNq zahlPekDMi`IQ2%Y$Ps${2m5psHRsDc?X&(4Oz%aLNqnsaAQey^e==ro2LI8t|5I%E zh;=Q5Vn>qP3kp;Ih+C2VMfKI27u9w_eqKtI^mJcMiOMLTZUkm<&?EY9gUQS$V$b(Y znpU%A>iMhH9JhHk3*;c0`P@Y!1OZLz5f1(6bk@~vOYQOKlw+A%8~e*zv6Irl?E@wJ z$#n10LzKntGqbkN%od-esC_?6kw2X$Tw}8!dWrqAuIbqrjU+3Z$0S^{S;{P)Ur|Aa zIJ4GAsq{ zZlnvl&CG^lRZW`MK|Qb@>2xi{Y1&NyXAMk@ZLnX~5^6H+wf!yvrFMpKbT8a$2?) zDalwR`HJPT0T9~bU;ETPtSx`?Vkn1jl9C#qBMEt(s7U~hT~|!Xw?BYz_yorv`pm;NrL0M_t3~l! zx-z-&wPXM*x5dL|K^d?;Al$Ova*SuOJ_DFAtwUD~h4#bmVrDhx7!S4lfEm&#)Eqe| z)H*-JtXi=2Cmf1Jv>i1mvzfwWJ!SjEQ=h`&{veeaQK1c1i%vV#AWi2?n+z7%2sw-Q(+H&7^){lRX%dNL!RzaH|1f^cSAX@3r! zOa6mJwOls+Bq`#tX#=jLCK6%N#KeTPY zQyn`#*Tl6V2XC^?CJWA{CK6OX;F6ZUdhTVmawB}LSN2*Gk**|`q7W$i*^dX5H4Am{`o&<+G|&c1X~f=-}{42IgCSBv=r8BpN(}GH3tM=G#~R%MlF{| zOjwL3m@^_BM>yz`--Xf_`W4)~(m(A}g4}yHNS+6o^DCRO6udw9sJ1Dkk1fU$Kn(bc zDa-!rO3VUUra3XPYfwM_T8K=!_=x+EXAp?+iUyf>->cv?mln#ZG|}-6P+-a9BKANcb~Tmj(iQ)n_T{z zV#U8OJ^!yu{J)v`P4Nx%TKy-MB4;|t@pGZ3=>pXs3$fs3Pj2%3+5h}4INvs(vj}vX zjXFC=iHQ8%)ihc?`+u%Hy0r6{k$cNs}5C@1PRaf(BRyZl9@- z*3;3{aWkT1e+_ES;2sMJWhz=#gM2rqG*b}O9psfT7Eir>_X)|WgATfETAiCT2TX0H zph2i6S%O(OyTjX6Kzkp6gEP0sx=8#@7xyVG!2KrgLQTrSqGb4;>+ayad7Y4Kg}~G( zKVn^5?4fa-y7Mcvum-(!Xi)2XlrwAR2GC*ZKB%SS&a~?KXgs!o6LiF}v$LX~h^rFA z;*dwwuy3_C>yMZ^fDdu-J^<=;aOK2ajZcWAI++?Lv#EV)YV97b6VBJKnD_}y3DEHK z$1NJuA)S$qnd?Bl_!)rl|5xwyo8A1UT!Q*f+vne~z<&x01d+52oeOo(H0x%r_kGUs z!BfE|C!K5+l>+4{zge_mYfj zWKlLVcM~@=M)SOG@X7iY##qxGQs6HzS+wWpc>T{l_~h`?#wUZ|retu$*&pT;*r(LD z#Z2T!gk-vf4*Ut)>r?0Z@UdNA$4RQ%C843Q?^)NjSYtTx>f7-+{LF+E!-M|B7WG$D zIM-*kN8!bE)6Lr+cO3QU`jlYMx0T7r+;dc+p>2Zb7t~4)R^iC=-biKS4670d6&xJu-qAn|ztMikbXu`k2q{&o%9GW~RrzOgwvY zhhJ#?DeKzZ8WGh_*zPK3i4fAvmDh*B!4(y8zkMsX4cqOBWw5kQS_He5PSeBYYt6!+ z>?B%^LBdH=+qJ1RUv)Zw8@*%4Gr!3pTY$^Q%LxysFA%t#5f4sLr4hEsj2dSr#NC?> zjj+H~)GrvpK_nM3D=|z3&YK&hGuIh+9n|!5Fr1V9Ck4;R8oZ`8AI^R5yjf=%oG;`U zMU4b-6HwRkQvJXwWaNd9#8atD^Up++_;pI@U&$>2F&rj69_~W{BPO>3HXUlb&DhXAJK2~nw5mqis|p*Kg8TuSgs%t($7c_ z?GT6mmZJS@yB~otsSy2-_}J&>E&{>#_}ZUWY(3!gp0tMaL?MO!V0)T>{;zTnpvobT)z)_Ccez2~K{dYfl)o8pdGU9WI$Ov~$A%Ij)! z{@Uj`Qh2!gfbs1}ojXm%%GUz-7DNs^+E!ny(q8{AW2c>ArOng#fxXeaIfmW0|Ezd$ z+VMljk=v=V{UaM|YyzX0YEN?SQ@bO+mMI$8*L7<|Fr)qbSSBk|CNLMgdO{04nv;@K zmDF{UYPl}?L`rhqkq5a~O$N=gU)QwVuKuN7)x(kXA#yl(rhVPY?x8}Ovg5Xf+(wnI z=Ex_xbGsdL)=TEHDpk7OE-Vb#zWsumyMxp7jPP!q?uh~0)3uUw9@K}B9JB7^^gB)I zdasq7+h$hf7#|qj6*k=HxvXbdfIqY2X^w_T&ynRuPLzhhCgm2S)_7omkEcUC!KhH-2KGzZNCG)_ZqDLZW}js=(02oJ6hL6#w65rXe~p%e)fq&0lS>!F3tjUvRqR?U2k&Bgxkp*K<-l z3%x0J4Sl_bn;CQ57VIpUpz24oD@u_!J`|_G6z7V0IB`tbQ}h&9xE5_#RXJ^i>(Av} zH-=Vm$|M^6plq7%mMMDG4^uQ~68c;vQdi6lqULhfqLc71bkV=S|6q05R)1g0Y;Lo! zA7M?|R`lztZDga|#wT;!PR8DvVE?7JdNNJy)D%7VOY~bCeX10DihdhO=a+f{O(I*D zd^+~lF%|3zkND;tru)4yT)`$9Nl!=L5C2H4{18PA{)N&h3TgDhR#(PKvnEp&^sTeQ z^ID}Ur)|<>1<|D)eI{{_T|5!1yYu?&J?Q&YvCFvPyPk0RvaT|1O3&{r%8$oO8l&Ie zF~mP_g{uyCC9Axx^hb^ZTdMXot8pbd7wj%8w{@@$46K!W*ORU2CH(6Y{e~+HPuHZW zcP-!d8cs!DeOdR48?A@Xjy?oF(!PeGN+ap77CEgR!kWr$B$^U)%0AFBT9S2EO@+?6%)WZ@O4O24TVgXegk9vQ1C>tThP4t_-Z zuiE;YUCeD0w_;b9^eT}APnA(WTlmyOKA5#PPV>0RdRF5Lx`ObQcV3@JRDP6V$#tut z1o17+RnL00sl(=p2?T)+N!1>ao386Bg`e!0Bhg=tpR7dNT6n*Apt54QKbv)!iah+e`=hI|v?vept;mt^3y7CMNhd2bE66OR_3^4QGQ@2+fyj zXuTRg#Z%?IZA6{@c}wvRId*X!yLut^46gY05R`KoR})!B_!smS8-%AjYC&y8_)cW9 za4koO(~(_XcTM^t^00O$>EB%HOCeZYZYwS)BNu^ZycOIFJ6a{yX3l$o8-o3AF|eKp zh9G>fLLYSG#7tlv;7k{o`Miy4>Z6CgA~L^Gl?496x5S;-Pn2jAjSrSMun*JXF9)3) z$6=)^w}oNmA4Kyc!=GXvC;U4UdXyh|A8aeFPGg!9Rp)p}7|GFo>nJA*y&Rq{ibP`~ z1b(;RFX$HG8w~zyfBnv6gx(CMx{6#=VmjX?{#8dgnR8m!00qZ`CCB0(mXi}&f~AQ@ z@tU5FK6}{^Q-mj1g${d#s}y@XM>Y04r^O=Ib?>CP5N}Y}K~@(t-MFR~{N=y%Sf-S~ zTW;^+$kXTSDHC^?z?6#94D_17f13Xv9Q9y{2N^r)DF%lydv7C9?F5gL0=G3A=P|;l3s?^lhjeL z!F_g)+wB|(=X3TfBpOH7LwrK{W}6&yA0A;3mdMjHSq6(y>|cr}HxzkSwP1dDY66&v zBFYvhT*a41ZNkmm)h}-}Lx6D$GeG74hM)Q+y~4jnBt|OH6>bJW48V^S**AD9oUVB4 zROT{)@2x7U-C7)Dmkp)G3+@njscp^#B*7vc^+XsNwd9wmZCs?L$y za~k6aklVkHSflx2ik_ii4W0s42%ehIzN7)J^!(0FnSe(!JjKpgVy#*k%NAlKfrViK z7sp$;OCY}%iE`MJ=i@OHsgw`JD;pCjYBiJz0_T{Zs=z8n838vXl$dZwMd29$hX?nF zv2{f%^D`f-l(;3GJiz*Ws^}>#U{EsQMq+4r*AS+|umO(FFcY0eaQF3eNt%m5BZ4C7 zd*d~w@T@cz0NsuRB!xTUsXt8DqK}ZOJ%Nr0Svvn?yoQ7QNN~OQy+xLklO6sHR+|Ez zyg-#H28q}Yh1{zsdG0JJX$!_urpQ6X(zPdHFyuK7@U9XZe&Rn_blAs&UR-V~8qI~z z*;%^Q6UTx$%ysZYDT|Vm1A7%f9s^Cl0T|TUd0qalHYxD=;a&z7e2Yx?ZuD!;CL}B` zM|X%K1wvt}bM~CPslr)EyT+A#sl8QZZ(@xSD)VtekW;^zhj zX3AcQE+4+5x;I8*6vzRZazr>%KZcM{oWc;n75t|%+s*5B+gb<(czFQGif+57y(EU= z=jdZe_|9^5`6j1!7XKi%cu4SIYVkh^9`avM48+0z5B>_tY#pAru*v`c;dHj;OVhRJ ztLsd+%W@{Sm;Q%b3OSdP^sWYl!l#^!189{ITVaWM>y84Lz!Mni-*(U=jZ46t*wI>M^P?c8;~$rzNz z;jv|v>3pbjy)OINHJlsn`<9!@{7`$|ai5D_K;3U;~ z_9Q`=?jdQqcn$^o5j1IoXFTn8D}QK6atxqZ8{t=}d+6f2%Sz~^R<#&Pu%$RTGs<;% zmCrlRNw#G))nyhpi`Fkf-^vVHGSNtxM#?rsK|nwp=vObJS(Xb?Bm0AFe2vbdHUQ!9 z`6^|xQ0<|B&5!1rfnBKSJ~$^gvIbAHd@f<$KZgVwrA+UFv}1T!cPn$bE`J%SRwDI8 z+uG*pZn-lv$||1j_{@jhDE_ijg18Pf6f)blVf(f``CMK ziY?mrXIFl?9A=t;z6@wTC1_swGdQHmjOpHO&Z@^P;FyYD>@Bf9x{$8{egC5*=@SbprA5I<2eE(9#Bh6U9IBLL z+~7`-i$jqB8CHoI-1GJa+68m{OL;r%gZUX7Awn_g`bm&kjIEP`3bX3&ujz|hH1hJr z(pW(@Zcdw%0e$E-2ad}8IpBm z5>}K)Ql_w;n(u$*H#X5+!h>C;WH{gbgUP1m`}~3Q;JfWI^;T!3Ar|6J&nE|u0LmBbFxjO>qi#Q01&T8*(GUE+YBFF zACUc(R(cbe@^jWHB2B_z5ml8Hdfjx<(b7ZpwF2TQlHGdAzePFFI_>M1qnSOt_s=ry zh8vtuQ=f$!nDCxn>iD57g151~vuUPO0)FIzU?FxYYm&p3o?S(S^R7W*zfF$ys6X!H z-v*mxaj=>u&(D|4xk8-BurCB|aB~_nH0eQL^gy$d&FNyTf)P!ns7+mUX>Mu81IGq3 ze_7UZT`iQ&uX_KEKakA#JI*M_2~IcRaoQkIyS?_?a7AN^k^uNY9IPT&_~#W9m3zFI z6@#yiF55P3dCBk7+x)sM_KY~}PV|2^V+Ti`k;xJuZ~+}Pz)0?;OQDG3w%CT%cV z=scBN$i5GcAA>PCX9F4O`)Wpwpu_8$Ct)auLF^~=65tOIMz$|#d;rI|fc6qGm2xzt ztcQ&U_FO1Nl@h-$3ge1-8Kg3YDEmG|25+Ck3#a@%FnDyR=ho-$!oACZ5)%nLPql{W zMmPr%`*6d&<&h7)=h78o(|_H$}fPLaXDQ~l+K0}@Y2v)Uf)m#-1dnJx)TK6Z%5Y46QNFuNZQZm z=g>3D?NT#`fYfaIF6`hENyfiUhNOMHY8`8#DNSkz{tMhwNbzuJ?WLPhBtU3r$z@%l zJtAGNzX!i|U*S3jF=JJvio;NMGJ;-6IgDIf(!5wIkyoZ%b}8C`?10xO!i)<+{dKIS zxR*C7j3sF6QOd{Tuty3(bEBF&R|fe0>1?ym2j&6<1ZRQ6qkY`=yibwKLW&jCjf^*} z8_LXB49>YW4`LsVhGyXr3$8O(mtSoo5(s#Iz)s?T=nv!N8^RTU0}bd3cdH&Wa@b}A zv5Xy?C+5l7NhNgro8U4Kw6Bz|M(>=_lbgYO_Tfq6zWpJ6-v+ctPE%8w(!=Y|g*-i; zSXY0h`-A>MP6<|7p!n`VgyQ`*S%+u!!!J8FKe716w(!ZsIm(RQj&f;;0-q4aNL!E6 z#st+Tn+6lF_V0F|k!Lh0x5n;!ZzFC0VcvsoG_B^_+^%gsYwlx6YT^xH?_$ zObWovBxgSiWFezkN7tYwiwnYE799#EJ?>^TjnS@y5S2Wa==$JiqP^K)KKA6kYk#1s zU9HQsZUGL}Xh0NT?9e63Or$Gy;;dHg>FvCe_H|Z3-ee1CH6^XSM zbrmE9CxD0;aC__o_QMGvQjuQ}O}XEA1=$qQ!L|E-uLAw#Pidz4`F(Ic=maX)2`n5h zu23Vvja_W8a6HG=aM8lyoD@g(l17i%%$64vtIpdH)L0EwtT6s}DX4?THv?&5e=BUFr4L*7OCKE4%%AJ8HQrC%ESL zp>i^Akds*R_>_-cG~0WMfWja#b!av5i{5)laDEu;u%s*!&C_-}3VhAMPc4*O=(pnu zuAKL#n=TSCM4)gveH4uA0oV`&dhTOywFIrjb}B8kBV`uQ0i(2<2ru2&UTVk)>EHxN zZ%q_aYN=H_(|z}*4Yx0U&CIgw&^Ko?Qk-{1IJ|!HEYxeiAS$e5w@E@4GZ5oQy0Je! zqsR$ccR|SdfyD(#oc;qkH+o3VkYObL(H+)a%)2&(z^6CN(m!$IfXt>#pU?hls?0V68 z@~JyJOA2iAXS`M9<%RO&ZynxW7`eNsX@?gWz=s9AIZjq$PK0WGegBtTEqFyq(yt~! z4HpVQ%2*RfqVJo4Scgo6l{RHJ+`nQD_VO^?Gd!<&!8~HIaX{lIf2Hh+qed)MI}zvc zP_+ywL>xjoJg0JcN6qvxT~ri@uQ1e_O_yG&p`dyUdP$w-J+cqvG%ru93Ge=D7)e1F z8cl${s~X~jFl4^xaDdNkf)1iHQX?s9Y|FRpTzUG~=CdJAVw~)SP?kU_*JoOUv_AJ& zN{JPl+ETmpagE!Bn6ME`_H|#%x1bC%=d2k-SYe;l5?s0GS(F|Z;f;ykA$=fiIYIlT zvGc;H7gjxur|)!7t0V9|VH$A%0vMoVx!(fzih10V7K9TY!)5x*rp zz~TN3E$X#oUX!hjz5%Rl?Gv@6f4v2lybe`3I6xBw6*n(}ku(A|B!?TBb|=87NAI3b%qrYng}R0kdK$Pk1Q^|z33$(r%$kROg|&2FLe=r2 zy;OyEmTlRLIt4F z6&w#-_(EjP72Ll(OO~MNqV~DBn%H$+g*McaEjNbN7SXu8couaEFPhsX?P7X2{@QTg z*D-sb%OvwBCdVNyde}U+F~ufjv3GudYG;MEnu$%b;VnF{qa%r>d+&uVVmY0%aOPi= zCOjyHJ&~0a2$_BbaDp~dvW}+Z8V-J|Z;T7;u=IJ~*Y>GfP1)gBvv2vynFeY#_MFWO zJ>WMm+UP0)VX4~LV2HL6Nnc3)PZou~W-p$f*w3EQ({8{v2*x!HIQ^Gi&G7U{TG-5I z@Zou{zz;0vZk|u~=}v|2uxGP94oNL8xgTYx^VGI;=2xjkVdz5W>bW4J%yW?@*L;B@ zjCxUyWoP=ymt6RJk%g8PN%<3P?RRn-?AIK(*Y zP4exy;Jjb0x~U#RUQh+{F(~9)pqpOB5CCxYkorrH%E&}j4m5>78QQ*GaU3YTmejSp z-OTXN>#2mAv_lDW%NE1eJ-eo2wh2xo^$HzTb(!fq@vaB1k{NbpgEr(MR{sf2b-f7N zfQr;<-)Uwd1+oc|b`utFR4Pw2utF#Ut%md1VJ#`jyR`be^hUw)9JdW@1a2xPewa^A zeGVlICu1hfDF0dLCcD;YlaKj!4XKA}e;uJT&iM$+vGYt!THb4wEBo7o7bo&k7ODJLl7$N79`~(@nXXsG zzH3{Lwo*}jxQ=ePjTVeb?tGV;;XUP+N#Ep(3IWP9o#`+b~dy@b>D8b z?~dQVWJq;G1>f{Aexck`QyLPcNUugMB`Cw2J2S5>PwC$LV(spp3k4!3@$SYO8 zyl2mysjPW%n#%P0+^WzWi?j+tOH}R;Jv>+G-Xvkt(P$z|jb^L7O2An%pt(?kc^U`d zgHg$s8RqS3ohJ%IGJPCADn-7YO1==-@~~kCKcPc@TAo7SaGZcI6?6p`%J9qaY=VO_ z^Fd}!gLnR2JO9SQHJLq^1`a-Sef8Ah*#+yAp`NYL5u5y5Y_Xmq!a<<N{XP7C##lYy)~v8D;dEi=p_e*fuT~2s>GU?-}t%0A^hsVqpn*$+|s}T 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%0ATf)rV7J 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 D#t6qf literal 0 HcmV?d00001 diff --git a/browser-extension/safari/web-extension/assets/store/store-icon-128.png b/browser-extension/safari/web-extension/assets/store/store-icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..8658432dfab6bebdaeaef4235d12981e9e4caeff GIT binary patch literal 1659 zcmZ8hc~BE}6a57tM2-~XiX3t%Rv@F*FC672hSM4#C4{IPwtfV#5GuFQhNDElhD%VC zf+3QETEbysEC~{d7HbqRs34{MRZ&nR8Ws$*Z91eut#-gQZAI|H=WsJWke$(Y$SEuFA2P`l$#>%p z>7VvKbd?PZ4CursZ8ra3qsP5sj(K$SP8L|4zCo*0?p$@@9PoLxnru%hsJn@s6{p&5 zWVtRDCA(Lya4mAU>gt@Bx`2a(zHg;Z8ByE(hwih>xa(FV^sJU-VvkF zOLJdA9QM6DX%+(;K|E{jbLg_4|BQZ1D$@ zb;+~UMv+u+M`Vg=@e2DX_01V+X6{Tn!sUcRZ5M8UWZWLwa0T>= z+1&t-a-Z;|tIgcLeui5vwfaMuOhT8vtwBt1erwoD6A0W*j?Z^Hl_K3zi69(_tyGvPC z8~mKZs$Am3clwI;Z5U9BgR9zsUT$P3%r`uSBG0DpQxsm2DHv(k@425(%XT9*!iryh zC8@HUj`L7>XbSW+Z77By@eX-QZ0SB}nYQA=yzs6}N$G4m1;|^NGtlu%v%=N2c0bkE z!~q~2{7Cq^5CjQz1#{zBk`MQERn7}v#U9(f?6Liy?omC!;I@`Ax)O4q;HhP-p;6HT z^R=}DMPXL}|CUMadSUNihsjU%N3_7c!o}uDh|Pk#TWpe9o_R5d+N%-wD=cru4qQ0* zk3fmJ`BTT00c1-<;GjXb)%a|?L7t{T-kSg4b2|*rYjtr2Zb-CH0*#Y5h=?sAW;$)r zj0_#$T=Z-Oyw7jW(?5oXIcWmi_of7$ouH?;L)H2JYYUd13|+dCSp)C;a!S5sm0R6q zegV!=^ zCyqJOC|kC;|I(h6wvkDixqW>8gn8`xi6Ne#|HPzQ_9_R+$!OTzh@a=E6Jo}S0(qZT*gjs z+*cpo^sujlIF51Ddu^H!_@fzXKC{95z)NZ9fu-^RO;?fvQC&6{zIe5XnBQPJYZ^|v zW__tyX)F3hcrsQ$QqnB1)ru>{cPm4Sxzxn`-z?y19XO|rT|W)=^jg5>Lr0|?7IMnl zMBwMdeKXQa<6DgxCZu?N#6MqrgdPip-Xgv>>4C66OShAm$Sl9uzf_*oF+N=6QaYId zX)r)7Wje06xWb?8|8z0yDfVF32=7q0oF7ly)nI71;n*!==R_83dqo{fcxTe4_1;DV u#qmp~TV0}+uB_W__|tXT|NX>(9=!I+N`Fw10YbXCnGE*FVp!<7g1-P0ss>~L literal 0 HcmV?d00001 diff --git a/browser-extension/safari/web-extension/manifest.json b/browser-extension/safari/web-extension/manifest.json new file mode 100644 index 0000000..8ebf24b --- /dev/null +++ b/browser-extension/safari/web-extension/manifest.json @@ -0,0 +1,24 @@ +{ + "manifest_version": 3, + "name": "API Response Comparator", + "description": "Compare JSON API responses across Dev, QA, and Prod from a browser popup.", + "version": "0.1.0", + "icons": { + "16": "assets/icons/icon-16.png", + "32": "assets/icons/icon-32.png", + "48": "assets/icons/icon-48.png", + "128": "assets/icons/icon-128.png" + }, + "action": { + "default_title": "API Response Comparator", + "default_popup": "popup.html", + "default_icon": { + "16": "assets/icons/icon-16.png", + "32": "assets/icons/icon-32.png", + "48": "assets/icons/icon-48.png", + "128": "assets/icons/icon-128.png" + } + }, + "permissions": ["storage", "clipboardWrite"], + "host_permissions": ["https://*/*"] +} diff --git a/browser-extension/safari/web-extension/popup.css b/browser-extension/safari/web-extension/popup.css new file mode 100644 index 0000000..b2326ad --- /dev/null +++ b/browser-extension/safari/web-extension/popup.css @@ -0,0 +1,496 @@ +:root { + color-scheme: light; + --bg: #f7f8fb; + --panel: #ffffff; + --panel-soft: #eef2f7; + --text: #111827; + --muted: #64748b; + --line: #d8dee8; + --brand: #0f766e; + --brand-strong: #115e59; + --danger: #b91c1c; + --added: #047857; + --removed: #b91c1c; + --changed: #b45309; + --type: #7c3aed; + --shadow: 0 1px 2px rgb(15 23 42 / 8%); +} + +body.theme-dark { + color-scheme: dark; + --bg: #111318; + --panel: #1a1d24; + --panel-soft: #242936; + --text: #f8fafc; + --muted: #9aa4b2; + --line: #303746; + --brand: #2dd4bf; + --brand-strong: #5eead4; + --danger: #f87171; +} + +* { + box-sizing: border-box; +} + +body { + width: min(820px, 100vw); + min-height: 600px; + margin: 0; + background: var(--bg); + color: var(--text); + font: 13px/1.45 system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +button, +input, +textarea { + font: inherit; +} + +button { + border: 1px solid transparent; + border-radius: 7px; + background: var(--brand); + color: #ffffff; + cursor: pointer; + font-weight: 700; + min-height: 34px; + padding: 7px 12px; +} + +button:hover { + background: var(--brand-strong); +} + +button:disabled { + cursor: not-allowed; + opacity: 0.65; +} + +.shell { + padding: 14px; +} + +.header, +.header-actions, +.actions, +.tools, +.summary, +.result-toolbar, +.mini-actions, +.env-head { + display: flex; + gap: 8px; +} + +.header { + align-items: start; + justify-content: space-between; + margin-bottom: 12px; +} + +.header-actions { + flex-shrink: 0; +} + +h1 { + font-size: 18px; + letter-spacing: 0; + line-height: 1.2; + margin: 0; +} + +h2 { + font-size: 13px; + letter-spacing: 0; + margin: 0; +} + +p { + color: var(--muted); + margin: 4px 0 0; +} + +.icon-button, +.mini-button, +.file-button, +.secondary, +.mode-button, +.count, +.view-button { + background: var(--panel); + border-color: var(--line); + color: var(--text); +} + +.icon-button:hover, +.mini-button:hover, +.file-button:hover, +.secondary:hover, +.mode-button:hover, +.count:hover, +.view-button:hover, +.mode-button.active, +.count.active, +.view-button.active { + background: var(--panel-soft); +} + +.icon-button, +.mini-button, +.file-button { + align-items: center; + display: inline-flex; + justify-content: center; + min-width: 34px; + padding: 0; +} + +.mini-button, +.file-button { + min-height: 26px; + min-width: 26px; +} + +.file-button { + border: 1px solid var(--line); + border-radius: 7px; + cursor: pointer; + font-weight: 800; +} + +.mode-bar { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 8px; + margin-bottom: 10px; +} + +.mode-panel, +.table-wrap, +.tree-panel, +.suggestions { + background: var(--panel); + border: 1px solid var(--line); + border-radius: 8px; + box-shadow: var(--shadow); +} + +.mode-panel { + padding: 10px; +} + +.hidden, +.file-input { + display: none !important; +} + +.env-grid { + display: grid; + gap: 10px; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.env-card, +.field { + display: grid; + gap: 5px; +} + +.env-head { + align-items: center; + justify-content: space-between; +} + +.env-head label, +.field span { + color: var(--muted); + font-weight: 700; +} + +textarea, +input { + background: var(--bg); + border: 1px solid var(--line); + border-radius: 7px; + color: var(--text); + min-width: 0; + outline: none; + padding: 8px; +} + +textarea:focus, +input:focus { + border-color: var(--brand); + box-shadow: 0 0 0 2px color-mix(in srgb, var(--brand), transparent 78%); +} + +textarea { + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + height: 132px; + resize: vertical; +} + +.actions { + justify-content: end; + margin-top: 10px; +} + +.tools { + align-items: end; + margin: 12px 0 8px; +} + +.compact { + flex: 1; +} + +.tall { + min-height: 36px; +} + +.status { + color: var(--danger); + min-height: 20px; +} + +.suggestions { + display: grid; + gap: 6px; + margin: 8px 0; + max-height: 92px; + overflow: auto; + padding: 8px; +} + +.suggestion { + align-items: center; + display: grid; + gap: 8px; + grid-template-columns: minmax(0, 1fr) auto auto; +} + +.suggestion strong, +.tree-key, +.mono { + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; +} + +.suggestion small { + color: var(--muted); +} + +.summary { + flex-wrap: wrap; + margin: 6px 0 10px; +} + +.count { + align-items: center; + display: inline-flex; + gap: 6px; +} + +.result-toolbar { + align-items: center; + justify-content: end; + margin-bottom: 8px; +} + +.contract-alert { + color: var(--danger); + font-weight: 800; + margin-right: auto; +} + +.view-tabs { + display: inline-flex; + gap: 4px; + margin-right: auto; +} + +.contract-alert:not(.hidden) + .view-tabs { + margin-left: 8px; + margin-right: 0; +} + +.table-wrap { + max-height: 260px; + overflow: auto; +} + +table { + border-collapse: collapse; + min-width: 100%; +} + +th, +td { + border-bottom: 1px solid var(--line); + max-width: 210px; + padding: 8px; + text-align: left; + vertical-align: top; +} + +th { + background: var(--panel-soft); + position: sticky; + top: 0; + z-index: 1; +} + +td { + overflow-wrap: anywhere; +} + +.empty { + color: var(--muted); + text-align: center; +} + +.badge { + border-radius: 999px; + color: #ffffff; + display: inline-block; + font-size: 11px; + font-weight: 800; + padding: 3px 7px; +} + +.ADDED, +.tree-node.ADDED > .tree-line { + background: color-mix(in srgb, var(--added), transparent 84%); +} + +.REMOVED, +.tree-node.REMOVED > .tree-line { + background: color-mix(in srgb, var(--removed), transparent 84%); +} + +.CHANGED, +.tree-node.CHANGED > .tree-line { + background: color-mix(in srgb, var(--changed), transparent 84%); +} + +.TYPE_CHANGE, +.tree-node.TYPE_CHANGE > .tree-line { + background: color-mix(in srgb, var(--type), transparent 84%); +} + +.badge.ADDED { + background: var(--added); +} + +.badge.REMOVED { + background: var(--removed); +} + +.badge.CHANGED { + background: var(--changed); +} + +.badge.TYPE_CHANGE { + background: var(--type); +} + +.tree-grid { + display: grid; + gap: 10px; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.tree-panel { + min-height: 220px; + overflow: hidden; +} + +.tree-panel h2 { + background: var(--panel-soft); + border-bottom: 1px solid var(--line); + padding: 8px; +} + +.tree-body { + max-height: 240px; + overflow: auto; + padding: 8px; +} + +.tree-node { + margin-left: 12px; +} + +.tree-node.root { + margin-left: 0; +} + +.tree-line { + border-radius: 6px; + display: flex; + gap: 6px; + min-height: 24px; + padding: 3px 5px; +} + +.tree-value { + color: var(--muted); + overflow-wrap: anywhere; +} + +@media (max-width: 700px) { + body { + min-height: 100vh; + } + + .shell { + padding: 10px; + } + + .header { + align-items: center; + } + + .header p { + display: none; + } + + .mode-bar, + .env-grid, + .tree-grid { + grid-template-columns: 1fr; + } + + .tools, + .result-toolbar { + align-items: stretch; + flex-wrap: wrap; + } + + .view-tabs { + order: -1; + width: 100%; + } + + .view-tabs .view-button, + .tools .field, + .tools button { + flex: 1; + } + + textarea { + height: 108px; + } + + .table-wrap, + .tree-body { + max-height: 360px; + } + + th, + td { + max-width: 160px; + padding: 7px; + } +} diff --git a/browser-extension/safari/web-extension/popup.html b/browser-extension/safari/web-extension/popup.html new file mode 100644 index 0000000..826b757 --- /dev/null +++ b/browser-extension/safari/web-extension/popup.html @@ -0,0 +1,180 @@ + + + + + + API Response Comparator + + + +
+
+
+

API Response Comparator

+

Compare Dev, QA, and Prod responses from JSON, URL, or cURL.

+
+
+ + +
+
+ +
+ + + +
+ +
+
+
+
+ +
+ + +
+
+ + +
+
+
+ +
+ + +
+
+ + +
+
+
+ +
+ + +
+
+ + +
+
+
+ + +
+
+ + + + + +
+ + + +
+ + +
+ +
+ + + + + +
+ +
+ +
+ + +
+ + + +
+ +
+ + + + + + + + + + + + + + + +
PathTypeDevQAProd
No comparison yet.
+
+ + +
+ + + diff --git a/browser-extension/safari/web-extension/popup.js b/browser-extension/safari/web-extension/popup.js new file mode 100644 index 0000000..2ac5efe --- /dev/null +++ b/browser-extension/safari/web-extension/popup.js @@ -0,0 +1,1039 @@ +const ENVIRONMENTS = [ + { id: 'dev', label: 'Dev', valueKey: 'devValue' }, + { id: 'qa', label: 'QA', valueKey: 'qaValue' }, + { id: 'prod', label: 'Prod', valueKey: 'prodValue' }, +]; +const DATA_FLAGS = new Set(['-d', '--data', '--data-raw', '--data-binary', '--data-ascii']); +const SUGGESTION_THRESHOLD = 60; +const MAX_REQUEST_BODY_SIZE = 1024 * 1024; +const STRONG_VOLATILE_NAME_PATTERNS = [ + /timestamp/i, + /time/i, + /date/i, + /createdAt/i, + /updatedAt/i, + /requestId/i, + /traceId/i, + /correlationId/i, + /sessionId/i, + /token/i, + /uuid/i, + /guid/i, + /nonce/i, + /etag/i, + /version/i, +]; +const TEMPORAL_NAME_PATTERN = /(?:lastLogin|lastSeen|lastModified|expires|expiry|generated|modified)/i; +const WEAK_IDENTIFIER_NAME_PATTERN = /(?:tracking|transaction|operation|event|message)Id$/i; +const NOISY_PATH_SEGMENTS = new Set(['headers', 'metadata', 'audit', 'debug', 'links']); +const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; +const ISO_DATETIME_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/; +const EPOCH_PATTERN = /^\d{10,13}$/; +const PREFIXED_IDENTIFIER_PATTERN = /^[A-Z][A-Z0-9]{0,9}-[A-Z0-9]{6,}$/i; +const TOKEN_PATTERN = /^[A-Za-z0-9-_]{20,}$/; +const BLOCKED_REQUEST_HEADERS = new Set([ + 'connection', + 'content-length', + 'host', + 'origin', + 'proxy-authorization', + 'proxy-connection', + 'referer', + 'transfer-encoding', + 'upgrade', +]); + +const state = { + mode: 'json', + view: 'table', + theme: 'light', + diffs: [], + filter: 'ALL', + suggestions: [], + compared: { dev: undefined, qa: undefined, prod: undefined }, + active: { dev: false, qa: false, prod: false }, + urlController: undefined, + curlController: undefined, +}; +const extensionApi = globalThis.browser ?? globalThis.chrome; + +const draftIds = [ + 'devJson', + 'qaJson', + 'prodJson', + 'devUrl', + 'qaUrl', + 'prodUrl', + 'devCurl', + 'qaCurl', + 'prodCurl', + 'ignoreFields', + 'pathSearch', +]; + +const elementIds = [ + ...draftIds, + 'jsonMode', + 'urlMode', + 'curlMode', + 'status', + 'suggestions', + 'diffTable', + 'contractAlert', + 'tableView', + 'treeView', + 'devTree', + 'qaTree', + 'prodTree', + 'countAll', + 'countAdded', + 'countRemoved', + 'countChanged', + 'countType', + 'compareJsonButton', + 'formatButton', + 'fetchButton', + 'curlButton', + 'suggestButton', + 'copyButton', + 'downloadButton', + 'excelButton', + 'resetButton', + 'themeButton', +]; + +const elements = Object.fromEntries(elementIds.map((id) => [id, document.getElementById(id)])); + +document.addEventListener('DOMContentLoaded', async () => { + await restoreDraft(); + bindEvents(); + render(); +}); + +function bindEvents() { + document.querySelectorAll('.mode-button').forEach((button) => { + button.addEventListener('click', () => setMode(button.dataset.mode)); + }); + + document.querySelectorAll('.view-button').forEach((button) => { + button.addEventListener('click', () => { + state.view = button.dataset.view; + persistDraft(); + render(); + }); + }); + + document.querySelectorAll('.count').forEach((button) => { + button.addEventListener('click', () => { + state.filter = button.dataset.filter; + render(); + }); + }); + + document.querySelectorAll('[data-clear]').forEach((button) => { + button.addEventListener('click', () => { + elements[button.dataset.clear].value = ''; + persistDraft(); + clearSourceDerivedState(); + }); + }); + + document.querySelectorAll('.file-input').forEach((input) => { + input.addEventListener('change', handleFileUpload); + }); + + draftIds.forEach((id) => { + elements[id].addEventListener('input', () => { + persistDraft(); + if (id === 'pathSearch') { + render(); + } else { + clearSourceDerivedState(); + } + }); + }); + + elements.compareJsonButton.addEventListener('click', compareFromJson); + elements.formatButton.addEventListener('click', formatJsonInputs); + elements.fetchButton.addEventListener('click', compareFromUrls); + elements.curlButton.addEventListener('click', compareFromCurl); + elements.suggestButton.addEventListener('click', generateSuggestions); + elements.copyButton.addEventListener('click', copyDiffs); + elements.downloadButton.addEventListener('click', downloadJson); + elements.excelButton.addEventListener('click', downloadExcel); + elements.resetButton.addEventListener('click', resetAll); + elements.themeButton.addEventListener('click', toggleTheme); +} + +function setMode(mode) { + state.mode = mode; + document.querySelectorAll('.mode-button').forEach((button) => { + button.classList.toggle('active', button.dataset.mode === mode); + }); + elements.jsonMode.classList.toggle('hidden', mode !== 'json'); + elements.urlMode.classList.toggle('hidden', mode !== 'url'); + elements.curlMode.classList.toggle('hidden', mode !== 'curl'); + clearStatus(); + persistDraft(); +} + +function toggleTheme() { + state.theme = state.theme === 'dark' ? 'light' : 'dark'; + applyTheme(); + persistDraft(); +} + +function applyTheme() { + document.body.classList.toggle('theme-dark', state.theme === 'dark'); + elements.themeButton.textContent = state.theme === 'dark' ? '☼' : '◐'; +} + +async function handleFileUpload(event) { + const input = event.currentTarget; + const file = input.files?.[0]; + if (!file) return; + + try { + const text = await file.text(); + JSON.parse(text); + elements[input.dataset.target].value = text; + persistDraft(); + clearSourceDerivedState(); + clearStatus(); + } catch { + showStatus(`${file.name} does not contain valid JSON.`); + } finally { + input.value = ''; + } +} + +function compareFromJson() { + const parsed = parseModeJson(); + if (!parsed) return; + compareParsed(parsed.values, parsed.active, getIgnoreFields()); +} + +async function compareFromUrls() { + const urls = getEnvironmentInputValues('Url'); + if (Object.values(urls).filter(Boolean).length < 2) { + showStatus('Provide at least two HTTPS URLs.'); + return; + } + + state.urlController?.abort(); + state.urlController = new AbortController(); + setLoading('url', true); + + try { + const results = await Promise.all( + ENVIRONMENTS.map(({ id, label }) => + fetchOptionalJson(urls[id], label, state.urlController.signal), + ), + ); + compareParsed( + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].value])), + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].active])), + [], + ); + } catch (error) { + if (!isAbortError(error)) { + showStatus(error instanceof Error ? error.message : 'Unable to fetch URLs.'); + } + } finally { + setLoading('url', false); + } +} + +async function compareFromCurl() { + const commands = getEnvironmentInputValues('Curl'); + if (Object.values(commands).filter(Boolean).length < 2) { + showStatus('Provide at least two cURL commands.'); + return; + } + + state.curlController?.abort(); + state.curlController = new AbortController(); + setLoading('curl', true); + + try { + const results = await Promise.all( + ENVIRONMENTS.map(({ id, label }) => + fetchOptionalCurlJson(commands[id], label, state.curlController.signal), + ), + ); + compareParsed( + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].value])), + Object.fromEntries(ENVIRONMENTS.map(({ id }, index) => [id, results[index].active])), + [], + ); + } catch (error) { + if (!isAbortError(error)) { + showStatus(error instanceof Error ? error.message : 'Unable to import cURL commands.'); + } + } finally { + setLoading('curl', false); + } +} + +function compareParsed(values, active, ignoreFields) { + if (Object.values(active).filter(Boolean).length < 2) { + showStatus('Provide at least two populated environments.'); + return; + } + + state.compared = values; + state.active = active; + state.diffs = compareJson(values.dev, values.qa, values.prod, ignoreFields, active); + state.filter = 'ALL'; + state.suggestions = []; + showStatus(state.diffs.length ? '' : 'No differences found.'); + render(); +} + +function parseModeJson() { + const values = {}; + const active = {}; + for (const { id, label } of ENVIRONMENTS) { + const result = parseOptionalJson(elements[`${id}Json`].value, label); + if (!result.ok) return undefined; + values[id] = result.value; + active[id] = result.active; + } + return { values, active }; +} + +function formatJsonInputs() { + const updates = []; + for (const { id, label } of ENVIRONMENTS) { + const input = elements[`${id}Json`].value.trim(); + if (!input) continue; + try { + updates.push([`${id}Json`, JSON.stringify(JSON.parse(input), null, 2)]); + } catch { + showStatus(`${label} contains invalid JSON.`); + return; + } + } + updates.forEach(([id, value]) => { + elements[id].value = value; + }); + persistDraft(); + clearSourceDerivedState(); + clearStatus(); +} + +async function fetchOptionalJson(url, label, signal) { + if (!url.trim()) return { active: false, value: undefined }; + validateExtensionUrl(url, label); + + const response = await fetch(url, { + credentials: 'omit', + cache: 'no-store', + headers: { Accept: 'application/json' }, + signal, + }); + return parseJsonResponse(response, label); +} + +async function fetchOptionalCurlJson(command, label, signal) { + if (!command.trim()) return { active: false, value: undefined }; + const request = parseCurlCommand(command); + validateExtensionUrl(request.url, label); + if (request.body && new TextEncoder().encode(request.body).byteLength > MAX_REQUEST_BODY_SIZE) { + throw new Error(`${label} cURL request body is too large.`); + } + + const method = request.method.toUpperCase(); + const response = await fetch(request.url, { + method, + headers: sanitizeRequestHeaders(request.headers), + body: method === 'GET' || method === 'HEAD' ? undefined : request.body, + credentials: 'omit', + cache: 'no-store', + signal, + }); + return parseJsonResponse(response, label); +} + +async function parseJsonResponse(response, label) { + const text = await response.text(); + if (!response.ok) { + throw new Error(`${label} request failed: ${response.status} ${response.statusText}${text ? ` - ${text.slice(0, 240)}` : ''}`); + } + try { + return { active: true, value: JSON.parse(text) }; + } catch { + throw new Error(`${label} did not return valid JSON.`); + } +} + +function validateExtensionUrl(url, label) { + const target = new URL(url); + if (target.protocol !== 'https:') { + throw new Error(`${label} URL must start with https://`); + } +} + +function parseOptionalJson(input, label) { + if (!input.trim()) return { ok: true, active: false, value: undefined }; + try { + return { ok: true, active: true, value: JSON.parse(input) }; + } catch { + showStatus(`${label} contains invalid JSON.`); + return { ok: false, active: false, value: undefined }; + } +} + +function parseCurlCommand(command) { + const tokens = tokenizeCurl(command.trim()); + if (tokens[0]?.toLowerCase() !== 'curl') throw new Error('Command must start with curl'); + + let url = ''; + let method = ''; + let useGet = false; + const headers = {}; + const dataParts = []; + + for (let index = 1; index < tokens.length; index += 1) { + const token = tokens[index]; + if (token === '-X' || token === '--request') { + method = readFlagValue(tokens, ++index, token).toUpperCase(); + continue; + } + if (token === '-H' || token === '--header') { + const header = readFlagValue(tokens, ++index, token); + const separator = header.indexOf(':'); + if (separator <= 0) throw new Error(`Invalid header: ${header}`); + headers[header.slice(0, separator).trim()] = header.slice(separator + 1).trim(); + continue; + } + if (DATA_FLAGS.has(token)) { + const data = readFlagValue(tokens, ++index, token); + if (data.startsWith('@')) throw new Error('File-based cURL data is not supported'); + dataParts.push(data); + continue; + } + if (token === '-G' || token === '--get') { + useGet = true; + continue; + } + if (token === '--url') { + url = readFlagValue(tokens, ++index, token); + continue; + } + if (token === '-u' || token === '--user') { + headers.Authorization = `Basic ${btoa(readFlagValue(tokens, ++index, token))}`; + continue; + } + if (['--compressed', '-s', '--silent', '-L', '--location'].includes(token)) continue; + if (token === '-b' || token === '--cookie') { + headers.Cookie = readFlagValue(tokens, ++index, token); + continue; + } + if (token === '-A' || token === '--user-agent') { + headers['User-Agent'] = readFlagValue(tokens, ++index, token); + continue; + } + if (token === '-e' || token === '--referer') { + headers.Referer = readFlagValue(tokens, ++index, token); + continue; + } + if (token.startsWith('-')) throw new Error(`Unsupported cURL option: ${token}`); + if (url) throw new Error('cURL command contains more than one URL'); + url = token; + } + + if (!url) throw new Error('cURL command does not contain a URL'); + let body = dataParts.length ? dataParts.join('&') : undefined; + if (useGet && body) { + const target = new URL(url); + target.search += `${target.search ? '&' : ''}${body}`; + url = target.toString(); + body = undefined; + } + return { url, method: method || (body ? 'POST' : 'GET'), headers, ...(body === undefined ? {} : { body }) }; +} + +function tokenizeCurl(command) { + if (!command) throw new Error('cURL command is empty'); + const normalized = command.replace(/\\\r?\n/g, ' '); + const tokens = []; + let current = ''; + let quote; + + for (let index = 0; index < normalized.length; index += 1) { + const character = normalized[index]; + if (quote) { + if (character === quote) quote = undefined; + else if (character === '\\' && quote === '"' && index + 1 < normalized.length) current += normalized[++index]; + else current += character; + continue; + } + if (character === "'" || character === '"') { + quote = character; + continue; + } + if ( + character === '|' || + character === ';' || + character === '<' || + character === '>' || + character === '`' || + (character === '$' && normalized[index + 1] === '(') + ) { + throw new Error('Shell operators are not supported'); + } + if (/\s/.test(character)) { + if (current) { + tokens.push(current); + current = ''; + } + continue; + } + if (character === '\\' && index + 1 < normalized.length) { + current += normalized[++index]; + continue; + } + current += character; + } + + if (quote) throw new Error('cURL command contains an unclosed quote'); + if (current) tokens.push(current); + return tokens; +} + +function readFlagValue(tokens, index, flag) { + const value = tokens[index]; + if (value === undefined) throw new Error(`${flag} requires a value`); + return value; +} + +function sanitizeRequestHeaders(headers) { + return Object.entries(headers ?? {}).reduce((safeHeaders, [name, value]) => { + const normalizedName = name.trim().toLowerCase(); + if (!normalizedName || BLOCKED_REQUEST_HEADERS.has(normalizedName)) return safeHeaders; + safeHeaders[normalizedName] = value; + return safeHeaders; + }, {}); +} + +function compareJson(devJson, qaJson, prodJson, ignoreFields, comparedEnvironments) { + const environments = [ + { key: 'devValue', active: comparedEnvironments.dev, root: devJson, values: comparedEnvironments.dev ? flatten(devJson) : {} }, + { key: 'qaValue', active: comparedEnvironments.qa, root: qaJson, values: comparedEnvironments.qa ? flatten(qaJson) : {} }, + { key: 'prodValue', active: comparedEnvironments.prod, root: prodJson, values: comparedEnvironments.prod ? flatten(prodJson) : {} }, + ].filter((environment) => environment.active); + + const paths = Array.from(new Set(environments.flatMap((environment) => Object.keys(environment.values)))).sort((left, right) => + left.localeCompare(right), + ); + + return paths.reduce((diffs, path) => { + if (isIgnoredPath(path, ignoreFields)) return diffs; + const values = environments.map((environment) => ({ + ...environment, + comparable: getComparableValue(environment.root, environment.values, path), + })); + const baseline = values[0].comparable; + const diffsByType = new Map(); + + values.slice(1).forEach(({ key, comparable }) => { + const type = getDiffType(baseline, comparable); + if (!type) return; + let diff = diffsByType.get(type); + if (!diff) { + diff = { path, type }; + if (baseline.found) diff[values[0].key] = baseline.value; + diffsByType.set(type, diff); + } + if (comparable.found) diff[key] = comparable.value; + }); + + diffs.push(...diffsByType.values()); + return diffs; + }, []); +} + +function flatten(value) { + const result = {}; + visit(value, '', result); + return result; +} + +function visit(value, path, result) { + if (Array.isArray(value)) { + if (value.length === 0) { + result[path] = value; + return; + } + value.forEach((item, index) => visit(item, `${path}[${index}]`, result)); + return; + } + if (value && typeof value === 'object') { + const entries = Object.entries(value); + if (entries.length === 0) { + result[path] = value; + return; + } + entries.forEach(([key, childValue]) => visit(childValue, path ? `${path}.${key}` : key, result)); + return; + } + result[path] = value; +} + +function getDiffType(baseline, target) { + if (!baseline.found && !target.found) return undefined; + if (!baseline.found) return 'ADDED'; + if (!target.found) return 'REMOVED'; + if (JSON.stringify(baseline.value) === JSON.stringify(target.value)) return undefined; + if (baseline.value === null || target.value === null) return 'CHANGED'; + return getJsonType(baseline.value) === getJsonType(target.value) ? 'CHANGED' : 'TYPE_CHANGE'; +} + +function getComparableValue(root, flattened, path) { + if (Object.prototype.hasOwnProperty.call(flattened, path)) { + return { found: true, value: flattened[path] }; + } + return getValueAtPath(root, path); +} + +function getValueAtPath(root, path) { + if (path === '') return { found: true, value: root }; + const segments = path.match(/[^.[\]]+/g); + if (!segments) return { found: false, value: undefined }; + let current = root; + + for (const segment of segments) { + if (current === null || typeof current !== 'object') return { found: false, value: undefined }; + if (Array.isArray(current)) { + const index = Number(segment); + if (!Number.isInteger(index) || index < 0 || index >= current.length) return { found: false, value: undefined }; + current = current[index]; + } else { + if (!Object.prototype.hasOwnProperty.call(current, segment)) return { found: false, value: undefined }; + current = current[segment]; + } + } + return { found: true, value: current }; +} + +function isIgnoredPath(path, ignoreFields) { + if (!ignoreFields.length) return false; + const segments = path.split(/[.[\]]+/).filter(Boolean); + return segments.some((segment) => ignoreFields.includes(segment)); +} + +function getJsonType(value) { + if (value === null) return 'null'; + if (Array.isArray(value)) return 'array'; + return typeof value; +} + +function generateSuggestions() { + if (!state.diffs.length) { + showStatus('Compare responses before generating ignore rules.'); + return; + } + state.suggestions = generateIgnoreSuggestions(state.diffs); + if (!state.suggestions.length) showStatus('No volatile ignore rules detected.'); + renderSuggestions(); +} + +function generateIgnoreSuggestions(diffs) { + const changedDiffs = diffs.filter((diff) => diff.type === 'CHANGED'); + const pathFrequencies = countNormalizedPaths(changedDiffs); + const suggestions = new Map(); + + changedDiffs.forEach((diff) => { + const normalizedPath = normalizeArrayPath(diff.path); + const reasons = []; + let score = 0; + const nameResult = scoreFieldName(diff.path); + score += nameResult.score; + if (nameResult.reason) reasons.push(nameResult.reason); + const valueResult = scoreValues([diff.devValue, diff.qaValue, diff.prodValue]); + score += valueResult.score; + if (valueResult.reason) reasons.push(valueResult.reason); + if (looksLikeNoisyPath(diff.path)) { + score += 20; + reasons.push('path belongs to a noisy metadata area'); + } + const frequency = pathFrequencies.get(normalizedPath) ?? 0; + if (frequency >= 10) { + score += 30; + reasons.push('field changes repeatedly across 10 or more array items'); + } else if (frequency >= 3) { + score += 20; + reasons.push('field changes repeatedly across array items'); + } else if (frequency >= 2) { + score += 10; + reasons.push('field changes repeatedly across array items'); + } + if (score < SUGGESTION_THRESHOLD) return; + const suggestion = { path: normalizedPath, score, confidence: getConfidence(score), reason: reasons.join(', ') }; + const existing = suggestions.get(normalizedPath); + if (!existing || suggestion.score > existing.score) suggestions.set(normalizedPath, suggestion); + }); + + return Array.from(suggestions.values()).sort((left, right) => right.score - left.score || left.path.localeCompare(right.path)); +} + +function countNormalizedPaths(diffs) { + return Array.from(new Set(diffs.map((diff) => diff.path))).reduce((frequencies, diffPath) => { + const path = normalizeArrayPath(diffPath); + frequencies.set(path, (frequencies.get(path) ?? 0) + 1); + return frequencies; + }, new Map()); +} + +function scoreFieldName(path) { + const leaf = getIgnoreFieldFromPath(path); + if (!leaf) return { score: 0 }; + if (STRONG_VOLATILE_NAME_PATTERNS.some((pattern) => pattern.test(leaf))) return { score: 50, reason: 'field name looks dynamic' }; + if (TEMPORAL_NAME_PATTERN.test(leaf)) return { score: 25, reason: 'field name looks time-based' }; + if (WEAK_IDENTIFIER_NAME_PATTERN.test(leaf)) return { score: 20, reason: 'field name looks like a generated identifier' }; + return { score: 0 }; +} + +function scoreValues(values) { + return values.map(scoreValue).sort((left, right) => right.score - left.score)[0]; +} + +function scoreValue(value) { + const text = typeof value === 'number' ? String(value) : value; + if (typeof text !== 'string') return { score: 0 }; + if (UUID_PATTERN.test(text)) return { score: 40, reason: 'value looks like a UUID' }; + if (ISO_DATETIME_PATTERN.test(text)) return { score: 40, reason: 'value looks time-based' }; + if (EPOCH_PATTERN.test(text)) return { score: 35, reason: 'value looks like an epoch timestamp' }; + if (PREFIXED_IDENTIFIER_PATTERN.test(text)) return { score: 30, reason: 'value looks like a generated identifier' }; + if (TOKEN_PATTERN.test(text)) return { score: 30, reason: 'value looks like a generated token' }; + return { score: 0 }; +} + +function normalizeArrayPath(path) { + return path.replace(/\[\d+\]/g, '[*]'); +} + +function getIgnoreFieldFromPath(path) { + const segments = path.match(/[^.[\]]+/g); + const leaf = segments?.at(-1); + return leaf && leaf !== '*' && !/^\d+$/.test(leaf) ? leaf : undefined; +} + +function looksLikeNoisyPath(path) { + const segments = path.toLowerCase().split(/[.[\]]+/).filter(Boolean); + return segments.some((segment) => NOISY_PATH_SEGMENTS.has(segment)); +} + +function getConfidence(score) { + if (score >= 80) return 'High'; + if (score >= SUGGESTION_THRESHOLD) return 'Medium'; + return 'Low'; +} + +function render() { + updateCounts(); + renderModeAndView(); + renderTable(); + renderTrees(); + renderSuggestions(); + elements.contractAlert.classList.toggle('hidden', !state.diffs.some((diff) => ['ADDED', 'REMOVED', 'TYPE_CHANGE'].includes(diff.type))); +} + +function renderModeAndView() { + document.querySelectorAll('.count').forEach((button) => { + button.classList.toggle('active', button.dataset.filter === state.filter); + }); + document.querySelectorAll('.view-button').forEach((button) => { + button.classList.toggle('active', button.dataset.view === state.view); + }); + elements.tableView.classList.toggle('hidden', state.view !== 'table'); + elements.treeView.classList.toggle('hidden', state.view !== 'tree'); +} + +function renderTable() { + const visibleDiffs = getVisibleDiffs(); + if (!visibleDiffs.length) { + const row = document.createElement('tr'); + const cell = document.createElement('td'); + cell.colSpan = 5; + cell.className = 'empty'; + cell.textContent = state.diffs.length ? 'No matching differences.' : 'No comparison yet.'; + row.append(cell); + elements.diffTable.replaceChildren(row); + return; + } + elements.diffTable.replaceChildren(...visibleDiffs.map(createDiffRow)); +} + +function createDiffRow(diff) { + const row = document.createElement('tr'); + const pathCell = document.createElement('td'); + pathCell.textContent = diff.path || '(root)'; + + const typeCell = document.createElement('td'); + const badge = document.createElement('span'); + badge.className = `badge ${diff.type}`; + badge.textContent = diff.type; + typeCell.append(badge); + + row.append( + pathCell, + createValueCell(diff.devValue), + createValueCell(diff.qaValue), + createValueCell(diff.prodValue), + ); + row.insertBefore(typeCell, row.children[1]); + return row; +} + +function createValueCell(value) { + const cell = document.createElement('td'); + cell.textContent = formatValue(value); + return cell; +} + +function renderTrees() { + ENVIRONMENTS.forEach(({ id }) => { + const value = state.active[id] ? state.compared[id] : undefined; + if (value === undefined) { + const empty = document.createElement('div'); + empty.className = 'empty'; + empty.textContent = 'No active input.'; + elements[`${id}Tree`].replaceChildren(empty); + return; + } + elements[`${id}Tree`].replaceChildren(renderTreeNode(value, id, '', '(root)', true)); + }); +} + +function renderTreeNode(value, environmentId, path, label, isRoot = false) { + const diff = selectTreeDiff(path, environmentId); + const className = diff ? diff.type : ''; + const node = document.createElement('div'); + node.className = ['tree-node', isRoot ? 'root' : '', className].filter(Boolean).join(' '); + + if (Array.isArray(value)) { + node.append(createTreeLine(label, `Array(${value.length})`)); + if (value.length) { + node.append(...value.map((item, index) => renderTreeNode(item, environmentId, `${path}[${index}]`, `[${index}]`))); + } else { + node.append(createTreeLeaf('[]')); + } + return node; + } + if (value && typeof value === 'object') { + const entries = Object.entries(value); + node.append(createTreeLine(label, 'Object')); + if (entries.length) { + node.append(...entries.map(([key, childValue]) => renderTreeNode(childValue, environmentId, path ? `${path}.${key}` : key, key))); + } else { + node.append(createTreeLeaf('{}')); + } + return node; + } + node.append(createTreeLine(label, formatValue(value))); + return node; +} + +function createTreeLine(label, value) { + const line = document.createElement('div'); + line.className = 'tree-line'; + const key = document.createElement('span'); + key.className = 'tree-key'; + key.textContent = label; + const text = document.createElement('span'); + text.className = 'tree-value'; + text.textContent = value; + line.append(key, text); + return line; +} + +function createTreeLeaf(value) { + const node = document.createElement('div'); + node.className = 'tree-node'; + const line = document.createElement('div'); + line.className = 'tree-line'; + const text = document.createElement('span'); + text.className = 'tree-value'; + text.textContent = value; + line.append(text); + node.append(line); + return node; +} + +function selectTreeDiff(path, environmentId) { + const key = `${environmentId}Value`; + return state.diffs.find((diff) => diff.path === path && Object.prototype.hasOwnProperty.call(diff, key)); +} + +function renderSuggestions() { + elements.suggestions.classList.toggle('hidden', !state.suggestions.length); + elements.suggestions.replaceChildren(...state.suggestions.map(createSuggestionRow)); +} + +function createSuggestionRow(suggestion) { + const leaf = getIgnoreFieldFromPath(suggestion.path) ?? suggestion.path; + const row = document.createElement('div'); + row.className = 'suggestion'; + const copy = document.createElement('div'); + const path = document.createElement('strong'); + path.textContent = suggestion.path; + const detail = document.createElement('small'); + detail.textContent = `${suggestion.confidence} · ${suggestion.score} · ${suggestion.reason}`; + copy.append(path, document.createElement('br'), detail); + + const button = document.createElement('button'); + button.className = 'secondary'; + button.type = 'button'; + button.textContent = 'Ignore'; + button.addEventListener('click', () => addIgnoreField(leaf)); + + row.append(copy, button); + return row; +} + +function addIgnoreField(field) { + const fields = new Set(getIgnoreFields()); + fields.add(field); + elements.ignoreFields.value = Array.from(fields).join(', '); + persistDraft(); + showStatus(`Added ${field} to ignored fields. Compare again to apply it.`); +} + +function updateCounts() { + elements.countAll.textContent = String(state.diffs.length); + elements.countAdded.textContent = String(countType('ADDED')); + elements.countRemoved.textContent = String(countType('REMOVED')); + elements.countChanged.textContent = String(countType('CHANGED')); + elements.countType.textContent = String(countType('TYPE_CHANGE')); +} + +function getVisibleDiffs() { + const query = elements.pathSearch.value.trim().toLowerCase(); + return state.diffs.filter((diff) => { + const matchesFilter = state.filter === 'ALL' || diff.type === state.filter; + const matchesSearch = !query || diff.path.toLowerCase().includes(query); + return matchesFilter && matchesSearch; + }); +} + +function countType(type) { + return state.diffs.filter((diff) => diff.type === type).length; +} + +function copyDiffs() { + navigator.clipboard.writeText(JSON.stringify(state.diffs, null, 2)); + showStatus('Copied diff JSON.'); +} + +function downloadJson() { + downloadBlob(new Blob([JSON.stringify(state.diffs, null, 2)], { type: 'application/json' }), 'api-diff.json'); +} + +function downloadExcel() { + const header = ['Path', 'Type', 'Dev', 'QA', 'Prod']; + const rows = state.diffs.map((diff) => [diff.path, diff.type, formatValue(diff.devValue), formatValue(diff.qaValue), formatValue(diff.prodValue)]); + const html = `${[header, ...rows] + .map((row) => `${row.map((cell) => ``).join('')}`) + .join('')}
${escapeHtml(cell)}
`; + downloadBlob(new Blob([html], { type: 'application/vnd.ms-excel' }), 'api-diff.xls'); +} + +function downloadBlob(blob, fileName) { + const url = URL.createObjectURL(blob); + const anchor = document.createElement('a'); + anchor.href = url; + anchor.download = fileName; + anchor.click(); + URL.revokeObjectURL(url); +} + +function clearSourceDerivedState() { + state.diffs = []; + state.suggestions = []; + state.filter = 'ALL'; + state.compared = { dev: undefined, qa: undefined, prod: undefined }; + state.active = { dev: false, qa: false, prod: false }; + render(); +} + +function resetAll() { + state.urlController?.abort(); + state.curlController?.abort(); + draftIds.forEach((id) => { + elements[id].value = ''; + }); + state.mode = 'json'; + state.view = 'table'; + state.theme = 'light'; + setMode('json'); + applyTheme(); + clearSourceDerivedState(); + clearStatus(); + extensionApi.storage.local.remove('draft'); +} + +function setLoading(kind, isLoading) { + const button = kind === 'url' ? elements.fetchButton : elements.curlButton; + button.disabled = isLoading; + button.textContent = isLoading ? 'Comparing...' : kind === 'url' ? 'Fetch & Compare' : 'Import cURL & Compare'; +} + +function getEnvironmentInputValues(suffix) { + return Object.fromEntries(ENVIRONMENTS.map(({ id }) => [id, elements[`${id}${suffix}`].value.trim()])); +} + +function getIgnoreFields() { + return elements.ignoreFields.value + .split(',') + .map((field) => field.trim()) + .filter(Boolean); +} + +function showStatus(message) { + elements.status.textContent = message; +} + +function clearStatus() { + showStatus(''); +} + +function formatValue(value) { + if (value === undefined) return '-'; + if (typeof value === 'string') return value; + return JSON.stringify(value); +} + +function escapeHtml(value) { + return String(value) + .replaceAll('&', '&') + .replaceAll('<', '<') + .replaceAll('>', '>') + .replaceAll('"', '"') + .replaceAll("'", '''); +} + +function isAbortError(error) { + return error instanceof DOMException && error.name === 'AbortError'; +} + +function persistDraft() { + const draft = Object.fromEntries(draftIds.map((id) => [id, elements[id].value])); + draft.mode = state.mode; + draft.view = state.view; + draft.theme = state.theme; + extensionApi.storage.local.set({ draft }); +} + +async function restoreDraft() { + const stored = await extensionApi.storage.local.get('draft'); + const draft = stored.draft ?? {}; + draftIds.forEach((id) => { + elements[id].value = draft[id] ?? ''; + }); + state.view = draft.view === 'tree' ? 'tree' : 'table'; + state.theme = draft.theme === 'dark' ? 'dark' : 'light'; + applyTheme(); + setMode(['json', 'url', 'curl'].includes(draft.mode) ? draft.mode : 'json'); +} diff --git a/browser-extension/safari/web-extension/store-listing.md b/browser-extension/safari/web-extension/store-listing.md new file mode 100644 index 0000000..e593fcc --- /dev/null +++ b/browser-extension/safari/web-extension/store-listing.md @@ -0,0 +1,106 @@ +# Safari App Store Listing Draft + +## Product Details + +Name: +API Response Comparator + +Subtitle: +Compare Dev, QA, and Prod JSON APIs. + +Promotional text: +Compare JSON API responses from pasted JSON, uploaded files, HTTPS URLs, or safe cURL imports directly in Safari. + +Description: +API Response Comparator helps developers and QA teams spot API response drift before it reaches users. Paste JSON, upload response files, fetch HTTPS API URLs, or import safe cURL commands, then compare Dev, QA, and Prod responses from a compact Safari Web Extension popup. + +The first populated environment in Dev, QA, Prod order becomes the baseline. The extension flattens nested JSON paths and reports `ADDED`, `REMOVED`, `CHANGED`, and `TYPE_CHANGE` differences. Any two environments are enough, so you can compare Dev vs QA, QA vs Prod, or all three together. + +Features: +- Manual JSON paste, format, upload, and clear controls +- Direct HTTPS URL fetch comparison +- Safe cURL parsing with structured browser fetch execution +- Optional third environment +- Ignore leaf fields and generate volatility-based ignore suggestions +- Separate rows when one path has different outcome types +- Contract-change alert for added, removed, or type-changed fields +- Count filters and path search +- Table and color-coded JSON tree views +- Copy, JSON download, and Excel-compatible export +- Full reset with in-flight request cancellation +- Light and dark themes + +The extension runs locally in Safari. It does not use analytics, ads, tracking, +or a remote app backend. + +Primary category: +Developer Tools + +Language: +English + +## Graphic Assets + +Extension package icons: +- `assets/icons/icon-16.png` +- `assets/icons/icon-32.png` +- `assets/icons/icon-48.png` +- `assets/icons/icon-128.png` + +Listing/source assets: +- `assets/store/store-icon-128.png` +- `assets/store/screenshot-1-json-compare-1280x800.png` +- `assets/store/screenshot-2-url-curl-1280x800.png` +- `assets/store/screenshot-3-tree-view-1280x800.png` +- `assets/store/small-promo-440x280.png` +- `assets/store/marquee-promo-1400x560.png` + +App Store screenshots and app icons may need to be regenerated at Apple-specific +sizes from these source assets after the Xcode project is created. + +## Privacy Practices + +Single purpose: +Compare JSON API responses across Dev, QA, and Prod so developers can identify +response value changes and API contract changes. + +Permission justification: + +`storage`: +Stores draft inputs and UI preferences locally in Safari extension storage so +users do not lose in-progress comparisons when the popup closes. + +`clipboardWrite`: +Lets the user copy generated diff JSON to the clipboard after clicking the Copy +button. + +`https://*/*` host permission: +Allows the extension to fetch user-entered HTTPS API URLs and HTTPS cURL targets +for comparison. The extension only sends requests when the user clicks Fetch & +Compare or Import cURL & Compare. + +Data collection disclosure: +The extension does not collect, sell, share, or transmit user data to the +developer or third-party analytics services. JSON payloads, URLs, cURL commands, +ignore fields, and UI preferences remain in the browser except when the user +explicitly fetches a user-entered HTTPS API endpoint. + +Privacy policy summary: +API Response Comparator stores draft comparison inputs locally in the browser and +sends network requests only to HTTPS API endpoints the user provides. It does not +collect analytics, sell data, share data with the developer, or transmit +comparison data to a separate backend. + +## Test Instructions + +1. Convert this source folder with Xcode's Safari Web Extension Converter. +2. Run the containing app and enable the extension in Safari. +3. Open the extension popup. +4. In JSON mode, paste two JSON objects into Dev and QA, then click Compare. +5. Verify that the table reports changed paths and that Tree view highlights the + changed values. +6. In URL mode, enter two HTTPS endpoints that return JSON and click Fetch & + Compare. +7. In cURL mode, paste two HTTPS cURL commands and click Import cURL & Compare. +8. Verify Copy, JSON export, Excel export, ignore fields, path search, theme + toggle, and Reset. From 27389274ab41eac9880e57f4f592524686ac80b4 Mon Sep 17 00:00:00 2001 From: Arnab Nandy Date: Mon, 29 Jun 2026 00:03:40 +0530 Subject: [PATCH 5/5] Added privacy policy --- PRIVACY.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 PRIVACY.md diff --git a/PRIVACY.md b/PRIVACY.md new file mode 100644 index 0000000..0244e91 --- /dev/null +++ b/PRIVACY.md @@ -0,0 +1,24 @@ +# Privacy Policy + +API Response Comparator does not collect, sell, share, or transmit user data to +the developer or third-party analytics services. + +The browser extensions store draft comparison inputs and UI preferences locally +in the browser using extension storage. This may include pasted JSON, uploaded +JSON file contents, API URLs, cURL commands, ignore fields, path search text, +selected input mode, selected result view, and theme preference. + +The extensions send network requests only when the user explicitly provides +HTTPS API URLs or HTTPS cURL commands and clicks the compare action. Those +requests are sent directly from the browser to the user-provided endpoints for +the purpose of comparing API responses. + +The extensions do not include analytics, advertising, tracking, remote logging, +account creation, or a separate backend service. + +The web application version uses its server-side proxy only when the user +explicitly requests URL or cURL comparison through the app. The proxy validates +requests for safety and does not store comparison payloads. + +If you have privacy questions or support requests, open an issue at: +https://github.com/arnabnandy7/api-response-comparator/issues